WordPressブログにRFI攻撃!?PHPファイルへの eval(base64_decode()) 埋め込みによる改ざんと対処方法

何かがおかしい

こんにちは、星影です。
朝起きて自分のブログを見たら、何やらおかしなことになっていました。

スクショは録り忘れましたが、ヘッダーや本文の上部分に謎の空白が空いていたのです。それぞれ500pxくらいの空白。パッと見では、他におかしな所は見られません。

えーと、何だこれ???

(この時点でちょっとイヤな予感はしてた)

PHPファイルに見知らぬコードが埋め込まれていた

ん〜、こんなところいじったっけか…?と思い、CSSを確認。コードにおかしい部分は無さそう。一応前日のファイルと比べたが、特に異常なし。

ヘッダーや本文ページのPHPファイルに何か問題が…?

あれあれ?じゃあPHPの方かな?

重苦しい空気のなか、恐る恐るファイルを確認していく。

header.php、index.php…

スクリーンショット 2013-09-20 16.37.21

▂▅▇█▓▒░('ω')░▒▓█▇▅▂うわあああああああああああ

見知らぬのコードを解析

あまりの絶望感に魔女化しそうになりましたが、冷静になってコードをよく見てみることに。

超抜粋

埋め込まれていたコード超抜粋。

eval(gzinflate(base64_decode('rRhrc5tI8rNTdf9homIFxBgh9LBkG9upjW43…

(中略)

…adjq15atPq0YGe1e6Y9T0MBDt0IBLcUb4goAF34LBr5i/NsV49+7fUhgdcN9q/8A')));

Base64なんて読めるか(´・_・`)

デコードしてみる

このまま引き下がるのは性に合わないので戦う。

デコードには以下のサイトを利用。

eval gzinflate base64_decode Online Decode Tool

埋め込まれていたコードを貼り付けてデコード。

埋め込まれていたコードを貼り付けて「Decode」をクリック

埋め込まれていたコードを貼り付けて「Decode」をクリック

出ました。

下のテキストエリアにデコード結果が出る

下のテキストエリアにデコード結果が出る

はい、PHPのコードですね。

ファッキン(´・_・`)

少しだけ整形

Sublime Textの自動整形にかけてみましたが、あまり綺麗になりませんでした。

スクリーンショット 2013-09-20 16.42.15

何が書かれているか

軽く眺めた感じですが…

  1. リファラー(リンク元)がGoogleやbing、Yahoo!などの検索エンジンかどうか見てる
  2. 上記の検索エンジンから該当のWordPressブログにアクセスした場合、とあるURLに飛ばす
  3. 何やらスクリプトが実行されてる(ふえぇ…

大体こんな感じ。

スペイン語のフォーラムで似たようなコード発見

ジャンプ先のURLについて調べてみると、ほぼ同じと見られるハッキングコード埋め込みついて言及されたスペイン語フォーラムを発見。

Me han hackeado mi servidor y banahosting se lava las manos como siempre. - Página 2

ここに貼り付けられているコード、先ほどデコードしたコードとほぼ一緒でした。

スペイン語なんてまったくわかりませんが「これサーバーの脆弱性だろ?弁償してもらえるかな」に対し「うっせーよ、どうせプラグイン古いまま使ってたとかだろ?つべこべ言わずにバージョンアップしとけや」的なことを言われてるのかしらん?

事実確認

ここで事実確認をしてみましょう。

  • なんかブログおかしい
  • PHPのファイル書き換えられてる
  • 怪しいスクリプト実行されてる

はい、確実に攻撃されていますね。

そういえば少し前から、Chromeで自ブログにアクセス(記事更新とか)すると、突然アクセスが遮断されるという症状が出ていました。いま思えば、この時点で攻撃の可能性を疑うべきでした。

このブログには悪意のあるスクリプトが埋め込まれてるっぽいからアクセス遮断するねー(^O^)/

そういうことでしたか、Google先生。

対策

さて、何らかの攻撃を受けたことがわかりました。このまま放置しておくわけにはいかないので、さっそく対策をしましょう。善は急げです。

攻撃の正体

「eval(base64_decode(」でググるとすぐにヒット。さすがです、Google先生。

PHP eval base64_decode 攻撃とその対処方法 - お笑いプログラマの技術メモ

LFI攻撃…この場合だとRFI(Remote File Include)攻撃というのかな?

先ほどのコードを見た感じですが、やはり「外部から任意のPHPスクリプトを実行させることができる状態にされた」というのが、今回の攻撃だったと推察します。

大規模サイバー攻撃?

少し話がそれますが本件について調べている途中、こんな記事を見つけました。

ターゲットは9.18--大規模サイバー攻撃に注意 - ZDNet Japan

これが直接関係するかはわかりませんが、少なくとも企業サイトや自ブログについて、攻撃の痕跡がないか確認しておいた方が良いと思います。

eval(base64_decode()) コードを削除

話を戻しましょう。

第一の対策として、まずは第三者により埋め込まれたPHPコードを削除します。

コードの削除についてはこちらを参照。

How to fix WordPress Malware Script Attack. | Lightrains Technolabs Pvt Ltd

スクリプトを使って、対象のコードを一気に削除してしまおうということらしいです。もちろんスクリプトを使わずともコードは削除できるので、そこは状況次第ということで。

僕はエラーコードを見て、ひとつひとつ潰しながら確認していきました。テーマやプラグインファイルを中心に、大体30ファイルに対して先ほどのコードが埋め込まれていましたね(#^ω^)

ググって情報眺めてたら、6000強のファイルに埋め込まれていたという方もいました…

とにかく埋め込まれたコードを即刻削除すること。これが最優先です。

外部スクリプトの実行防止

次に、外部スクリプトの実行を防止します。埋め込まれたコードは削除したわけですが、対策をしなければまた同じように悪意のあるコードを埋め込まれる可能性があります。

先ほどコード削除について書かれていたサイトに、防止策も載っています。

How to prevent WordPress Malware Script Attack | Lightrains Technolabs Pvt Ltd

外部スクリプトの実行を防止するには、php.ini に以下の設定を追加します。

allow_url_fopen = off
allow_url_include = off
disable_functions = "apache_child_terminate, apache_setenv, define_syslog_variables, escapeshellarg, escapeshellcmd, eval, exec, fp, fput, ftp_connect, ftp_exec, ftp_get, ftp_login, ftp_nb_fput, ftp_put, ftp_raw, ftp_rawlist, highlight_file, ini_alter, ini_get_all, ini_restore, inject_code, mysql_pconnect, openlog, passthru, php_uname, phpAds_remoteInfo, phpAds_XmlRpc, phpAds_xmlrpcDecode, phpAds_xmlrpcEncode, popen, posix_getpwuid, posix_kill, posix_mkfifo, posix_setpgid, posix_setsid, posix_setuid, posix_setuid, posix_uname, proc_close, proc_get_status, proc_nice, proc_open, proc_terminate, shell_exec, syslog, system, xmlrpc_entity_decode,eval, base64_decode, gzinflate"

ここで追加した3つの設定は、それぞれ以下のような意味を持っています。自分の環境への影響度を考慮し、適切な設定を行いましょう。

allow_url_fopen

外部のファイルにアクセスする事を許可するかどうかの設定です。

allow_url_include

外部のサーバーのPHPスクリプトを読んで実行するかどうかの設定です。

disable_functions

特定の関数をセキュリティの観点から無効にすることができます。

WordPress、プラグインのアップデート

そして最後の対策です。WordPressやプラグインを最新の状態にします。いや、本当に当たり前過ぎて何言ってんだコイツって感じですが、割りとこれができてない人多いんじゃないかなと。まぁ僕なんですけどね。

というわけで、WordPressのバージョンが最新ではなかったためアップデート。また、各種プラグインも最新版にアップデート。コードが埋め込まれていたプラグインに関しては、一度削除してから再インストールしました。

えぇ、こんなの当たり前のことですよね。ホントに笑えないです。

まとめ

ひとまずこれで、現状考えられる対策はとれたのではないかと思っております。もちろん、今回は侵入経路が特定できたわけではないので、これだけで完全な防御ができたとは言えません。すでにプラグインなどで何重にも防御策は講じていますが油断はできません。

WordPressの場合、利用ユーザー数も多いことから、プラグインやテーマの脆弱性を突いた攻撃が日々行われています。バックアップやセキュリティ対策などについては、常日頃から気を配るようにしておきましょう。

スクリーンショット 2013-09-20 21.43.30

幸いにも今回は、早期発見&早期解決ができたことにより、ブログの停止時間も3〜4時間ほどで済みました。

しかしながら、WordPressやPHPのセキュリティ知識が身に付けば、もっと早い対応が可能であるとも感じました。今回の攻撃を教訓に、セキュリティ面に関してもう少し勉強が必要だなぁと思いました。僕の経験が少しでも誰かのためになればということで。

最後に

今回の対策については、初めての経験だったこともあり、もしかしたら対応に誤りがある場合があるかもしれません。もし明らかに間違った対策をしているようであれば、コメント欄やTwitterアカウント(@unsoluble_sugar)宛てに、遠慮なくご指摘ください。

WordPressを使い始めて1年ほどになりますが、まだまだ知らないことが多いです。自分でも日々勉強を積み重ねてはいますが、先人の皆さまのご協力も得て、もっと精進していきたいと思っております。よろしくお願いいたします。

参考

本文中には書きませんでしたが、下記の記事も参考にさせていただきました。ありがとうございます。

WordPressの脆弱性を狙ったPHPコード不正書き換えについて|佐渡の洋食屋店長のブログ

Middle Mountain: 検索結果のリンク先が変になる:Wordpressとeval(base64_decode

WORDORESのトラブル eval(base64_decode | Ora!!Sinpatico

WORDPRESSセキュリティ対策 基本マニュアル