CVE-2019-8942/8943: 画像アップロードからリモートコード実行
概要
- CVE: CVE-2019-8942 + CVE-2019-8943
- 影響バージョン: WordPress 3.9 〜 5.0.0(CVE-2019-8942)、4.9.9 / 5.0.1未満(CVE-2019-8943)
- CVSS: 8.8 (High)
- 認証: Author権限(投稿者権限)が必要
- 種別: パストラバーサル + リモートコード実行(RCE)
2019年2月、WordPressの画像クロップ(トリミング)機能に、Author権限だけでサーバー上で任意のコードを実行できる致命的な脆弱性が発見されました。2つのCVEを組み合わせることで攻撃が成立します。
何が起きたか
この脆弱性は2つの問題の組み合わせで成立します:
CVE-2019-8942(Post Metaの上書き): 画像の wp_postmeta を操作することで、添付ファイルの保存パスを任意の場所に変更できました。
CVE-2019-8943(パストラバーサル): 画像のクロップ処理において、保存先パスの検証が不十分で、../ を使ったパストラバーサルが可能でした。
この2つを組み合わせると:
- 悪意のあるPHPコードをEXIF情報に埋め込んだ画像をアップロード
- Post Metaを操作して保存先をテーマディレクトリに変更
- 画像クロップ機能を使ってパストラバーサルでテーマディレクトリに書き込み
- テーマファイルとして実行される → リモートコード実行
攻撃の仕組み
攻撃フロー:
- 悪意のある画像の準備: JPEG画像のEXIFメタデータにPHPコードを埋め込む
# exiftoolで画像にPHPコードを埋め込み
exiftool -ImageDescription='<?php system($_GET["cmd"]); ?>' innocent.jpg
-
画像をWordPressにアップロード: Author権限で通常の画像アップロードを実行
-
Post Metaの操作:
_wp_attached_fileメタデータを操作して、保存パスにパストラバーサルを含める
例: 2019/02/image.jpg を 2019/02/image.jpg#/../../../wp-content/themes/theme/evil.jpg に変更
-
クロップ実行: 画像編集画面でクロップを実行すると、操作されたパスにクロップ後の画像が保存される
-
コード実行: テーマディレクトリに保存された画像(PHPコードを含む)にアクセスすることで、任意のコードが実行される
実際の被害
- WordPress 3.9〜5.0.0 の全バージョンが影響(約5年分)
- Author権限(投稿者権限)だけでサーバーの完全な制御権を取得可能
- 共有ホスティング環境では、同一サーバー上の他のサイトにも被害が波及する可能性
- 多くの企業サイトで外部ライターにAuthor権限を付与しており、内部脅威のリスクが顕在化
- セキュリティ研究者RIPS Techが発見し、WordPressチームに報告してから修正まで時間を要した
修正と教訓
修正: WordPress 5.0.1 / 4.9.9で修正。パストラバーサルの防止と、Post Metaの不正な操作を防ぐバリデーションが追加されました。
教訓:
- 最小権限の原則: Author権限でもRCEが可能 — 権限は必要最小限に
- ファイルアップロードの危険性: 画像ファイルでもコードを含められる
- 複合脆弱性のリスク: 個別には低リスクな問題が組み合わさると致命的になる
- EXIFデータの危険性: アップロードされたファイルのメタデータも検証が必要
- 共有ホスティングのリスク: 1サイトの侵害が同一サーバーの他サイトに波及
Nyambushでの検出
NyambushはWordPressのバージョンを検出し、この脆弱性の影響を受けるバージョンを使用している場合、CVSSスコア8.8とともに「高」の警告を表示します。
特にAuthor権限を外部の人間に付与しているサイトでは、この種の権限昇格脆弱性は極めて危険です。定期的なバージョン監視が不可欠です。