踏み台にされたくないのでXML-RPCを無効にした

こちらのサイトのおかげでWordPressのPingback機能が危ないことを知った。

DoSの踏み台にされているJPドメインのWordPressをまとめてみた
http://d.hatena.ne.jp/Kango/20140313/1394673178

とりあえずSucuriのチェックサイトでは検出されていないようだが念の為に無効にすべきだろうか、そして無効にしてその弊害になるのは何だろうか。

今度はWordPressが踏み台に、Pingback機能を悪用しDDoS攻撃
http://www.atmarkit.co.jp/ait/articles/1403/13/news133.html

この問題は、自分の投稿に対してリンクが張られたことを知らせるPingback機能を悪用したものだ。WordPressのPingback機能はXML-RPC APIを用いて実装されている。このAPI(xmlrpc.php)に対し、踏み台サイトを介して標的サイトに通知を送るようPOSTリクエストを送信すると、標的サイトに大量のPingbackが送り付けられる仕組みだ。

なるほど。わからん。

このAPIが使われるのか。
http://codex.wordpress.org/XML-RPC_Pingback_API

はっ、sourceUritargetUri がある。

とすると・・・

攻撃者 -> (標的サイトからと偽装したpingbackリクエスト) -> いろんな踏み台サイト(xmlrpc.php)
いろんな踏み台サイト -> (pingback) -> 標的サイト

sourceUritargetUri を好きな値に設定できるならこれを踏み台サイト、標的サイトのURLにしておけば踏み台サイトから任意の標的サイトのURLにアクセスしまくれるということか。実際WordPressはpingbackで相手先のURLのタイトルや本文を抜き出したりしたものをエントリのコメント欄に追加しようとするので標的サイトのURLの内容を取得しにいく。そして踏み台サイトを沢山用意すると標的サイトはいろんな踏み台サイトから沢山アクセスを受けるわけか。そして踏み台サイトも同時に攻撃されてる感じじゃないか。恐ろしや。

さて、XML-RPC APIを無効にした時の影響だけど、XML-RPC APIはリモートでブログを投稿する機能でも使われたりする、メールやクライアントアプリなどを通じて投稿している場合はXML-RPC APIを無効にするとその機能が使えなくなるおそれがある。僕はせいぜいローカルでMarkdownで書いてコピペするだけなのでXML-RPC APIは使ってない。

ということでpingbackもXML-RPC APIもろとも設定無効にしよう。というか設定無い。危ないからもともと無効にしていた気もするが思い出せない。

WordPress3.5ではxml-rpc機能がデフォルトで有効になっている
http://www.nishi2002.com/2951.html

WordPress3.5では、リモート投稿に関するメニューがダッシュボードから消えています。

バージョン3.5からは、リモート投稿がデフォルトで有効になっているためです。特に設定しなくても、自作の投稿クライアントなどから、xml-rpc経由でWordPressサイトに記事を投稿できるはずです。

なっ、なんだってー。

逆に、xml-rpc機能を無効にしたい場合は、functions.phpなどに、次の設定を追加します。
add_filter(‘xmlrpc_enabled’, ‘__return_false’);

2014/05/16追記: WordPress 3.9.1ではこの方法でPingbackを無効にできなかった。
参考: WordPressのXML-RPCの設定見直し

ふむ。あとはPingbackだけを無効にする方法もあるようだ。

http://d.hatena.ne.jp/Kango/20140313/1394673178

Sucuriは次の様なプラグインを追加することでpingbackを使ったDoS対策方法の1つとして紹介しています。
add_filter( ‘xmlrpc_methods’, function( $methods ) {
unset( $methods[‘pingback.ping’] );
return $methods;
} );

WordPress › Support » Disable XML-RPC Pingback
http://wordpress.org/support/view/plugin-reviews/disable-xml-rpc-pingback

とりあえず自作のテーマから add_filter('xmlrpc_enabled', '__return_false'); を呼んでおこう。というか xmlrpc.php 削除するかこのパスへのアクセス遮断したいぜ。

とりあえずNginxのこっち来んなを設定して不具合起きないか様子見ることにする。

2014/04/16追記: Jetpackプラグインを使う時は注意が必要です。
参考: xmlrpc.php無効にしたらJetpack使えなくなった
# disable XML-RPC
location = /xmlrpc.php {
    deny all;
}

クライアントツールから投稿するなど自分だけがXML-RPCを使う場合はIP制限などをしてもよさそう。

XML-RPCを無効にしたが念のため、ディスカッション設定 > 投稿のデフォルト設定 > 他のブログからの通知 (ピンバック・トラックバック) を受け付ける のチェックを外して、XML-RPC_Pingback_API が外部から呼び出させると思われないようにする。

ディスカッション設定 > 投稿のデフォルト設定 > この投稿に含まれるすべてのリンクへの通知を試みる は微妙なところだけど、受け付けないならこっちも通知しないべきか。こっちの設定は悪用されないだろうからチェックしたままでも良さそうな気がするが、これからみんながPingbackを無効にしていくと通知を試みるのも無駄な気がするし、やっぱりチェックを外しておこう。すみません、これからこのブログでリンクはってもそちらには通知されません。