
Drupal 11.4.8 - 高 - リモート - XSS - Move Block の兄弟ラベルが @label エスケープをスキップする
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · 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() を MoveBlockForm 内の #markup に直接代入している。このラベルは configuration['label']、つまり生のテキストフィールドである。その後 Renderer::ensureMarkupIsSafe が管理者タグリストで文字列を XSS フィルタリングするため、<b> (およびその他の管理者タグ) が生き残る。
ブロックタイトルを HTML に設定できる Layout Builder エディタは、そのリージョン内の別のブロックで Move を開く別のエディタまたは管理者に到達する。Move ダイアログにおける格納型 XSS。RCE でも LPE でもない。
| ID | CVE はまだなし |
| クラス | 格納型 XSS |
| 到達範囲 | リモート (Layout Builder ブロック設定。被害者が 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 |
| 製品 | Drupal core |
| 影響を受けるバージョン | 11.4.8 (61044508071749629aaf3380aa85971e94df9e84) |
| 認証 | Layout Builder ブロック設定。被害者が Move Block を開く。 |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ |
書き込み側: Layout Builder ブロックを配置または設定できるユーザー (サイト設定ではない)。被害者: 同じリージョン内の別のブロックで Move を開く別の LB エディタまたは管理者。
| 権限 | メソッド / シンク | 種類 | ラボ実証済みまたは推測 |
|---|---|---|---|
| Move ダイアログの兄弟行に攻撃者の HTML を出力 | $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 サイトインストール (このラボはガジェット); 測定された HTTP オラクルとしての Layout Builder UI セッション窃取; RCE; LPE。未認証の訪問者は Move Block を開けない。
同じピンの残存: AttributeXss HTMX attrs。
SA-CORE-2026-012 の後、Drupal 11.4.8 をピン留めした。アドバイザリは現在のブロックタイトルをクローズした。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 は MarkupInterface を XSS フィルタリングしない (@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 を参照。ループバックラボのみ。保証なし。