
CVE-2026-64638(XSS2Shell)用の非破壊型検出器 — WordPress の認証前 XSS 反射プリミティブ
WordPress の wp-login.php における CVE-2026-64638("XSS2Shell") 反射プリミティブを検出する、非破壊・依存関係ゼロの検出ツールです。
CVE-2026-64638 は、WordPress コアにおける認証前の反射型 XSS です。 2026-08-07 に PWN.AI によって公開され(CVSS 8.9、CWE-79)、7.0.3 で修正され、 全サポート対象ブランチ(6.9.6、6.8.7、6.7.6、6.6.6、6.5.9、…)にバックポートされています。
根本原因は、PHP の strip_tags() と WordPress の KSES サニタイザーの間の
パーサー差分 です。
strip_tags() は < の後に空白が続くタグを認識しないため、
< area id=x> のようなユーザー名はプレーンテキストとして生き残ります。<area id="x"> 要素 に変換します。これにより、攻撃者が選択した id/class/href 属性による DOM インジェクションが
可能になります。これは公開されたマルチステージチェーン
(DOM クロバリング → REST JSONP → アプリケーションパスワード窃取 → プラグインアップロード →
ログイン済み管理者被害者への RCE)の背後にあるプリミティブです。
(ランダムなマーカーユーザー名による失敗ログインという)2 つの非破壊プローブを実行します。
<b>marker</b> がエラーレスポンス内でエスケープされずに出現します。< area id=marker> が strip_tags() を生き残り、
レスポンス内でライブ/正規化された要素(例: area id="marker")として再出現します。ペイロードは何も実行しません。このツールは、攻撃者の HTML がライブ DOM として レンダリングされるかどうかのみを測定します。オプションの追加機能:
--version — フィードの <generator> タグを介してコアバージョンをフィンガープリントします。--jsonp — 公開されたチェーンで使用される REST JSONP エンベロープ(_jsonp/_envelope)が
到達可能であることを確認します。python3 xss2shell_check.py https://example.com
python3 xss2shell_check.py --jsonp --verbose https://example.com
python3 xss2shell_check.py --version https://example.com
python3 xss2shell_check.py --json https://example.com
Python 3.6+、標準ライブラリのみ。依存関係はありません。
| コード | 意味 |
|---|---|
| 0 | 脆弱(VULNERABLE、反射プリミティブが存在) |
| 1 | 修正済み / 脆弱ではない(PATCHED / NOT VULNERABLE) |
| 2 | エラー(ERROR、到達不能、WAF チャレンジ、予期しないレスポンス) |
<area id="…">)です。
属性の引用符の形式は KSES の世代によって異なります(旧カスタムパーサー:
<area id=x>、DOMDocument: <area id="x"> / <area id="x" />)ので、
すべての形式をマッチングします。再パースを伴わない生の < area …> の通過は、
ブラウザ上では無害なテキストでありプリミティブではありません — これは
RAW_TEXT_ONLY として報告され、誤検知(false positive)にはなりません。login_errors フィルタや CDN/WAF がレスポンスを書き換える場合、または
ログインエラーがユーザー名をエコーしない場合は、偽陰性(false negative)が
発生する可能性があります。許可されたセキュリティテストのみを対象としています。このツールは、自分が所有する、 または明示的な書面による許可を得て評価するシステムのみをテストすることを意図しています。 無許可のテストはほとんどの法域で違法です。
| フラグ | 目的 |
|---|
--version | コアバージョンをフィンガープリント(フィードの generator タグ、フォールバックとしてホームページの meta) |
--jsonp | REST JSONP エンベロープ(_jsonp/_envelope)が到達可能かも確認 |
-v, --verbose | プローブレスポンスのスニペットを表示(レポート用の証跡) |
--json | 機械可読な JSON 結果を出力(CI / 自動化用) |
| 観測される挙動 | 判定 | 終了コード |
|---|
<b>marker</b> がエスケープされずにエコーされる | RAW_HTML — 脆弱 | 0 |
< area id=marker> がライブな <area id="marker"> に再パースされる(引用符・void 形式は問わない) | AREA_BYPASS — 脆弱 | 0 |
| ユーザー名が HTML エスケープされる | ESCAPED — 脆弱ではない | 1 |
| タグが除去されテキストのみ残る | STRIPPED — 脆弱ではない | 1 |
生の < area …> が通過するが再パースされない | RAW_TEXT_ONLY — 無害なテキスト、脆弱ではない | 1 |
| エコーがまったくない | NOT_REFLECTED — 脆弱ではない | 1 |
| プローブがブロックされる(HTTP ≥ 400 / チャレンジページ)、またはターゲットに到達できない | ERROR | 2 |