目次

この記事の目次です。

1. 対象のWordPressを利用したWebサイトの感染について
2. マルウェア感染被害を広げないための応急処置
3. マルウェアのチェックと駆除の準備
4. マルウェアのチェックと駆除の実施
5. 復旧後の対応

更新履歴

1. 対象のWordPressを利用したWebサイトの感染について

エックスサーバーなどのレンタルサーバーで、WordPressを利用して構築したWebサイトがマルウェアに感染してしまった。 というようにクライアントから相談を受けたWebデザイナーなどのホームページ制作者/更新代行者向けに、 自力でマルウェアのチェックと駆除を行う方法、またその後の対応についてまとめてみました。

想定しています状況としましては、エックスサーバーなどのレンタルサーバーでWordPressを利用してWebサイトを運用していて、 また調査に必要なアクセスログの保存も行われておらず、専門業者にお願いしても感染源の特定は困難という状況です。

2. マルウェア感染被害を広げないための応急処置

Webサイトのマルウェア感染に気づきましたら、出来るだけ速やかに侵入の入り口なるところをロックする必要があります。

取返しのつかない被害につながる恐れ

ロックしないと、ページの改ざんや他者への攻撃の実行、不正なコンテンツ、フィッシングサイトの公開・設置だけでなく、 そういったページが検索エンジンの表示で露出し、ブラックリスト、マルウェアを扱うサイトに登録されてしまいます。 復旧後、ブラックリストは解除が行えても、マルウェアを扱うサイトなど刺青のように永遠にのこる恐れがあります。

Web公開領域のアクセス制限

まず初めに、侵入の入口のメインと考えられるWeb公開領域のアクセス制限を行います。 エックスサーバなどのレンタルサーバでは感染を検知した時点でWeb公開領域のアクセスを制限してくれます。

たとえば、.htaccessで以下のように記述して、関係者のIPアドレス以外、全てのアクセスを遮断します。

order deny,allow
deny from all
allow from <許可するIPアドレス>

速やかに行う必要がありますので、メンテナンスページの表示などはアクセス制限してから考えるのがいいと思います。

FTPやデータベースのパスワード変更

Web公開領域のアクセス制限を行ったら、他にも侵入の入り口となる、FTPやデータベースなどパスワード類はすべて変更しておきます。 コンパネなども変更できるようなら変更しておきます。

3. マルウェアのチェックと駆除の準備

マルウェアのチェックと駆除の前にクライアントとトラブルにならないようバックアップを行っておきます。

ファイルのバックアップ

メールボックスなどWebサイトの資材以外もおかれていて、それらにも感染ファイルが分布している恐れがありますので、すべてバックアップしておきます。 FTPなどで転送時に文字化けたり、ウイルスソフトにより、ダウンロードできない場合がありますので、可能であれば、以下のようにSSHでサーバーに接続して圧縮してバックアップします。

tar zcvf <圧縮ファイル名>.tar.gz ~/<ディレクトリまたはファイル名>

データベースのバックアップ

データベースもすべてバックアップしておきます。 管理画面やPHPMyAdminにエクスポート機能があると思いますので、それを利用します。

SSHが使用できる場合はmysqldumpなどでWordPressが使用するMySQLのデータベースがバックアップできます。

mysqldump

mysqldumpは、MySQL(もしくはMariaDB)のデータベースをバックアップするコマンドです。 この記事では、WordPressのデータベースのバックアップとそのバックアップを他のMySQLに移行(リストア)する例を紹介しています。

詳細

4. マルウェアのチェックと駆除の実施

マルウェアのチェックと駆除の実施を行っていきます。 駆除の実施はローカルに落としてきたファイルとデータベースのダンプファイルに対して行い、駆除した後にファイルとデータベースを入れ替えます。

ローカルに圧縮しないでダウンロードする

ローカルの作業環境では、Windows Defenderなど無料のものを含めセキュリティソフトを使用していると思います。 圧縮しないでダウンロードすることで、既知のマルウェアは検出され隔離され数が減らせると思います。 スキャンをかけてもいいと思います。

