マルウェアの「本体」——つまり目に見える症状を引き起こしているコード——は比較的見つけやすいものです。 問題は、攻撃者が本体とは別の場所に仕込んでいるバックドアです。
uploadsディレクトリは画像ファイルが入る場所ですが、ここに.phpファイルが存在すること自体が異常です。wp-content/uploads/2024/03/cache.phpのように、 一見それらしいファイル名で隠されていることが多いです。
ファイルだけ見ていても見つからないパターンです。wp_optionsテーブルに 不正なPHPコードがbase64_decodeでエンコードされて保存されており、 テーマのfunctions.phpから読み込まれて実行される仕組みです。
WordPressの定期実行機能(wp-cron)に、外部からマルウェアをダウンロードするタスクが仕込まれているケース。 ファイルを全て駆除しても、cronが動くたびに再生成されます。
# uploadsディレクトリ内のPHPファイルを検索
find wp-content/uploads/ -name "*.php" -type f
# 不審な関数を含むファイルを検索
grep -rl "eval(" wp-content/ --include="*.php"
grep -rl "base64_decode" wp-content/ --include="*.php"
grep -rl "str_rot13" wp-content/ --include="*.php"
# wp-cronの登録内容を確認(WP-CLIが使える場合)
wp cron event listマルウェアを駆除しても、そもそもどこから侵入されたのかを特定して塞がなければ意味がありません。 WordPressへの侵入経路の大半は、脆弱性のあるプラグインかテーマです。
サーバーのアクセスログで、感染推定日時の前後に不審なPOSTリクエストがないか確認します。特にプラグインのAjaxエンドポイントへのアクセスが手がかりになります。
WPScan Vulnerability Database(wpscan.com)で、インストール済みプラグインの既知の脆弱性を確認します。
「無効化」では不十分です。無効化されたプラグインのPHPファイルは依然としてサーバー上に存在し、直接アクセスで脆弱性を突かれます。
マルウェアに感染した時点で、攻撃者はあなたのサイトの認証情報を入手している可能性が高いです。 駆除後にパスワードを変更しなければ、攻撃者は正面玄関から堂々と再侵入できます。
管理者だけでなく、編集者・投稿者のパスワードも変更
FTPクライアントに保存されたパスワードも更新
ここを取られると全てが無意味
変更後、wp-config.phpのDB_PASSWORDも書き換え
WordPress.orgのジェネレーターで再生成。全ユーザーが強制ログアウトされる
パスワードリセットメールの宛先になるため重要
共有サーバーで複数のWordPressサイトを運用している場合、1つのサイトを駆除しても、隣のサイトから再感染するケースがあります。 特にファイルパーミッションが緩い環境では、サイト間でファイルの読み書きが可能なことがあります。
open_basedirを有効にし、サイト間のファイルアクセスを制限する「感染前のバックアップに戻せば大丈夫」と考えるのは自然ですが、バックドアの設置は、目に見える症状が出る数週間〜数ヶ月前に行われていることが大半です。 つまり、「感染前」に見えるバックアップにも、すでにバックドアが含まれている可能性があります。
正しいバックアップの使い方
バックアップから復元する場合は、復元後に必ずセキュリティスキャンを実施してください。 また、復元するのはデータベース(記事データ)のみにとどめ、 WordPressコアファイルとプラグインは公式から新規ダウンロードしたものを使うのが最も安全です。
個別の対策をバラバラに実施するのではなく、多層防御(Defense in Depth)の考え方で セキュリティを設計することが重要です。1つの層が破られても、次の層で食い止める仕組みを作ります。
リバースハックはWordPress専門のセキュリティチームです。 マルウェア駆除から再発防止まで、ワンストップでサポートします。 まずはお気軽にご相談ください。
※ 相談は無料です。お見積もりだけでもお気軽にどうぞ。
この記事をシェア