
مختبر قائم على Docker لإعادة إنتاج والتحقق من CVE-2026-56011، وهي ثغرة XSS غير مصادق عليها في MapPress Maps لـ WordPress، مع أهداف مقارنة ضعيفة ومصححة.
يحتوي هذا المستودع على معمل Docker محلي لإعادة إنتاج والتحقق من CVE-2026-56011، وهي ثغرة برمجة نصية عبر المواقع (Cross-Site Scripting) غير مصادق عليها تؤثر على MapPress Maps for WordPress.
MapPress Maps for WordPress عبارة عن إضافة ووردبريس تُستخدم لعرض الخرائط داخل صفحات ومقالات ووردبريس. يؤثر السلوك المعرَّض للثغرة على مسار عرض الخرائط عبر iframe الذي يمكن الوصول إليه من خلال معامل الطلب mappress=embed.
يقارن هذا المعمل بين نسختين من MapPress:
| الخدمة | إصدار MapPress | الغرض | URL |
|---|---|---|---|
| vuln | 2.97.3 | هدف المقارنة المعرَّض للثغرة | http://localhost:8081 |
| patched | 2.97.4 | هدف المقارنة المُصحَّح | http://localhost:8082 |
مسار التحقق المعروض في هذا المعمل المحلي هو:```text Unauthenticated browser request → GET /?mappress=embed → request supplies a crafted name value → vulnerable target renders name into an unquoted id attribute → injected onclick handler becomes a standalone HTML attribute → clicking the rendered MapPress component triggers alert(1) → patched target keeps the payload inside a quoted and escaped id attribute → clicking the rendered component does not trigger alert(1)
الهدف المعرض للخطر يستخدم عنوان URL هذا للمتصفح اليدوي:```text
http://localhost:8081/?mappress=embed&name=cve56011%20onclick%3Dalert%281%29&width=400px&height=300px&zoom=5¢er=0%2C0
النتيجة المتوقعة للثغرة:```text Click on the rendered MapPress component → alert(1) pops up
الهدف المُرقَّع يستخدم نفس الحمولة ضد MapPress 2.97.4:```text
http://localhost:8082/?mappress=embed&name=cve56011%20onclick%3Dalert%281%29&width=400px&height=300px&zoom=5¢er=0%2C0
النتيجة المتوقعة بعد التصحيح:```text Click on the rendered MapPress component → no alert appears
يعتمد هذا المختبر عمدًا على التحقق اليدوي عبر المتصفح فقط. ولا يتضمن سكربت إثبات المفهوم (PoC)، أو أتمتة المتصفح، أو سرقة بيانات الاعتماد، أو استدعاءات خارجية، أو برمجيات خبيثة، أو ثباتًا، أو نشاط ما بعد الاستغلال، أو هجمات ضد أنظمة خارجية.
## الحقائق المؤكدة
| الادعاء | الدليل | كيفية التحقق في هذا المختبر |
| -------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------- |
| CVE-2026-56011 يؤثر على MapPress Maps for WordPress. | تحدد نشرات الثغرات الأمنية البرنامج الإضافي المتأثر في ووردبريس على أنه MapPress Maps for WordPress. | راجع قسم المراجع وافحص البرنامج الإضافي المثبت في كلا هدفَي Docker. |
| إصدار المقارنة المعرَّض للثغرة في هذا المختبر هو MapPress 2.97.3. | تبني خدمة `vuln` البرنامج الإضافي باستخدام `MAPPRESS_VERSION: 2.97.3`. | افحص `docker-compose.yml` و `vuln/Dockerfile`. |
| إصدار المقارنة المصحَّح في هذا المختبر هو MapPress 2.97.4. | تبني خدمة `patched` البرنامج الإضافي باستخدام `MAPPRESS_VERSION: 2.97.4`. | افحص `docker-compose.yml` و `patched/Dockerfile`. |
| أدخل الإصدار 2.97.4 من MapPress إصلاح escape المتعلق بـ iframe. | ينص سجل تغييرات البرنامج الإضافي الرسمي للإصدار 2.97.4 على `Added: escape in iframe`. | راجع سجل تغييرات البرنامج الإضافي الرسمي في ووردبريس وقارن بين المصدر المعرَّض والمصحَّح. |
| يولّد المصدر المعرَّض اسم الخريطة داخل سمة `id` لمكوّن الويب دون علامات اقتباس. | في 2.97.3، يولّد `mappress_map.php` العنصر `<mappress-map id={$name} ...>`. | قارن مصدر الإصدار 2.97.3 بمصدر الإصدار 2.97.4. |
| يضع المصدر المصحَّح قيمة `id` بين علامتي اقتباس وينفّذ عليها escape. | في 2.97.4، يولّد `mappress_map.php` القيمة `id="` باستخدام `esc_attr($name)`. | قارن فرق التصحيح بين الإصدارين 2.97.3 و2.97.4. |
| يمكن الوصول إلى مسار iframe دون مصادقة. | يسجّل MapPress خطاف `template_redirect` عندما يكون `$_GET['mappress']` موجودًا. | أرسل طلبًا إلى `/?mappress=embed...` من متصفح دون تسجيل الدخول. |
| يقرأ مسار iframe سمات الخريطة من الطلب. | تحوّل الدالة `template_redirect()` محتوى `$_GET` إلى وسائط خريطة وتستدعي عارض iframe. | افحص `mappress.php` وأعد إنتاج عنوان URL اليدوي. |
| يسمح الهدف المعرَّض للثغرة بحقن السمات عبر `name`. | يمكن لقيمة الاسم المُصمَّمة أن تخرج من سمة `id` غير المقتبسة وتصبح `onclick=alert(1)`. | افتح عنوان URL اليدوي المعرَّض وانقر على مكوّن MapPress المعروض. |
| يمنع الهدف المصحَّح سلوك حقن السمات موضع الاختبار. | يحتفظ مخرَج الإصدار المصحَّح بالحمولة كاملة داخل سمة `id` المقتبسة. | افتح عنوان URL اليدوي المصحَّح وانقر على مكوّن MapPress المعروض. |
## الافتراضات والمجهولات
يستخدم هذا المختبر إصدار MapPress 2.97.3 كهدف مقارنة معرَّض للثغرة لأن النشرات الأمنية العامة تحدد الإصدارات حتى 2.97.3 ضمن المتأثرة، ويُظهر فرق الكود المصدري أن العرض غير المقتبس للسمة في ذلك الإصدار معرَّض للثغرة.
يستخدم هذا المختبر إصدار MapPress 2.97.4 كهدف مقارنة مصحَّح لأن النشرات الأمنية العامة تحدد 2.97.4 كإصدار مُصلَح، ويذكر سجل التغييرات الرسمي أن escape أُضيف في مسار iframe.
السلوك المعرَّض للثغرة موضع الاختبار هو مسار عرض iframe دون مصادقة:```text
GET /?mappress=embed&name=<crafted-value>
يركز هذا المختبر على التنفيذ اليدوي في المتصفح لحمولة تنبيه غير ضارة:```text name=cve56011 onclick=alert(1)
لا يحاول المختبر إثبات سلسلة توصيل مخزّنة. تُصنّف بعض النشرات الأمنية العامة الثغرة على أنها XSS مخزّنة. يركز هذا المستودع على مستقبِل عرض iframe المؤكد من المصدر وعلى السلوك القابل للاستغلال مقابل المُصحَّح الذي يمكن إعادة إنتاجه محليًا عبر مسار `mappress=embed` غير المصادق عليه.
لا يوضح المختبر:
* استمرارية الحمولة المخزّنة،
* اختراق حساب ووردبريس،
* سرقة جلسة المسؤول،
* سرقة nonce،
* استدعاءات خارجية،
* جمع XSS أعمى،
* سرقة بيانات الاعتماد،
* تفريغ قاعدة البيانات،
* برمجيات خبيثة،
* استمرارية،
* أو هجمات ضد أنظمة غير تابعة للمختبر.
يثبت التحقق اليدوي عبر المتصفح اختلاف العرض المرتبط بالأمان:```text
MapPress 2.97.3:
crafted name value becomes executable onclick attribute
MapPress 2.97.4:
crafted name value remains inside the quoted id attribute
السبب الجذري لـ CVE-2026-56011 هو ترميز إخراج غير صحيح لقيمة name الخاصة بالخريطة عندما يعرض MapPress مكوّن ويب داخل مسار إخراج خريطة iframe.
مسار الكود المعرّض للخطر يقبل سمات تقديم الخريطة من الطلب ويعرض في النهاية عنصر HTML مخصصًا:```html <mappress-map ...>
في MapPress 2.97.3، يتم إدراج اسم الخريطة مباشرةً في سمة `id` بدون علامات اقتباس وبدون تهريب سياق السمة:```php
return "<div></div>\r\n<mappress-map id={$name} {$atts}>\r\n$pois\r\n</mappress-map>\r\n";
هذا غير آمن لأن القيمة تُستخدم في سياق سمة HTML. إذا كان المهاجم يتحكم في name، فإن قيمة تحتوي على مسافة يمكن أن تُنهي قيمة id المقصودة وتُدخل سمة جديدة.
يمكن تلخيص السلوك القابل للاستغلال على النحو التالي:```text Attacker sends unauthenticated iframe request → name = cve56011 onclick=alert(1) → MapPress sanitizes the value as text → sanitized text is still unsafe for an unquoted HTML attribute → renderer outputs id=cve56011 onclick=alert(1) → onclick becomes a standalone event handler attribute → user clicks the rendered component → JavaScript executes
النقطة المهمة هي أن تعقيم النص العام ليس هو نفسه الهروب الصحيح للمخرجات.
يستخدم الكود الضعيف `sanitize_text_field()` على اسم الخريطة، لكن ذلك لا يجعل القيمة آمنة لخاصية HTML غير مقتبسة. تظل المسافات ذات معنى في خصائص HTML لأنها تفصل خاصية عن أخرى.