2014年3月16日日曜日

WordpressなXML-RPCで「Pingback」を悪用してDDoSの件についてまとめてみた

最初に読んでね!


最初に書いておくけど、ボクはセキュリティの専門家でもなければWordpressの専門家でもないからね!このエントリに書いた内容はn個の間違いが含まれているからね!鵜呑みにせず、ちゃんと自分で考えて、いろいろな情報を収集し、自分の責任においていろいろやってね!ボクは何が起こっても責任取れないからね!自己責任だよ!

ここ最近巷を賑わしているWordpressのDDoS問題


NTPを使ったDDoSの次はWordpressかよ!……と思わず叫びたくなるこんな世の中じゃ(*1)。

ってことで、個人か法人かを問わずWordpressを使ったサイトって結構ありますわな。使ってるぜ!って人もかなりいるはず。そんなWordpressがDDoSに利用されるとあればその影響度も推して知るべしといった感じですな。

この問題、Wordpressに実装されているXML-RPCを悪用したもの。「Pingback」っていう「君のブログ、俺のブログで紹介したぜ!」的な通知を自動でやってくれるってものみたいなんだけど、これをゴニョゴニョすると悪さすることができるらしい。

たちの悪いことに、ここ最近のWordpressではこの機能がデフォルトで有効になっている。えっと、Wordpress3.5以降かな。それ以前のWordpressでは有効/無効を切り替えられたみたいだけど。簡単に無効化できないのもあって、あちこちに影響が出てるって側面のあるんじゃないかなと勝手に思っている今日この頃。

詳しくは下記のブログなんかをみてみるといいよ。英語だけど。ちなみにこのブログ中にcurlコマンドを使った例がでてるけど、これでチェックしてみることも可能なのかな?


この問題の影響を受けるかどうか調べるには


前述のブログからもリンクされてるんだけど、それ以外でもちょこっと調べると「この問題の影響を受けるかチェックできるオンラインツール」として下記のサイトが紹介されていることに気づく。「自分のサイトをチェックしてみたけど、Goodってでてるから大丈夫っぽい!」って安心している人もいるんじゃないかと。


ボクの管理下にあるWordpressサイトもチェックしてみたんだけど、やっぱり「Good」ってでる。でもなんかおかしい。

っていうのも、前述の通りWordpress3.5以降ではデフォルトで有効なわけで、特別無効化してもいないサイトなのになんで「Good」になるんだろうか。探し方が悪いのかもしれないけど、攻撃を成立させる他の条件を調べてみたけど見当たらない。ん〜。これで安心しちゃっていいのかしら?

ちょっと待って!安心するのはまだ早いよ!


そんな悩みを抱いていたときに見つけたのが下記のブログ。これでボクの疑問は解消した。あ、そうそう。このブログは本問題について詳細にまとめられているので、目を通してみるのが吉だよ!


読んでみたところ、先のチェックツールは「限定的な条件においてのみ安心できる」ものらしい。どういうことかというと、「過去のある時点までにSacuri Labのサイトに対して、該当するアタックを行った(=現時点でDDoSの踏み台として使われている)場合のみ警告が出る」ものなので、本件の影響を受けるかどうかという直接的なチェックはしてないということ。

その証拠に「Is your WordPress Site being used to attack others? We will check if it is found in our logs」とでかでかと書いてある。そう、「手元にあるログの中におたくのサーバからのアクセスがあるかをチェックするよ!」ってことだね。

あかん……ずっと勘違いしてた。そして、前述の疑問もこれで解消した。そりゃぁ「Good」って出てもおかしくないわ……。

CLIなPHPプログラムでスキャナっぽいものを作ってみた


以上を踏まえた上で、CLIなPHPで動くスキャナっぽいものを作ってみた。これも本件の影響を受けるか……ってことそのものをチェックするものではないんだけど、XML-RPCで「Pingback」機能が使えるかどうかを判定することによって、影響するかを判断する一助にはなるはず。

動作にはXML-RPCサポートが有効な状態でコンパイルされたPHP4.1.0以降の環境で動くはず。要は「--enable-libxml 」と「--with-xmlrpc[=DIR]」をつけてconfigureしたやつってことね。ちなみにボクはPHP5.5.8で実行した。

このPHPプログラムについてはPHPマニュアルの関数リファレンスより、「XML-RPC関数」の各ページを参照して作った。コード自体について、そして実行環境についてはこれを見ればだいたい分かるはず。


前置きが長くなったけど。。。

下記のコードを適当な名前(例えばscan.phpとか)で保存して、「php ./scan.php http://www.example.com」とかしてみるとXML-RPCでPingbackが使える状態かをチェックできる。

引数なしで「php ./scan.php」とか実行すると使い方が表示されるし、引数のフォーマットがおかしいとエラーが表示されるようになっている。



