WordPressがマルウェアに感染して、完全に駆除するまでの作業記録

どうも、こんばんは。ガジェット系ライターのIPPEIです。

つい1週間前のこと。大変お恥ずかしい話なのだが、WordPressで稼働しているこのブログがマルウェアに感染してしまった。サーバー内のいくつかのphpファイルが不正なコードに書き換えられ、それが実行されることで、全サブディレクトリの.htaccessが不正なものに書き換えられてしまった。

結論からいうと、主な原因としては、インドネシアからの不正なFTPアクセスだった。声を大にして言うけど、FTPやWordPressのパスワードは複雑すぎるくらいにして、定期的に変更することを強く推奨する。自分には関係ないと思っている僕のようなヤツこそ、要注意である。

気づいたきっかけ

契約しているレンタルサーバー上に、WordPress以外に、私用のウェブページ(phpファイル)が置いてあるのだが、急にアクセスできなくなった。そんなことあるかとFTPで開いてみると、ファイルもパーミッションも問題ない。ところが、.htaccessを見ると、明らかに書き換えられているではないか。

<FilesMatch ".(py|exe|php)$">
 Order allow,deny
 Deny from all
</FilesMatch>
<FilesMatch "^(about.php|radio.php|index.php|content.php|lock360.php)$">
 Order allow,deny
 Allow from all
</FilesMatch>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

簡単に説明すると、about.php, radio.php, index.php, content.php, lock360.phpを除くphpファイルにはアクセスできないという設定である。これによって、WordPressの管理画面も403エラーになっていた。

なんと、この不正な.htaccessがWordPressがあるディレクトリはもちろん、全てのサブディレクトリに作成されていたのである。しかも、やっかいなことに、削除しても数分後には復活しているではないか。

どういうことかというと、WordPressのルートにあるindex.phpに不正なコードが書き加えられていたため、ウェブサイトにアクセスがあるたびに.htaccessが書き換えられていたのである。そりゃ、いくら.htaccessを削除してもダメなわけだ。困った困った。

ちなみに、残念ながらindex.phpの不正なコードのコピーやスクショを取っておくのを忘れてしまった。

エックスサーバーの自動バックアップから正常な全データをダウンロード

さて、僕が契約しているレンタルサーバーは有名なエックスサーバーである。以前はさくらインターネットを使っていたが、5年ほど前に乗り換えた。料金は若干高いかもしれないが、速度や機能はバッチリだと思う。

エックスサーバーは標準機能として、1日1回サーバーの全データ(メールも含まれる)を自動バックアップして、14日前まで保存してくれているのだ。そして、管理画面で操作することで、サーバー上のHTTPルート外の専用フォルダに書き出してくれるのである。そこからローカルに落とせば、とりあえず問題発生前のクリーンなファイルを手に入れることができる。

index.phpと.htaccessを正常なファイルで上書きする

タイムスタンプやファイルサイズを見比べれば、問題のありそうなファイルがなんとなく分かる。応急処置として、index.phpと.htaccessを感染前のファイルで上書きしてみた。とりあえずサイトが表示される。他のファイルにも被害がある可能性は大いにあるため、これだけでは解決とは言えない。

僕はここで2つの選択肢を考えた。1つは、サーバー上のファイルを全て削除して、後に、自動バックアップ機能からダウンロードした感染前のデータをアップロードするという方法。ただ、かなりの時間がかかりそうだし、仕事の日だったので対応する時間がなさそうだった。

もう1つは、エックスサーバーの自動バックアップ機能の「復元機能」を使う方法である。指定した日付のデータをバックアップ専用フォルダに書き出すのではなく、そのままHTTPルートにそっくり上書きしてしまうという機能である。指定した日に存在しなかったファイルは削除される。ようするに指定の日付にロールバックしてくれるというわけだ。これは使えそうだ。

自動バックアップから全データを復元して復元する

さっそく感染前の日付を指定して復元を実行してみた。かなり時間がかかることは予想していたが、6時間ほどで完了した。6時間かけてファイルが順次復元されるというわけではなく、6時間後に一気に変更されたようである。

それから、データベースは復元されないのでWordPressの投稿などは失われないが、アップロードした画像などは消えてしまう。まあ、それは仕方ないことだし、そうは言っても、1日1回の頻度で完全バックアップを取ってくれるというのは素晴らしいサービスだ。

