【要約】WordPress Core「wp2shell」を検証する:REST Batch Route Confusionから未認証SQLインジェクションまで [Qiita_Trend] | Summary by TechDistill
> Source: Qiita_Trend
Execute Primary Source
// Problem
WordPressのREST APIにおいて、攻撃者が未認証でシステムを制御できる深刻な脆弱性が発見された。開発者がREST APIのバッチ処理におけるエラーハンドリングと、配列の整合性を考慮していなかったことが原因である。具体的には以下の問題が連鎖している。
- ・REST Batch処理で解析不能なパスが含まれると、エラーオブジェクトが配列に挿入される。
- ・エラー時に$matches配列への追加が行われないため、後続の処理で配列の添字がずれる。
- ・この添字のずれ(Route Confusion)により、本来のバリデーションを回避して不正なパラメータをハンドラへ渡せる。
- ・WP_Queryが、受け取ったスカラー文字列を整数化せずSQLへ直接連結してしまう。
// Approach
検証者は、隔離されたDocker環境を用いて、脆弱性の連鎖を段階的に実証した。WordPress 7.0.1(脆弱版)と7.0.2(修正版)を比較し、攻撃の成立条件を特定している。具体的な検証ステップは以下の通りである。
1.Dockerコンテナを用いて、脆弱版と修正版の独立した検証環境を構築した。
2.解析エラーを挿入するJSONリクエストを送信し、Route Confusionの発生を確認した。
3.投稿APIのauthor_excludeパラメータを用い、SQLインジェクションの成立を検証した。
4.公開PoC(Icex0/wp2shell-poc)を監査し、時間差SQLiやBlind SQLiによるデータ抽出を試行した。
// Result
検証の結果、WordPress 7.0.1において未認証でのSQLインジェクションが成立することが確認された。攻撃者はSQL条件を改変し、本来除外されるべきデータを取得できることが判明した。また、Blind SQLiによりDB内の特定の値の復元にも成功している。一方で、7.0.2では以下の修正により脆弱性が解消されている。
- ・エラー時も$matchesへ要素を追加し、配列の添字の整合性を維持した。
- ・wp_parse_id_list()を導入し、入力形式に関わらずIDリストとして正規化した。
- ・REST処理の再入を防止する防御策が追加された。
Senior Engineer Insight
> 本件は、単一のバグではなく、複数の設計ミスが連鎖して致命的な脆弱性となる典型例である。REST APIのような複雑なルーティングを持つコンポーネントでは、エラー時の配列整合性維持が極めて重要だ。また、型検証を「配列であること」に依存し、スカラー値への考慮を漏らす設計は、攻撃の隙を与える。運用者は、パッチ適用が完了するまで /batch/v1 へのアクセスを制限するなどの暫定措置を検討すべきである。