念のため書いておくけど、これは自分が管理しているブツ以外には使わないこと。あと、共用サーバとかにのせているWordpressに対して実行するときは連続で実行したりしないこと。また、これを実行した結果が常に有益な情報をもたらすことも保障しないのでそのつもりで。あなたに対して間違った安心感を与える以上の効果が見込めないかもしれないし、第3者を攻撃するためのスクリプトが仕込まれているかもしれない。

これを使ったことによって生じたいかなる損害も、当方は一切保障しない。全て自己責任において実行すること。

さて、これをボクの自宅サーバにインストールしたWordPress 3.8.1に実行してみたのがこちら。このWordpressは配布パッケージをダウンロードして普通にインストールした直後の状態。

$ php ./scan.php http://localhost/wp/xmlrpc.php
[Request]
<?xml version="1.0" encoding="iso-8859-1"?>
<methodCall>
<methodName>pingback.ping</methodName>
<params>
 <param>
  <value>
   <string>127.0.0.1</string>
  </value>
 </param>
 <param>
  <value>
   <string>localhost/wp/xmlrpc.php</string>
  </value>
 </param>
</params>
</methodCall>

[Response]
Array
(
    [faultCode] => 0
    [faultString] =>
)

レスポンスとして「faltCode => 0」が返ってきている。これは「汎用の fault コード」とのことで失敗しているようにみえる。だけど、これで安心!……ていうよりはPingback自体は使える状態ってことなので、DDoSに使われる可能性があるということだと解釈した方がよさげな気がする。つまり、このWordpressはDDoSに利用されてしまう可能性があるということだ(*2)。デフォルトで有効になってるものをそのままにしてあるんだから、納得いく結果だよね。

あ、レスポンスについての説明は下記ページを参照のこと。


ちなみに、WordpressのXML-RPCに関するAPIリファレンスはこちらから参照できる。


じゃあ、どうやって対策すればいいの?


影響がありそうなのは分かった。じゃあどうすればいいの?……ってことになるわけで、むしろそこが一番大事なわけで。

ちょっと調べてみたら、このXML-RPCのうちPingbackだけを無効化してくれるプラグインってのが見つかった。Requirementsが「3.8.1 or higher」なので古いバージョンを使い続けている人は使えないみたいだけど(*3)、新しいバージョンを使ってる人は一番オススメできるんじゃないかなと。Pingback以外のXML-RPC使ってる部分は有効なままなので、モバイルアプリとかを使ってる人でも安心だし。


最初に紹介したSecuri Labのブログでは「add_filter()」を使った方法が推奨されているみたい。コイツを使ってるテーマ中の「functions.php」あたりに書いておけば(*4)無効化される……って感じらしい。結局、先のプラグインでも同じことをやってるっぽいんだけども、古めのWordpressを使ってる場合はこちらの方が採用しやすいかな?


xmlrpc.php自体を削除したり、XML-RPC全体を無効化するのは非推奨らしい。っていうのも、あちこちで使ってるみたいなので、そういうことをすると正常に動作しなくなる恐れがある。

で、ためしにプラグインの方を導入してみた。それで自作のスキャナもどきを使ってみた結果がこちら。

$ php ./scan.php http://localhost/wp/xmlrpc.php
[Request]
<?xml version="1.0" encoding="iso-8859-1"?>
<methodCall>
<methodName>pingback.ping</methodName>
<params>
 <param>
  <value>
   <string>127.0.0.1</string>
  </value>
 </param>
 <param>
  <value>
   <string>localhost/wp/xmlrpc.php</string>
  </value>
 </param>
</params>
</methodCall>

[Response]
Array
(
    [faultCode] => -32601
    [faultString] => server error. requested method pingback.ping does not exist.
)

こんどはfaultCodeが「-32601」、faultStringに「server error. requested method pingback.ping does not exist.」って文字列が入ったレスポンスが返ってきた。メッセージの方を見てみると「リクエストされたメソッドがないよ!」ってことが読み取れる。DDoSに使われているXML-RPCのPingbackなメソッドがないってことなのだから、たぶん影響を受けることはないだろうと考えられる。

他の方法として、「xmlrpc.phpへアクセスできるIPアドレスを制限する」的なのを紹介しているブログも見つけたんだけど、これはあまり推奨できないかなと個人的には考えている。まあ、自己責任で「大丈夫そう!」と思える何かがあるなら検討してみるといいんじゃないかな。

このエントリ中に含まれるn個のバグを見つけた人や、アドバイスや指摘などがあれば何らかの方法で是非ご連絡いただきたい。割とまじめにこのあたり詳しくなくて、さっぱり安心できないので(´・ω・`)


*1:ポイズン
*2:ボクの認識が間違ってなければね
*3:ためしに自己責任でWordpress3.5にインストールしてみたんだけど、インストールもできるし動くことは動くっぽい(推奨はしないし責任も取らないけど!)
*4:正直このあたりはよく分からないので、変なこと言ってるかもしれない……

0 件のコメント:

コメントを投稿