CVE-2022-21661: WP_QueryのSQLインジェクション
概要
- CVE: CVE-2022-21661
- 影響バージョン: WordPress 3.7 〜 5.8.2(約8年分のバージョン)
- CVSS: 8.0 (High)
- 認証: 状況による(プラグイン経由で未認証攻撃の可能性)
- 種別: SQLインジェクション
2022年1月、WordPressのコアクラス WP_Query にSQLインジェクション脆弱性が発見されました。WordPress 3.7以降のほぼすべてのバージョンに影響する、非常に影響範囲の広い脆弱性です。
何が起きたか
WP_Query はWordPressで最も基本的なデータベースクエリクラスで、投稿の取得、検索、フィルタリングなど、あらゆる場面で使用されます。
問題は WP_Query の tax_query パラメータにおける terms と field の処理にありました。field パラメータが tt_ids に設定された場合、terms の値が適切にサニタイズされずにSQLクエリに組み込まれていました。
// 脆弱なコード(簡略化)
$terms = $tax_query['terms'];
// $terms がサニタイズされずに SQL に組み込まれる
$sql = "SELECT ... WHERE tt.term_taxonomy_id IN ($terms)";
攻撃の仕組み
この脆弱性は直接的にはWordPressのコアUIからは悪用しにくいものの、WP_Query を使用するプラグインやテーマ経由で攻撃可能でした:
- ユーザー入力を
WP_Queryのtax_queryパラメータに渡すプラグインを特定 fieldにtt_idsを指定し、termsにSQLインジェクションペイロードを挿入- データベースから任意のデータを抽出
多くのプラグインが検索機能やフィルタリング機能で WP_Query を使用しているため、攻撃の入口は多数存在しました。
実際の被害
- WordPress 3.7〜5.8.2 のすべてのバージョンが影響を受けた(約8年分)
- 公開時点で世界のWordPressサイトの大多数が潜在的に脆弱
WP_Queryを使用する数千のプラグインが間接的に影響- 実際の大規模攻撃の報告は限定的だったが、標的型攻撃での悪用が懸念された
- WordPress 3.7〜3.8というセキュリティ自動更新の対象外バージョンにも影響
修正と教訓
修正: WordPress 5.8.3で修正。WP_Query の tax_query 処理で terms パラメータに対する適切なサニタイズが追加されました。WordPress 3.7以降のすべてのバージョンにバックポートパッチが提供されました。
教訓:
- コアコードでも脆弱性は存在する: WordPress本体のコアクラスに8年間潜んでいた
- 間接的な影響の広さ: コアの脆弱性はそれを使用する全プラグインに波及する
- バージョンアップの重要性: 古いバージョンはセキュリティ自動更新の対象外になる可能性がある
- 入力バリデーションの徹底: ユーザー入力をクエリパラメータに渡す際は必ずサニタイズが必要
Nyambushでの検出
NyambushはWordPressのバージョンを検出し、CVEデータベースと照合します。WP_Queryの脆弱性のように、コア自体に影響するCVEが存在するバージョンを使用している場合、CVSSスコアとともに警告を表示します。
自動更新を有効にしていても、更新が失敗するケースがあります。Nyambushの定期スキャンで、実際に稼働しているバージョンを継続的に監視することが重要です。