WordPressの本体部分

.htaccessやindex.php、wp-config.php、/wp-contentディレクトリ以外のWordPressの本体部分は公式サイトにありますので、公式サイトからダウンロードしてきたファイルに入れ替えます。

自作以外のプラグイン

/wp-content/pluginsディレクトリ以下に配置されるプラグイン部分も自作以外のものであれば製造元からダウンロードして入れ替えます。 ただし、プラグインにセキュリティホールやマルウェアが仕込まれている恐れがありますので、レビューを見るなどして厳選すると同時に、復旧は最低限にしておくといいと思います。

自作以外のテーマ

/wp-content/themesディレクトリ以下に配置されるテーマ部分も自作以外のものであれば製造元からダウンロードして入れ替えます。 もし現在使用していないテーマの場合はこの機会に削除しておきます。

制作時のファイルが残っている場合

自作部分で制作時のファイルが残っている場合はそれに入れ替えます。

入れ替えられなかったものの除染

入れ替えられなかったファイルとデータベースのダンプは、マルウェアをチェックして駆除していきます。 上記の対応でチェック対象のファイルはかなり減り、1つ1つ開いて見ることも可能になっていると思います。 あとで駆除以外の応急処置を行いますので、100%の駆除ではなく、極力プログラムの無害化を目指して駆除していきます。

不審なファイルを見つける

まずは不審なファイルを見つけます。 レンタルサーバーでは実行環境の都合でPHPマルウェアが主ですので、PHPマルウェアの特徴を観点にチェックしていきます。 WordPressの制作でPHPをかじっていると思いますのでそれほど難しくないと思います。 javascriptもあるが侵入はできないので後回しにします。

PHPマルウェアチェックの基本

PHPマルウェアの特徴は、極力見つからないようにしてある点と、見つかっても何しているかコードが読めないように難読化してある点です。

改行しておらず1行が非常に長く英数字や変数の羅列してあるコード

例えば、以下のように改行しておらず1行が非常に長く英数字や変数の羅列してあるコードはマルウェアになります。

$XXXX="abcdefghijklmnopqrstu1234567890";$XXXX=$XXXX{7}.$XXXX{19}.$XXXX{0}.$XXXX{2}・・・

文字列を作るパターンだけでなく、エラーメッセージオフにしたり、curl_execでHTTPリクエストにより外部サイトにアクセスするコードを1行に記述しているものもあります。

error_reporting(0);ini_set('display_errors',FALSE);if(file_exist("user.ini")){unlink(".user.ini");}echo・・・;curl_exec・・・

これらは一部の例ですが、1行に書いて読みにくくしているという特徴で直ぐに判別できると思います。 改行があっても意味が分からない文字列が多様されているコードもマルウェアの特徴になります。

eval関数を使用したコード

WordPressの本体などでも見かけるコードですが、eval関数を使用したコードもマルウェアの特徴になります。 意味不明な文字列のコードと合わせて利用されていたらマルウェアと判断できると思います。

$XXXX="abcdefghijklmnopqrstu1234567890";$XXXX=$XXXX{7}.・・・;eval($XXXX);・・・
base64_decode関数を使用したコード

base64_decode関数もマルウェアの特徴になります。 意味不明な文字列のコードと合わせて利用されていたらマルウェアと判断できると思います。

・・・;eval(base64_decode("・・・"));・・・

元々のファイルに追記してある場合もある

ファイルが配置されるだけでなく、既存のファイルに追記してある場合があります。 壊れないように追記部分は慎重に削除する必要があります。

不審なファイルのタイムスタンプをもとに判別する

明らかに不審なファイルはいいですが、不審かどうかコードの内容を理解しないと難しい場合は見つけた不審ファイルのタイムスタンプを頼りに判断してみるのも1つの方法と思います。

jQueryなどのJavaScriptやCSSなどのライブラリ

PHPファイル以外にも実行コードの一部を隠してある場合がありますので、jQueryなどのJavaScriptやCSSなどのライブラリは、WordPress同様に開発元からダウンロードしたものに入れ替えます。

