admin-ajax.phpやREST APIの動きを制御してみよう

admin-ajax.phpやREST APIの動きを制御してみよう

WordPressにおいて脆弱性が生まれやすい経路がいくつかあります。(1)REST API経由の操作。(2)XMLRPC。(3)wp-admin/admin-ajax.phpの3つが代表格として挙げられます。これらの動作を野放しにするのではなく、あえて制御下に置き、操作をコントロールするというのが今回の試みです。
REST APIの制御プラグイン「REST API Shield and XML RPC Blocker」(WordPress.org)とご一緒にどうぞ。

◇ REST API経由での操作の脆弱性

REST APIはWordPress 4.7以降で標準装備され、記事投稿・編集・削除・メディア操作・ユーザー管理などをHTTPリクエストで操作できますが反面、脆弱性が仕込まれたプラグインやテーマによって被害が拡大しやすい構造です。また公開された当時、深刻な脆弱性が発覚。CVE-2017-1001000として、「なんでも編集・削除・投稿し放題」という状況をもたらしたものです。そのほか/wp-json/wp/v2/usersなどへのアクセスが何ら制限なく公開されてしまうため、今なお「?author=1は塞いだけどREST API経由でのアカウント名奪取は起きている」という状況下にあります。この状況を塞いだ別のプラグインとして、かなり初期に私が作った「rest-api-shield-xml-rpc-blocker」がご利用いただけます。REST APIの制御のみが目的であればこちらを使うのもアリかと思います。

◇ XML-RPC

古くからWordPressに存在するリモート投稿API(xmlrpc.php)は、モバイルアプリや外部クライアントとの連携に利用されていました。しかし、現在ではREST APIに取って代わられつつあり、利用実態は薄れつつあります。

脆弱性内容
XML-RPC pingback DDoSpingback.ping を悪用して第三者サイトへのDoS攻撃中継が可能(反射型DDoS)
ブルートフォース攻撃wp.getUsersBlogs 等によりパスワードリスト攻撃が高頻度で行われる。
ファイルアップロード脆弱性wp.uploadFile で不正なMIMEタイプが通ることがある → WebShell配置の踏み台に。

REST API登場後、XML-RPCを有効にしておく理由が希薄化しつつあります。しかも脆弱性はRESTよりも検査対象外のことが多く、放置されやすい傾向です。その結果サーバー負荷やログ汚染も深刻になりがちです。同じくrest-api-shield-xml-rpc-blockerで完全無効化することが可能です。不要であれば塞いでしまっても良いでしょう。

◇ wp-admin/admin-ajax.php

Ajaxリクエスト処理専用エンドポイントです。フォーム送信やメディア操作、ダッシュボード機能などに頻用され、ほとんどのプラグイン・テーマがここに依存しています。

脆弱性内容
CSRF(クロスサイトリクエストフォージェリ)非ログイン状態からAdmin-Ajax経由で権限昇格的操作ができるケース(nonce未検証)
未認証POSTによるスパム登録add-user 等のアクションを未検証で受け付けていた事例あり(WooCommerce旧バージョン等)
メディアアップロード偽装admin-ajax経由で画像のふりをした .php ファイルがアップされる脆弱なプラグインも。

RESTやXML-RPCと違って「万能すぎる」ため、攻撃対象が絞りづらいことが挙げられます。しかもPOSTさえできれば、非認証ユーザーでも予期せぬアクションが実行されることがあるため、あらかじめ攻撃対象となりうる action を明示的に遮断すべきでしょう。

◇ プラグインによるアプローチの内容

このプラグインは、逆にREST APIやadmin-ajaxの動きを制御し、特定のプラグイン経由のルート以外の書き込みを拒否するという思想に基づいています。

このようにエラーメッセージの編集や、特定のルート以外からのPOSTをすべて拒否する「必要最小限の通信のみを許可する」という動作を実現します。例えばcontactform7は通したいといった場合は、設定画面でcontactform7の通信のみ開ければ問題ありません。それ以外のPOSTはすべて拒否します。

明示的にホワイトリストに追加したプラグインに関しては監査を行いませんが、それ以外の操作についてはすべてブロック(拒否)対象となります。基本的にはフロントエンドの操作はこれでホワイトリストに追加することで、通信制御が可能になります。自由なWordPressではなくなりますが、長年のセキュリティの穴に一石を投じる意味合いで作成したものになります。ぜひ安全なWordPressの実現に向けて使ってみてください。

api-write-blocker(WordPress.org)

コメントを投稿する

メールアドレスは公開されませんのでご安心ください。 * が付いている欄は必須項目となります。

内容に問題なければ、下記の「コメントを送信する」ボタンを押してください。

ページの先頭