
Drupal 11.4.8 - उच्च - रिमोट - XSS - Move Block सहोदर लेबल @label एस्केपिंग छोड़ते हैं
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · drupal-move-block-markup
Class: Stored XSS Reach: Remote
Drupal core 11.4.8 (61044508) - Drupal
SA-CORE-2026-012 ने current Move Block पंक्ति को t('@label (current)') में बदल दिया, जो Html::escape() करता है। उसी region में sibling पंक्तियाँ अभी भी BlockPluginTrait::label() को सीधे MoveBlockForm में #markup पर assign करती हैं। वह label configuration['label'] है, एक raw textfield। Renderer::ensureMarkupIsSafe फिर admin tag list के साथ एक string को XSS-filter करता है, इसलिए एक <b> (और अन्य admin tags) बच जाता है।
एक Layout Builder editor जो किसी block title को HTML पर सेट कर सकता है, उस region में किसी भिन्न block पर Move खोलने वाले किसी अन्य editor या admin तक पहुँचता है। Move dialog में Stored XSS। RCE नहीं और LPE नहीं।
| ID | अभी तक कोई CVE नहीं |
| Class | Stored XSS |
| Reach | Remote (Layout Builder block configure; victim opens Move Block) |
| CWE | CWE-79 |
| CVSS | Medium: 5.4 CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N |
| Product | Drupal core |
| Affected | 11.4.8 (61044508071749629aaf3380aa85971e94df9e84) |
| Auth | Layout Builder block configure. Victim opens Move Block. |
| License | GNU Affero GPL v3.0 |
| Lab | केवल 127.0.0.1 |
Writer: वह user जो Layout Builder blocks को रख या configure कर सकता है (site-config नहीं)। Victim: कोई अन्य LB editor या admin जो उसी region में किसी भिन्न block पर Move खोलता है।
| Privilege | Method / sink | Kind | Lab-proven or inferred |
|---|---|---|---|
| Move dialog sibling row में attacker HTML प्रिंट करना | $label['#markup'] = $plugin->label(); फिर ensureMarkupIsSafe | Integrity of HTML | Lab-proven। Sibling HTML <b class="lb-sib">DRUPAL-MOVE-BLOCK-MARKUP-WITNESS</b> है |
Admin-tag markup (<b>, और शेष Xss::getAdminTagList) बनाए रखना | string #markup को admin list के साथ XSS-filter किया जाता है, escape नहीं | Integrity of HTML | <b> के लिए Lab-proven |
| Layout Builder origin में victim editor के रूप में Session / actions | उस dialog में Stored XSS | Integrity of victim session | Inferred। Lab sibling cell में raw HTML पर रुक जाता है |
| Negative: current row | t('@label (current)', ...) | Closed | Lab-proven। <em class="lb-cur">... |
Negative: @label के माध्यम से sibling | patched gadget path | Closed | Lab-proven। <b class="lb-sib">... |
इस leftover पर बंद: live Drupal site install (यह lab एक gadget है); measured HTTP oracle के रूप में Layout Builder UI session theft; RCE; LPE। Unauthenticated visitors Move Block नहीं खोल सकते।
Same pin leftover: AttributeXss HTMX attrs।
मैंने SA-CORE-2026-012 के बाद Drupal 11.4.8 pin किया। Advisory ने current block title को बंद कर दिया। MoveBlockForm.php 210-218:
if ($is_current_block) {
$label['#markup'] = $this->t('@label (current)', ['@label' => $plugin->label()]);
// ...
}
else {
$label['#markup'] = $plugin->label();
}
BlockPluginTrait::label() set होने पर configuration['label'] लौटाता है। Renderer::ensureMarkupIsSafe MarkupInterface (@label पहले से escaped) को XSS-filter नहीं करता। एक raw string को admin tag list के साथ filter किया जाता है।
पहले से दर्ज गलत मोड़: current row को अभी भी raw मानना (यह नहीं है); इसे RCE बताना; एकमात्र oracle के रूप में live Drupal site (leftover ये functions हैं); एक reverse shell। Theatre।
python3 drupal-move-block-markup-Abraxas-Labs.py
या
cd lab
./run.sh
लक्ष्य केवल http://127.0.0.1:19490। 11.4.8 functions का faithful gadget (MoveBlockForm leftover की copy, FormattableMarkup, ensureMarkupIsSafe, Xss::filter)। live drupal:11.4.8 site नहीं। अंतिम पंक्ति 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
हर row के लिए @label (या Html::escape) का उपयोग करें, केवल current block के लिए नहीं।
61044508071749629aaf3380aa85971e94df9e84)MoveBlockForm.php · BlockPluginTrait.phpGNU Affero GPL v3.0। देखें LICENSE। केवल Loopback lab। कोई warranty नहीं।