概要
WordPressのログイン画面に、認証不要で悪用可能な反射型XSSの脆弱性(CVE-2026-64638、CVSS 8.9)が発見された。セキュリティ研究チームpwn.aiは、このXSSを起点として管理者が攻撃者の用意したページを操作した場合にサーバー上でのPHPコード実行にまで発展しうることを実証し、脆弱性を「XSS2Shell」と名付けた。WordPressは世界の多数のウェブサイトで使われているCMSであり、影響範囲の広さが懸念されている。脆弱性は2026年8月6日にリリースされたWordPress 7.0.3で修正済みで、各社は早急なアップデートを呼びかけている。
攻撃の仕組み
脆弱性の根本原因は、ログイン失敗時に表示されるユーザー名の処理における2つのサニタイズ関数間の解析結果の不一致(パーサー間差異)にある。WordPressはまずsanitize_user()とwp_strip_all_tags()(内部的にPHPのstrip_tags()を使用)でユーザー名を処理するが、strip_tags()は<の直後に空白が続く文字列(例: < area id=test>)をタグとして認識せず、そのまま通過させてしまう。ところがWordPress 6.4で導入されたwp_admin_notice()関数がログイン失敗メッセージの表示にwp_kses_post()を使うようになったことで、この通過した文字列が今度は別のトークナイザーによって正規の<area>要素として解釈され、idやhrefなど許可された属性とともにDOMに注入されてしまう。
注入されたDOM要素は、ログイン画面で読み込まれるuser-profile.jsのクリックハンドラーを不正に起動させ、本来定義されているべきajaxurl変数を攻撃者の要素で上書き(クロバリング)する。ここでpwn.aiはWordPress REST APIのJSONPサポートと_envelope=1パラメータを組み合わせ、Same Origin Method Execution(SOME)の手法でサイト自身のオリジン上でJavaScriptを実行させることに成功した。攻撃はさらにwindow.openerを介して別ウィンドウを操作し、ログイン中の管理者にアプリケーションパスワードの発行を承認するボタンを自動クリックさせる。奪取したアプリケーションパスワードを使えばREST API経由でHTTP Basic認証によるプラグインアップロードエンドポイントへアクセスでき、悪意あるZIPファイルをアップロード・展開することで最終的に任意のPHPコードがサーバー上で実行される。
この攻撃チェーンのうち、XSSの発火自体は認証不要でデフォルト設定のWordPressで成立するが、PHPコード実行まで到達するには管理者としてログイン中のユーザーが攻撃者の用意したページを操作する(記事では「普通に1回クリックするだけ」と表現)必要がある。pwn.aiによれば、この連鎖は事前のSOME関連研究をもとにしたオートノマス(自律型)システムが、オープンソースのAIモデルを用いておよそ4日間で再現したという。
影響を受けるバージョンと対策
脆弱性の原因となったコードパスはWordPress 6.4でwp_admin_notice()が導入されて以降に存在するため、実質的な影響範囲はWordPress 6.4から7.0.2までとみられる。一方でWordPress側は本脆弱性の修正を含むセキュリティリリースを7.0.3として公開し、念のため4.7系列に至るまでの各メンテナンスブランチにもパッチをバックポートしている。2026年8月7日時点で実際の悪用は報告されていないが、技術的な詳細はすでに公開されているため、速やかな対応が求められる。
サーバー側では、wp-login.phpへのPOSTリクエストでlogパラメータにURLエンコードされた<(%3C)が含まれるアクセスを異常な兆候として検知できる。通常のユーザー名に山括弧が含まれることはないためだ。WordPress 7.0.3へ即座に更新することが最優先の対策となるが、事情によりすぐに更新できない場合はWAFでlogパラメータ中の<をブロックする回避策が有効とされる。また、攻撃が成立していた可能性を考慮し、既存のアプリケーションパスワードを監査し、不審なものを無効化することも推奨されている。