
Drupal 11.4.8 - عالي - عن بُعد - XSS - نقل تسميات الكتل الشقيقة يتخطى تهريب @label
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · drupal-move-block-markup
الفئة: XSS مخزّن الوصول: عن بُعد
نواة Drupal 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.
| ID | لا يوجد 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 |
| المتأثر | 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 حي كالأوراكل الوحيد (البقايا هي هذه الدوال)؛ صدفة عكسية. مسرح.
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 فقط. لا ضمان.