Searchlight Cyber wp2shell WordPress RCE discovered with GPT‑5.6 Sol Ultra for $25
Searchlight Cyber wp2shell WordPress RCE discovered with GPT‑5.6 Sol Ultra for $25
TL;DR
Searchlight Cyber は GPT‑5.6 Sol Ultra を活用し、WordPress の Batch API にある認証前 SQL インジェクションを発見し、キャッシュポイズニング、埋め込み乱用、そして悪意ある customize_changeset を組み合わせて、デフォルトの WordPress インストール上でリモートコード実行 (RCE) を実現しました――計算リソースはおよそ $25 です。このエクスプロイトは、エクスプロイトブローカーが WordPress RCE に $500 k を支払う理由を示しています。
The Prompt That Started the Hunt
研究者は GPT‑5.6 Sol Ultra に、OpenAI の Cycle Double Cover (CDC) プロンプトを元にした 6 時間・4 エージェントのプロンプトを与えました。このプロンプトはモデルに対し、次のことを指示しました。
- WordPress のソースツリーを閉じたコードベースとして扱う(インターネットアクセスなし、変更履歴なし)。
- 攻撃対象領域を幅広く探索する(入力パース、シリアライズ、レースコンディション等)。
- 最大 4 エージェントを積極的に生成し、進捗に応じて動的にリソース配分を調整する。
- 典型的な MySQL バックエンド環境で
/flagを読み取れる、認証前 RCE チェーンを完全に作成する。
研究者は最新の安定版 WordPress を wordpress‑ctf/main/ にクローンし、third_party/ を空にしてコアコードだけで作業させました。
The Core Bug: Batch API Validation Desynchronisation
WordPress の REST Batch API は、まずすべてのサブリクエストを 検証ループ で走らせ、続いて 実行ループ で処理します。検証ループでは $matches(ハンドラ参照)と $validation(検証結果)という 2 つの平行配列が作られます。リクエストが is_wp_error($single_request) を返した場合、コードは 続行 しますが、対応するエントリを $matches にプッシュしません。
if ( is_wp_error( $single_request ) ) {
$has_error = true;
$validation[] = $single_request;
continue; // <-- $matches not updated
}
このオフバイワンのずれにより、インデックス i の検証結果がインデックス i+1 のハンドラに適用される可能性があります。攻撃者は無害なリクエストを検証させ、別の脆弱リクエストのハンドラで実行させることができるのです。
The First Exploit Primitive: A Pre‑Auth SQL Injection
GET /wp/v2/posts エンドポイントは author__not_in パラメータを用いて SQL の WHERE 句を構築します。パラメータが スカラー文字列 の場合、WordPress はエスケープせずに直接埋め込みます。
$author__not_in = implode(',', (array) $query_vars['author__not_in']);
$where .= " AND {$wpdb->posts}.post_author NOT IN ($author__not_in) ";
通常、REST スキーマは author__not_in を配列として要求し、各要素は absint でサニタイズされます。しかし Batch API の同期ずれバグを利用すれば、攻撃者はスカラー文字列(例:"0) OR 1=1 -- ")を 別リクエストの検証 に流し込み、実行 は GET /wp/v2/posts ハンドラで行わせ、古典的な SQL インジェクションで全行を取得できます。
Payload Example (recursive batch call)
POST /wp-json/batch/v1
{
"requests": [
{"method":"POST","path":"http://:"},
{"method":"POST","path":"/wp/v2/posts","body":{
"requests":[
{"method":"GET","path":"http://:"},
{"method":"DELETE","path":"/wp/v2/posts/1","body":{"author_exclude":"0) OR 1=1 -- "}},
{"method":"GET","path":"/wp/v2/posts"}
]
}},
{"method":"POST","path":"/batch/v1"}
]
}
外側のリクエストが HTTP メソッドの検証をずらし、内側のリクエストが author_exclude パラメータをずらしてインジェクションを実行します。
From SQLi to RCE: Chaining Gadgets
研究者は GPT‑5.6 に SQLi 以降の展開を続行させ、以下の多段階チェーンを生成させました。
- Cache Poisoning – WordPress はリクエストごとに
WP_Postオブジェクトをキャッシュします。SQLi で細工した行を返すことで、攻撃者はpost_contentを含むメモリ上の投稿表現を支配できます。 - Embed Abuse – ローカル投稿
[embed]/?p=10[/embed]を埋め込むとoembed_cache行が DB に作られます。攻撃者は任意のpost_typeとpost_contentを持つ行を作成可能です。 - Customize Changeset –
customize_changeset投稿は JSON diff を保持し、ペイロード内のuser_idが適用時に使用されます。user_idを1(管理者)に強制すれば、WordPress は一時的に管理者権限で動作します。 - Parent‑Cycle Gadget – WordPress は投稿の親子階層にサイクルがあると検出し、
wp_update_post(['ID'=>X,'post_parent'=>0])を呼びます。この呼び出しはpost_contentを上書きしないため、攻撃者が制御したコンテンツが残ります。 - Hook Replay – サイクルガジェットは
parse_requestアクション("{$new_status}_{$post_type}")をトリガーできます。do_action('parse_request', …)を呼び出すと、Batch API 全体が 管理者として 再実行されます。 - Admin Account Creation – 2 回目の実行で、以前失敗した新規管理者ユーザー作成リクエストが管理者権限で成功します。
- Back‑door Plugin Upload – 管理者アカウントで悪意あるプラグイン ZIP をアップロードし、サーバ上で永続的なコード実行を確立します。
Cost, Timeline, and Impact
- 計算コスト: $25(≈ $200 の週額 GPT‑5.6 Sol Ultra サブスクリプションの 50 %)
- フルチェーンに要した時間: モデル実行 10 時間超+人手での分析 1 日
- 影響範囲: WordPress は 5 億超のサイトで利用されており、デフォルト構成での認証前 RCE は極めて重大な高リスク脆弱性です。
- 市場価値: エクスプロイトブローカーは信頼できる WordPress RCE に $500 k を支払うと報告されており、見出しの主張を裏付けます。
Community Reaction (Hacker News Comments)
- 一部のコメントは $500 k の数字に疑問を呈し、記事がブローカーの支払い額を誇張している可能性を指摘しています。
"There is no evidence that $500k has been paid or would be paid for an exploit like this one." – Zsfe510asG
- 他のコメントは技術的深さを評価し、過去の AI 支援エクスプロイトと比較して称賛しています。
"That was an incredible writeup! … LLMs level the field." – cadamsdotcom
- いくつかはモデルのガードレールや AI 生成エクスプロイトの倫理性について懸念を示しています。
"I’m surprised GPT‑5.6 didn’t block that prompt due to guardrails." – raesene9
- 懐疑的な声は脆弱性の公表状況やパッチ適用状況の検証を求めています。
"Is this real? … I’m not seeing any mention where they report this to WP or the patch." – tantalor
Why This Matters
- 概念実証: このチェーンは最先端 LLM が最小限の計算コストで新規の認証前 WordPress RCE を発見できることを示しています。
- 経済的インセンティブ: $500 k の報酬はゼロデイに対する強い市場需要を示し、ディフェンダーもアタッカーも AI 支援研究を取り入れる動機付けになります。
- 防御的示唆: 従来の静的解析は Batch API の同期ずれバグを見逃しました。防御側は AI‑支援コード理解ツールを導入し、同様のロジック不整合を検出すべきです。
- セキュリティ研究の未来: LLM が高度化するにつれ、バグ探索からプロンプト設計、エクスプロイト連鎖、検証へとボトルネックが移行します。これらのスキルが次世代のセキュリティチームを支配するでしょう。
Mitigation steps (as of the publication date):
- Update WordPress to the latest release where the Batch API validation bug is patched.
- Disable the Batch API (
/wp-json/batch/v1) if not required. - Harden the REST API with authentication and rate‑limiting.
- Monitor for unexpected
oembed_cacherows orcustomize_changesetcreations. - Employ AI‑assisted static analysis to detect validation/execution mismatches in future code.
The full technical details, including the exact payloads and the GitHub‑style proof‑of‑concept, are available on the Searchlight Cyber research page linked above.