しかも、有料オプションでもなければ、上位プランのみの機能というわけでもない。僕が契約している個人向けの一番下のプランでも、標準機能として勝手にバックアップしてくれているのだ。今まで気にしたことはなかったが、本当に感謝である。

サーバーの時を戻してくれたおかげで、他に僕がやるべき作業は各種パスワードの変更とWordPressのセキュリティの見直しくらいである。エックスサーバーには感謝である。

FTPとWordPressのパスワードを取り急ぎ変更する

6時間の間に緊急で行うべき作業としては、各種パスワードの変更である。後にエックスサーバーのサポートセンターから報告をいただいて分かったことだが、原因はFTPの不正アクセスだった。

取り急ぎFTPとWordPressのパスワードは、より複雑なものに変更した。変更前も決して複雑じゃないわけではないし、他のパスワードを使い回していることもなかった、英数大小文字8ケタくらいでは今どきは不十分なのかもしれない。

とにかく、完全にランダムで、より多い桁数のパスワードに変更した。どんなに複雑なパスワードにしようが、僕は1Passwordでパスワードを管理しているので、全く苦にはならない。

ちなみに、パスワードをクラックされるのに必要な時間がどのくらいか、みなさんご存知だろうか? セキュリティに関するリテラシーが低い人であれば、8ケタくらいのパスワードを多くのサイトで使い回しているのではないだろうか。

ある記事(下にリンクを貼ってある)によると、大文字小文字含む英数字8ケタのパスワードを突破されるのに必要な時間は48分だ。これが9ケタになると2日、10ケタになると6ヶ月になる。16ケタであれば26Billion Yearsすなわち260億年である。

よくあるパスワード、約半数がAIツールで1分以内に解読可能 - ZDNET Japan

ちなみに、参照先の記事は2023年のもので、おそらくこの時代の一般的なスペックのCPUで想定した結果だろう。ムーアの法則によるとCPUの性能は18ヶ月で2倍になるので、僕の暗算が間違っていなければ10年後には180倍くらいになるのだろうか。したがって、10年後のCPUスペックをもってしても、英数大文字小文字16ケタのパスワードをクラックするには1.4億年かかることになる。

したがって、16ケタのパスワードをそこそこ定期的に変更していれば、まずクラックされる心配はなさそうである。もちろん、覚えやすい文字列だったり、他のサイトの使い回しだったりは例外なので、あくまでもランダムで固有の文字列であることが大前提である。

あと、WordPressでもなんでもそうだけど、ログインにはユーザー名とパスワードという組み合わせが必要になる。ユーザー名を「admin」のままで使うのは非常に危険なことは言うまでもない。

翌日エックスサーバーから不正アクセスに関するレポートが届いた

ほとんどの対応が終わった翌日昼ころ、エックサーバーのサポートセンターから、不正アクセスがあったことと緊急対応を行った旨のメールが届いた。メール本文はここには載せられないが、かなりボリュームのあるレポートだった。

メールに書かれていた主要なことは次のとおりだ。根本的な原因としてインドネシアから不正なFTPアクセスがあり、不正なphpファイルが実行されていたこと。エックスサーバー側でFTPパスワードは強制変更したので、新しくパスワードを設定する必要があること。WAF機能をすべて有効化したこと。

他のレンタルサーバーでマルウェア感染の経験がないので比較のしようがないのだが、エックスサーバーの迅速な対応には本当に感動した。多少高くてもエックスサーバーを使っていたよかったと思った。

WPプラグイン「All-In-One Security」を導入した

いやいや、なぜ今まで入れていなかったのだろうかという話だが、WordPressにセキュリティプラグインをインストールした。認識が甘かったといえばその通りである。猛省。

多くの機能があって使いこなせない感もあるが、必須でチェックしたいのは、主要なphpファイルのパーミッション確認(間違っていれば修正)する機能、ユーザーログイン画面で複数回ミスるとロックアウトする機能、ファイアウォール機能あたりだ。先にも少し書いたが、adminというユーザー名があると厳重注意される。

さてさて、今回の事案はこれでとりあえず大丈夫だと思うが、これからもセキュリティに対する意識を持ち、パスワードの定期的な変更など、当たり前のことは忘れずにやっていきたいと思う。

[PR] 企業やお店なんかでウェブに詳しい人がいればいいけど、そうでなければWordPress保守管理サービスを外注するという選択肢もアリかも。お問い合わせしてみてはいかがでしょうか。

ではまた。

買い物しようよ!

コメントを書き込む

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

コメント

おや、コメントがまだありません。