WordPress「XSS2Shell」脆弱性(CVE-2026-64638)

対象

WordPress Coreを利用するWebサイト全般。
(WordPress 6.4 〜 7.0.2が主な対象範囲。WordPressは全Webサイトの40%以上で稼働しているため、対象範囲は極めて広い)

原因

この脆弱性は、pwn.aiによって発見され「XSS2Shell」と名付けられました。
原因は、ログイン画面のエラー表示処理におけるstrip_tags()とKSES(wp_kses_post())という2つのサニタイザーの間の「パーサー差異」にあります。
strip_tags()が生き残らせてしまう特定の文字列を、6.4以降で導入されたwp_admin_notice()経由のwp_kses_post()が再解析してしまうことで、本来除去されるべき文字列がライブなHTMLとして復活し、ログイン失敗時に送信したusernameフィールドを通じて攻撃者が選んだDOMがログイン画面に注入されてしまいます。
この「隠れた文字列が生き残る」というstrip_tags()自体の癖は昔からあるものですが、6.3以前ではこの生存文字列が再解析されず不活性のままなので、脆弱性化するのは6.4以降でエラー表示経路がwp_kses_post()を通るようになったことが引き金になっています。
修正は wp-includes/user.php 内でログイン失敗時のusernameをesc_html()でエスケープするというもので、両方のサニタイザー自体は変更されていません。
この機能(ログインページでのユーザープロファイル用スクリプトの読み込み)はパスワードリセット機能のためデフォルトで有効になっており、無効化する設定スイッチは存在しません。

影響を受けるシステム

WordPress Core 6.4 から 7.0.2(反射型XSSが有効な範囲。未認証・アカウント不要で影響を受ける)
WordPress 6.3以前は、strip_tags()の生存文字列が再解析されないため、このパスでは脆弱ではない。
より狭い範囲の特定のプラグインやテーマではなく、WordPress Core自体が対象。

想定される被害

攻撃者は認証不要で、1回のログイン失敗リクエストを送るだけで、WordPress自身のJavaScriptを悪用してサイトのオリジン内でスクリプトを実行させることができます。
この段階自体はアカウントもクッキーも事前知識も不要で、pwn.aiは実際にクッキーなしの新規ブラウザプロファイルで2つのWordPress 7.0.2環境に対してこのXSSを再現しています。
さらに、標的がログイン中のシングルサイト管理者である場合、Same Origin Method Executionという手法を経由してApplication Passwordの窃取、プラグインのアップロード、そして最終的にWebサーバーユーザー権限でのPHPコード実行にまで発展する可能性があります。
このPHP実行までの完全な攻撃チェーンは、クリーンなローカルのWordPress 7.0.2環境で実演されていますが、記事執筆時点では実際の悪用(in-the-wild exploitation)の報告はないとされています。

対策

WordPress 7.0.3へ更新する。
自動バックグラウンド更新に依存している場合は、実際に適用されたかを確認する。

参考情報

一般的には、この種のクロスサイトスクリプティング(XSS)からリモートコード実行(RCE)へエスカレーションしていく場合、攻撃者がブラウザ内でクリックジャッキングやウィンドウ操作(window.opener等の悪用)を用いて管理者のセッション権限を奪い、REST APIやプラグイン管理機能を悪用してファイルアップロード経由でWebシェルを設置するといった手口が想定されますが、あくまで一般論としての補足になります。