CVE-2017-1001000: REST APIで80万サイト改ざん
概要
- CVE: CVE-2017-1001000
- 影響バージョン: WordPress 4.7.0 〜 4.7.1
- CVSS: 7.5 (High)
- 認証: 不要(未認証で攻撃可能)
- 種別: 権限昇格 + コンテンツインジェクション
2017年1月、WordPress 4.7で新たに追加されたREST APIに、認証をバイパスして任意の投稿を書き換えられる致命的な脆弱性が発見されました。
何が起きたか
WordPress 4.7で導入されたREST APIのエンドポイント /wp-json/wp/v2/posts/<id> に、型変換の不備がありました。
id パラメータに文字列(例: 1?id=1abc)を渡すと、PHPの型変換により権限チェックが迂回され、認証なしで任意の投稿コンテンツを上書きできました。
具体的には、/wp-json/wp/v2/posts/1?id=1abc というリクエストを送ると:
- ルーティングではID
1の投稿にマッチ - 権限チェックの段階で
idパラメータが1abcとして評価される - PHPの
absint("1abc")は1を返すが、権限チェックのロジックが正しく機能しない - 結果として、認証なしで投稿の更新が可能に
攻撃の仕組み
攻撃は非常にシンプルでした:
POST /wp-json/wp/v2/posts/1?id=1abc HTTP/1.1
Host: target.com
Content-Type: application/json
{
"title": "Hacked by ...",
"content": "This site has been defaced."
}
たった1つのHTTPリクエストで、どの投稿でも書き換え可能でした。認証情報は一切不要です。
攻撃者は自動化スクリプトを作成し、インターネット上のWordPressサイトを大規模にスキャン・攻撃しました。
実際の被害
WordPress開発チームは2017年1月26日にサイレントパッチ(WordPress 4.7.2)をリリースしましたが、公開前から攻撃が始まっていました:
- パッチ公開後48時間で、攻撃が爆発的に増加
- 約80万サイトが改ざん被害を受けた
- 改ざんされたページ数は150万ページ以上
- 少なくとも20以上のハッカーグループが同時に攻撃を実行
- 一部のサイトではSEOスパムリンクが挿入され、検索順位が急落
- Google検索結果に改ざんされたコンテンツが表示される事態に
Sucuri社の調査によると、パッチ公開から1週間で攻撃IPアドレスは数万に上りました。
修正と教訓
修正: WordPress 4.7.2で修正。REST APIのIDパラメータに対する適切な型バリデーションが追加されました。
教訓:
- 自動更新の重要性: パッチが出たら即座に適用する仕組みが不可欠
- サイレントパッチの限界: WordPressチームは意図的に脆弱性の詳細を1週間遅延公開したが、それでも48時間で大規模攻撃に発展
- REST APIのリスク: 新機能はデフォルトで有効化されるため、不要な場合は無効化を検討
- WAFの価値: Sucuri、Wordfenceなどのファイアウォールはパッチ前から攻撃をブロックできていた
Nyambushでの検出
NyambushはWordPressのバージョンを検出し、既知の脆弱性データベースと照合します。REST APIが有効かどうかも確認し、古いバージョンのWordPressを使用している場合は警告を表示します。
定期スキャンを設定すれば、新しい脆弱性が公開された際に即座に通知を受け取れます。パッチが出てから攻撃が始まるまでの猶予は、わずか数時間しかありません。