画像の除染

画像などのバイナリファイルもテキストで開いた際にコードのつじつまが合えば利用できます。 画像はサイズを微妙に変更するなどして保存し直せば無害化できますので、感染の疑いのない元ファイルが見つからないようでしたら、保存し直します。

外部サイトのJSやCSSファイル

外部サイトから取り込んでいるJSやCSSファイルも注意が必要ですので、ドメイン名で検索したり、ブラックリストチェックサイトでチェックしておきます。

データベースの除染

データベースのデータにも不審なコードが紛れている場合があります。 MySQLのダンプファイルは特に指定しなければテキスト形式で保存されていますので、テキストエディタで開いてチェックします。 データベース内も上述のような観点でチェックしますが、特に外部サイトのJSやCSSファイル取込のコードなどはチェックしやすいかと思います。

データベースの編集について

WordPressのデータベースはダンプファイルをそのまま修正すると壊れる恐れがありますので、Search Replace DBなどの専用ツールを使ってデータベースを編集します。

復旧前に行うこと

上述のとおり、除染は100%は難しいと考えるべきで、感染源がなくなったと判断できるまでは、応急的な対応が必要と思います。 応急的な対応の例を上げていきます。

国外IPアドレスを制限する

不正アクセスは国内サーバが踏台になることもあると思いますが、大部分は海外からのアクセスと思います。 もしWebサイトの利用対象者が国内だけでしたら、国外IPの制限もありと思います。 たとえば、以下のサイト等で国外IPを取得して、.htaccessに国外IPのアクセス制限を追加します。
http://www.cgis.biz/tools/access/

アクセスログの保存期間を最大にする

原因が特定できない理由の一つにアクセスログが十分に記録されていないことがあげられます。 場合によっては後で専門業者に見てもらう判断になるかもしれませんので、十分に記録が残るようにアクセスログの保存期間を最大にしておきます。

バックアップする

バックアップして、戻せるようにしておきます。

WordPressの管理パスワードを変更する

侵入の入り口の1つになりますので、WordPressの管理パスワードも変更しておきます。

検索エンジンのインデックス削除

検索エンジンに同じドメインで不審なページの情報が表示されていることが多いです。 検索エンジンのサーチコンソールを使用して削除申請しておきます。

5. 復旧後の対応

復旧後はまた運用監視を強化し、勉強してセキュリティを強化する、リニューアルを計画する、再発してどうにもならないので一度専門業者に見てもらうなど、時間のかかる対応を行っていきます。

定期的なアクセスログのメンテ

定期的にアクセスログの保管と出来る範囲でチェックして行きます。 眺めて調べていると不審なアクセスの傾向が分かり、それによりセキュリティ強化の参考になると思います。 どうにもならなくて専門業者にお願いした際にも原因特定してもらえる確率が上がると思います。

定期的なバックアップ

アクセスログにより再侵入の日時があればその前のバックアップを戻してその状態から対策が行えるので定期的にバックアップしておきます。

ブラックリストのチェック

気付かずに再発してブラックリストに載っているかもしれませんので、以下のようなWebツールを利用すると簡単にチェックできます。
https://mxtoolbox.com/SuperTool.aspx

検索エンジンの表示のチェック

以前作られた不審なページがどこかのサイトに登録されその情報が検索エンジンに表示されてくる場合など後から出てきて、ドメイン名変更などの検討材料になってくると思います。 以下のURLで検索結果を表示すると見やすいと思います。
https://www.google.co.jp?q="<サイトドメイン>"&num=100&filter=0

定期的な脆弱性チェック

定期的に脆弱性チェックを行うことで、セキュリティ知識もアップデートされていくと思います。

セキュリティ対策

レンタルサーバーでホームページの作成を行う方が、安心してホームページの公開ができるよう、ホームページ作成とレンタルサーバーとセキュリティ対策の知識をまとめています。

詳細

更新履歴

更新履歴になります。

位置:トップマルウェアのチェックと駆除