
Drupal 11.4.8 - 高 - リモート - XSS - AttributeXss は依然として HTMX 属性を許可する
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · drupal-htmx-attr
解説記事: https://abraxaslabs.tech/research/drupal-htmx-attr
クラス: 蓄積型XSS 到達範囲: リモート
Drupal core 11.4.8 (61044508) - Drupal
SA-CORE-2026-011 は Xss::attributes() 内のHTMX属性を塞いだ。リンクおよびメニューの属性は AttributeXss::sanitizeAttributes を経由するが、このスキップリストは依然として style と on* のみを除外している。
Linkフィールド(またはメニューリンク)を設定できるコンテンツ編集者は、hx-on-click や data-hx-on-click を保存できる。StandardとBigPipeは core/htmx を読み込む。管理者やその他の閲覧者がそのノードを開いてリンクをクリックすると、HTMXが保存されたJSをサイトのオリジンで実行する。
| ID | CVE未割当 |
| クラス | 蓄積型XSS(HTMXイベント属性) |
| 到達範囲 | リモート(認証済みのLinkフィールド/メニュー書き込み者。被害者が閲覧してクリック) |
| CWE | CWE-79 |
| CVSS | High: 8.7 CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N |
| 製品 | Drupal core |
| 影響を受けるバージョン | 11.4.8 (61044508071749629aaf3380aa85971e94df9e84) |
| 認証 | Linkフィールド(またはメニューリンク)を書き込める認証済みユーザー。被害者がページを閲覧してクリックする。 |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ |
書き込み者: リンクの options.attributes(Linkフィールド、メニューリンク、JSON:API)を設定できるコンテンツ編集者。被害者: ページがHTMXを読み込む(StandardとBigPipeは core/htmx を読み込む)すべての者。リンクをクリックするサイト管理者も含まれる。
| 権限 | メソッド/パス | 種類 | ラボ実証または推測 |
|---|---|---|---|
| リンクにHTMXイベント属性を永続化 | POST /jsonapi/node/article に field_link.options.attributes.hx-on-click と data-hx-on-click を指定 | 保存フィールドの完全性 | ラボ実証済み。JSON:API 201、保存された属性に依然 hx-on-click が含まれる |
それらの属性をノードの <a> に出力 | LinkFormatter -> AttributeXss::sanitizeAttributes | HTMLの完全性 | ラボ実証済み。GET /node/1 のHTMLに hx-on-click とマーカー window['DRUPAL-HTMX-ATTR-WITNESS']=1 が含まれる |
| 被害者がクリックした際にそのJSを被害者のオリジンで実行 | HTMXが hx-on-* をバインド | 被害者セッションの完全性 | HTMXとページが core/htmx を読み込むことからの推測。ラボではブラウザでのクリックを実行していない |
| 閲覧者として振る舞う(セッションCookie、管理UIのクリック) | 同一の蓄積型XSS | 被害者セッションの完全性 | 推測。ラボは属性がHTMLに残るところまでで停止 |
否定: Xss::filter | Xss::filter('<a ... hx-on-click=...>') | 塞がれている | ラボ実証済みで塞がれている。xss_keeps_hx=False |
| 未認証でのリンク書き込み | セッションなしのJSON:API | 塞がれている | ラボはまずuid 1でログインした。アカウントを持たない第三者はフィールドを設定できない |
| PHP RCE/LPE | 該当なし | 塞がれている | この残存物はブラウザJSであり、サーバー上のPHPではない |
同じピンにおける残存物: Move Block sibling markup。
SA-CORE-2026-011 の後、drupal/drupal 11.4.8 を固定しました。5つのハント: XSS/HTMX、ファイル/MIME/oEmbed、JSON:API/unserialize/SQLi、認証/CSRF/Host、REST/media/Views。JSON:API アクセス、EntityQuery の IN キー (SA-004)、シリアライズフィールドの POI (SA-005)、および rebuild.php の Host (SA-007) はパッチ適用済みのままです。HTMX のスキップリストは Xss.php にのみ追加されました。
$skip = (
in_array($attribute_name, ['style', 'srcdoc']) ||
str_starts_with($attribute_name, 'on') ||
str_starts_with($attribute_name, 'data-hx') ||
str_starts_with($attribute_name, 'hx') ||
str_starts_with($attribute_name, '-') ||
strlen($attribute_name) > 96
);
AttributeXss.php の残存物:
$skip = (
$attribute_name == 'style' ||
str_starts_with($attribute_name, 'on') ||
str_starts_with($attribute_name, '-') ||
strlen($attribute_name) > 96
);
呼び出し元には LinkFormatter.php と MenuLinkContent::getUrlObject() が含まれる。
すでに記録済みの誤った方向性:Xss::filter を残存物として扱うこと(これは対照群である);未認証の JSON:API 書き込み;PHP RCE;リバースシェル。すべて見せかけである。オラクルは、ノード HTML 上に残存する attr と、core/htmx が読み込まれていることである。
python3 drupal-htmx-attr-Abraxas-Labs.py
または
cd lab
./run.sh
対象は http://127.0.0.1:19480 のみ。ライブの drupal:11.4.8-apache、Standard プロファイル、ラボ用に JSON:API 書き込みを有効化。Compose プロジェクト drupal-htmx-attr。
SUCCESS drupal-htmx-attr how=live write=jsonapi nid=1 hx-on-click=kept jsonapi-stored=1 xss-filter=stripped htmx=loaded marker=1 version=11.4.8 DRUPAL-HTMX-ATTR-WITNESS
hx / data-hx / srcdoc の拒否リストを AttributeXss にコピーします。クラスの docblock にすでに記載されているとおり、これを Xss に統合します。
61044508071749629aaf3380aa85971e94df9e84)AttributeXss.php · Xss.phpGNU Affero GPL v3.0。LICENSE を参照してください。ループバックラボ専用です。保証はありません。