
Drupal 11.4.8 - عالي - عن بُعد - XSS - نقل تسميات الكتل الشقيقة يتخطى تهريب @label
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · drupal-move-block-markup
المقال: https://abraxaslabs.tech/research/drupal-move-block-markup
الفئة: XSS مخزّن الوصول: عن بُعد
Drupal core 11.4.8 (61044508) - Drupal
SA-CORE-2026-012 غيّر صف Move Block الحالي إلى t('@label (current)')، وهو ما يمرّره Html::escape(). أما الصفوف الشقيقة في المنطقة نفسها فلا تزال تُسنِد BlockPluginTrait::label() مباشرةً إلى #markup في MoveBlockForm. ذلك التسمية هي configuration['label']، أي حقل نصي خام. بعد ذلك يقوم Renderer::ensureMarkupIsSafe بترشيح السلسلة ضد XSS باستخدام قائمة وسوم المسؤولين، لذا يبقى <b> (وغيره من وسوم المسؤولين) على قيد الحياة.
محرّر Layout Builder يستطيع تعيين عنوان كتلة إلى HTML يصل إلى محرّر آخر أو مسؤول يفتح Move على كتلة مختلفة في تلك المنطقة. XSS مخزّن في نافذة Move. ليس RCE وليس LPE.
| المعرّف | لا يوجد CVE بعد |
| الفئة | XSS مخزّن |
| الوصول | عن بُعد (إعداد كتلة Layout Builder؛ الضحية يفتح Move Block) |
| CWE | CWE-79 |
| CVSS | متوسط: 5.4 CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N |
| المنتج | Drupal core |
| المتأثر | 11.4.8 (61044508071749629aaf3380aa85971e94df9e84) |
| المصادقة | إعداد كتلة Layout Builder. الضحية يفتح Move Block. |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط |
الكاتب: مستخدم يستطيع وضع أو إعداد كتل Layout Builder (وليس إعداد الموقع). الضحية: محرّر LB آخر أو مسؤول يفتح Move على كتلة مختلفة في المنطقة نفسها.
| الصلاحية | الطريقة / نقطة الوصول | النوع | مُثبت مختبريًا أو مُستنتج |
|---|---|---|---|
| طباعة HTML المهاجم في الصف الشقيق لنافذة Move | $label['#markup'] = $plugin->label(); ثم ensureMarkupIsSafe | سلامة HTML | مُثبت مختبريًا. HTML الشقيق هو <b class="lb-sib">DRUPAL-MOVE-BLOCK-MARKUP-WITNESS</b> |
الإبقاء على وسوم المسؤولين (<b>، وبقية Xss::getAdminTagList) | سلسلة #markup تُرشَّح ضد XSS بقائمة المسؤولين، لا تُهرَّب | سلامة HTML | مُثبت مختبريًا لـ <b> |
| الجلسة / الإجراءات بصفة محرّر الضحية في أصل Layout Builder | XSS مخزّن في تلك النافذة | سلامة جلسة الضحية | مُستنتج. يتوقف المختبر عند HTML الخام في الخلية الشقيقة |
| سلبي: الصف الحالي | t('@label (current)', ...) | مغلق | مُثبت مختبريًا. <em class="lb-cur">... |
سلبي: الشقيق عبر @label | مسار الأداة المُرقَّع | مغلق | مُثبت مختبريًا. <b class="lb-sib">... |
مغلق بشأن هذه البقايا: تثبيت موقع Drupal حيّ (هذا المختبر أداة)؛ سرقة جلسة واجهة Layout Builder كأوراكل HTTP مقيس؛ RCE؛ LPE. لا يستطيع الزوار غير المصادَق عليهم فتح Move Block.
بقايا التثبيت نفسها: AttributeXss HTMX attrs.
ثبّتت Drupal 11.4.8 بعد SA-CORE-2026-012. أغلق الاستشاري عنوان الكتلة الحالي. MoveBlockForm.php 210-218:
if ($is_current_block) {
$label['#markup'] = $this->t('@label (current)', ['@label' => $plugin->label()]);
// ...
}
else {
$label['#markup'] = $plugin->label();
}
BlockPluginTrait::label() يعيد configuration['label'] عند تعيينه. لا يقوم Renderer::ensureMarkupIsSafe بتصفية XSS لـ MarkupInterface (@label مُهرَّب بالفعل). تُصفّى السلسلة الخام باستخدام قائمة وسوم المسؤول.
المنعطفات الخاطئة المسجّلة بالفعل: التعامل مع الصف الحالي على أنه لا يزال خامًا (وهو ليس كذلك)؛ الادعاء بأن هذا RCE؛ موقع Drupal حي كأوراكل وحيد (المتبقي هو هذه الدوال)؛ reverse shell. مسرح.
python3 drupal-move-block-markup-Abraxas-Labs.py
أو
cd lab
./run.sh
استهدف فقط http://127.0.0.1:19490. أداة مطابقة لوظائف 11.4.8 (نسخة من بقايا MoveBlockForm، وFormattableMarkup، وensureMarkupIsSafe، وXss::filter). ليست موقع drupal:11.4.8 حيًّا. يستخدم السطر الأخير how=gadget.
SUCCESS drupal-move-block-markup how=gadget sibling-raw-tag=yes current-escaped=yes patched-sibling-escaped=yes DRUPAL-MOVE-BLOCK-MARKUP-WITNESS
استخدم @label (أو Html::escape) لكل صف، وليس للكتلة الحالية فقط.
61044508071749629aaf3380aa85971e94df9e84)MoveBlockForm.php · BlockPluginTrait.phpGNU Affero GPL v3.0. راجع LICENSE. مختبر loopback فقط. دون أي ضمان.