
Drupal 11.4.8 – Hoch – Remote – XSS – Move Block: Geschwister-Labels überspringen die @label-Escaping
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · drupal-move-block-markup
Klasse: Stored XSS Reichweite: Remote
Drupal core 11.4.8 (61044508) - Drupal
SA-CORE-2026-012 hat die aktuelle Move-Block-Zeile auf t('@label (current)') umgestellt, was Html::escape() verwendet. Benachbarte Zeilen in derselben Region weisen weiterhin BlockPluginTrait::label() direkt #markup in MoveBlockForm zu. Dieses Label ist configuration['label'], ein rohes Textfeld. Renderer::ensureMarkupIsSafe filtert dann einen String mit der Admin-Tag-Liste auf XSS, sodass ein <b> (und andere Admin-Tags) überlebt.
Ein Layout-Builder-Editor, der einen Blocktitel auf HTML setzen kann, erreicht einen anderen Editor oder Admin, der Move auf einem anderen Block in dieser Region öffnet. Stored XSS im Move-Dialog. Kein RCE und kein LPE.
| ID | noch keine CVE |
| Klasse | Stored XSS |
| Reichweite | Remote (Layout Builder Block konfigurieren; Opfer öffnet 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 |
| Produkt | Drupal core |
| Betroffen | 11.4.8 (61044508071749629aaf3380aa85971e94df9e84) |
| Auth | Layout Builder Block konfigurieren. Opfer öffnet Move Block. |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1 |
Schreiber: Benutzer, der Layout-Builder-Blöcke platzieren oder konfigurieren kann (nicht Site-Konfiguration). Opfer: ein anderer LB-Editor oder Admin, der Move auf einem anderen Block in derselben Region öffnet.
| Privileg | Methode / Sink | Art | Lab-bewiesen oder abgeleitet |
|---|---|---|---|
| Angreifer-HTML im Move-Dialog in der benachbarten Zeile ausgeben | $label['#markup'] = $plugin->label(); dann ensureMarkupIsSafe | Integrität von HTML | Lab-bewiesen. Benachbartes HTML ist <b class="lb-sib">DRUPAL-MOVE-BLOCK-MARKUP-WITNESS</b> |
Admin-Tag-Markup beibehalten (<b> und der Rest von Xss::getAdminTagList) | String #markup wird mit der Admin-Liste XSS-gefiltert, nicht escaped | Integrität von HTML | Lab-bewiesen für <b> |
| Session / Aktionen als der Opfer-Editor im Layout-Builder-Ursprung | Stored XSS in diesem Dialog | Integrität der Opfer-Session | Abgeleitet. Lab endet bei rohem HTML in der benachbarten Zelle |
| Negativ: aktuelle Zeile | t('@label (current)', ...) | Geschlossen | Lab-bewiesen. <em class="lb-cur">... |
Negativ: benachbart über @label | gepatchter Gadget-Pfad | Geschlossen | Lab-bewiesen. <b class="lb-sib">... |
Geschlossen bei diesem Überbleibsel: Installation einer Live-Drupal-Site (dieses Lab ist ein Gadget); Diebstahl der Layout-Builder-UI-Session als gemessenes HTTP-Orakel; RCE; LPE. Nicht authentifizierte Besucher können Move Block nicht öffnen.
Gleiches Pin-Überbleibsel: AttributeXss HTMX attrs.
Ich habe Drupal 11.4.8 nach SA-CORE-2026-012 gepinnt. Der Advisory hat den aktuellen Blocktitel geschlossen. MoveBlockForm.php 210-218:
if ($is_current_block) {
$label['#markup'] = $this->t('@label (current)', ['@label' => $plugin->label()]);
// ...
}
else {
$label['#markup'] = $plugin->label();
}
BlockPluginTrait::label() gibt configuration['label'] zurück, wenn gesetzt. Renderer::ensureMarkupIsSafe führt keine XSS-Filterung von MarkupInterface durch (@label ist bereits escaped). Ein roher String wird mit der Admin-Tag-Liste gefiltert.
Bereits dokumentierte Irrwege: die aktuelle Zeile als weiterhin roh zu behandeln (ist sie nicht); zu behaupten, dies sei RCE; eine Live-Drupal-Site als einziges Orakel (das Überbleibsel sind diese Funktionen); eine Reverse Shell. Theater.
python3 drupal-move-block-markup-Abraxas-Labs.py
oder
cd lab
./run.sh
Ziel nur http://127.0.0.1:19490. Getreues Gadget der 11.4.8-Funktionen (Kopie des MoveBlockForm-Überbleibsels, FormattableMarkup, ensureMarkupIsSafe, Xss::filter). Keine Live-drupal:11.4.8-Site. Letzte Zeile verwendet 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
Verwende @label (oder Html::escape) für jede Zeile, nicht nur für den aktuellen Block.
61044508071749629aaf3380aa85971e94df9e84)MoveBlockForm.php · BlockPluginTrait.phpGNU Affero GPL v3.0. Siehe LICENSE. Nur Loopback-Lab. Keine Gewährleistung.