「マルウェアのファイルを消したのに、しばらくすると元に戻っている」。こうした現象は、どこかに「読み込み口」が残り、ページが開かれるたびにマルウェアを書き戻しているときに起こります。当社が2026年10月に対応したサイトでは、有料テーマの functions.php に読み込み口が仕込まれていました。ファイルを隔離しても約1分で復活。書き戻しが止まったのは、サイトをメンテナンス中にしたうえで、隔離・読み込み口の除去・データベースの掃除をまとめて行った3回目でした。

この記事では、「管理画面に入れない」という相談をきっかけに判明した改ざんの実例を紹介します。消しても戻る仕組みと、それを止める順番、運営者が自分で確認できる点を解説し、後半では制作・保守を担当する技術者向けの内容を取り上げます。

「管理画面に入れない」の正体はマルウェアだった

寄せられたご相談は、「エラーが出て管理画面に入れない」という内容でした。対象は小規模な事業者のサイトで、お客様としては「何かのエラーを直してほしい」というご依頼でした。

ところが、画面に出ていたエラーの文言を見ると、エラーが起きている場所は mu-plugins というフォルダのファイルでした。当社はこの文言に気づいた時点で、改ざんの可能性を疑っていました。mu-plugins(Must Use Plugins)は、配置されたファイルが必ず読み込まれる特別なフォルダです。管理画面のプラグイン一覧では通常の欄に表示されず、管理画面から停止することもできません。こうした性質から、マルウェアが居座る場所にも使われます。

調査の結果、エラーの原因となっていたファイルは正規のプラグインではないと分かりました。「Smooth Resolver Snap」というもっともらしい名前を名乗っていましたが、作者名もURLも実在しないものです。サイズは2.4MBで、行数は約1万行ありました。関数の名前を1文字ずつに分けて組み立て、中身を隠す書き方が使われており、通常のプラグインとは異なっていました。このマルウェアがエラーを起こしたために、管理画面に入れなくなっていたのです。

見つかったもの:見覚えのない管理者が4人

サイト全体へと調査を広げると、mu-plugins のファイルは入り口の一部でしかないことが分かりました。見つかったのは、次のようなものです。

場所 見つかったもの
ユーザー 見覚えのない管理者が4人。作成日は2026年3〜4月で、全員が管理者(administrator)の権限を持っていた
プラグイン 管理者の1人を作成し、一覧から隠すプラグイン。このほか、攻撃者が入れたとみられるファイル管理のプラグイン
wp-content の直下・uploads・cache 意味のない8文字の名前が付いたバックドア(外から命令を送り込める裏口)が約25個。正規のプラグインのフォルダ内にも紛れ込んでいた
wp-content データベースよりも先に読み込まれる db.php と、隠しフォルダ
wp-config.php 2行の設定が追加されていた
データベース 不正な予約処理(WP-Cron)が8件あり、10秒ごとに動くものも含まれていた。ほかに、マルウェア本体の写し(600KBなど)
テーマ 有料テーマの functions.php の末尾に、約460行が追加されていた

なかでもやっかいだったのは、隠された管理者の存在です。そのユーザーを作成したプラグインは、管理画面のユーザー一覧から自分を隠し、「管理者(4)」のような人数表示まで1人減らしていました。そのうえ、そのユーザーの編集画面と削除画面も開けない状態にしていました。パスワードには、ドメイン名から計算する決まった形が使われていました。そのパスワードが変更されない限り、攻撃者はいつでも管理者としてログインできる状態だったのです。

管理者の作成時期は2026年3〜4月でした。つまり、ご相談をいただくまで半年近く、気づかれないまま入り込まれていたことになります。なお、侵入経路の特定には至っていません。

なぜマルウェアは消しても戻るのか

この事例で最も時間を要したのが、ここからの対応です。

1回目は、発見した不正なファイルを隔離用のフォルダに移しました。ところが、約1分後に確認した時点で、同じファイルが元の場所に書き戻されていました。データベースにも本体の写しがあると分かったため、2回目はその写しを削除してから隔離しました。それでも、ファイルは再び戻ってきました。

実際の読み込み口となっていたのは、有料テーマの functions.php の末尾に追加された約460行です。テーマの functions.php は、サイトのページが開かれるたびに必ず読み込まれます。そこに仕込まれた処理が、ページの表示ごとに本体があるかを確認し、消えていれば書き戻していました。

見落としにつながりやすかった理由は、2つあります。

  • ファイルの更新日時が偽装されており、「最近変更されたファイル」を探しても目立たなかった
  • 有料テーマには、正規のファイルと照合する手段がない(後述)

WordPress本体と、wordpress.org で配布されるプラグインは、正規のファイルの「指紋」(チェックサム)を使って照合できます。このサイトでも、有効なプラグイン13個と本体は、すべて正規のものと一致していました。一方、有料テーマには公式の指紋がなく照合できないため、改ざんされていても機械的な検出が難しいという事情があります。

再感染を止めた順番:メンテナンス中にしてから一気に

メンテナンス中にしてから、不正なファイルの隔離と読み込み口の除去を一気に行う手順のイメージ

読み込み口を先に取り除こうとしても、作業中にページが開かれると、ほかの場所に残る本体やデータベースの写しから再び書き戻されるおそれがあります。そこで3回目は、サイトをメンテナンス中にし、WordPressがマルウェアを読み込む前に止まる状態を作ってから作業を進めました。

  1. サイトをメンテナンス中にする(WordPressは、プラグインやテーマを読み込む前の段階で「メンテナンス中」の表示を返し、停止する)
  2. 不正なファイルを隔離し、テーマの functions.php にある読み込み口を取り除く
  3. データベースに保存されていた本体の写しを削除する
  4. メンテナンス中を解除する

この順番でまとめて作業した結果、書き戻しは止まりました。5分後の再確認でも mu-plugins は空のままで、ほかのフォルダにも不審なファイルは戻っていませんでした。

その後、仕上げとして次の対応を行いました。

  • 有料テーマを開発元が配布する正規の最新版へ更新。更新前のファイルと比較し、なくなったのはテーマ自身の古い処理だけで、お客様が手を加えた部分は消えていないことを確認
  • WordPress本体とプラグインを最新に更新し、PHPも8.3以上へ
  • 不正な予約処理8件と、見覚えのない管理者4人を削除
  • ログインの鍵(wp-config.php の salt)を作り直し、すべてのログイン中の状態を無効に
  • 本体とプラグインの自動更新をオンに設定
  • 管理画面・サーバー・FTPのパスワード変更をお客様に依頼

なお、マルウェアのファイルはその場で削除せず、外から開けない隔離用のフォルダへ移しています。後から、どのファイルが不正だったのかを確かめられるようにするためです。初動で慌てて削除しない理由については、マルウェアに感染したときの確認と駆除の進め方でも説明しています。

運営者が自分で確かめられること

今回のような改ざんには、管理画面を見ているだけでは気づけないものもあります。それでも、次の点は運営者ご自身で確認できます。

  • 管理画面の「ユーザー」に、見覚えのない管理者がいないか(ただし、今回のように隠されている場合もある)
  • 「プラグイン」画面の上にある「使用必須」や「ドロップイン」の欄に、入れた覚えのないものが表示されていないか(エラーで管理画面に入れない場合は確認できません)
  • 知らないうちにプラグイン(特にファイル管理系)が増えていないか
  • FTPで確認したときに、wp-content の直下や uploads に、意味のない名前の .php ファイルがないか
  • WordPress本体・プラグイン・テーマが、長いあいだ更新されずに残っていないか

1つでも該当する場合や、「エラーのファイルを消せば直るはず」と考えている場合は、手を加える前にサイト全体を調べることをおすすめします。症状が現れているファイルだけを修正しても、今回のように裏で別の仕組みが動いていれば、すぐに元の状態へ戻ってしまいます。

ここまでのまとめ

  • 「管理画面に入れない」ときのエラーの文言に mu-plugins が出ていたら、マルウェアが原因のことがある
  • 削除しても戻るのは、テーマの functions.php などに書き戻しの読み込み口が残っているため
  • 書き戻しを止めるには、メンテナンス中にしたうえで、隔離・読み込み口の除去・データベースの掃除をまとめて行う
  • 隠された管理者はユーザー一覧を見ても気づけないため、データベースを直接確認する
  • 有料テーマは正規のファイルとの照合ができないため、開発元の最新版に入れ替える

ここからは、制作・保守を担当する技術者に向けて、調査と停止の要点を整理します。

技術者向け:書き戻し型マルウェアの調べ方

本体とプラグインは指紋で照合する

WP-CLIを利用できるサーバーなら、本体とwordpress.org配布のプラグインを公式のチェックサムで照合できます。ただし、感染が疑われるサイトでWP-CLIを実行すると、WP-CLI自身がマルウェアを読み込んでしまいます。そのため、–skip-plugins と –skip-themes を付けて実行します。

一致しないファイルや、本来は存在しないファイルが報告された場合は、そのファイルを調べます。有料テーマ・有料プラグインは照合の対象外です。開発元から正規の最新版を入手し、ファイルの差分を確認するか、そのまま入れ替えます。

読み込まれる場所を順に確認する

書き戻し型のマルウェアは、WordPressが必ず読み込む場所に入り込みます。今回見つかった場所をもとに、確認の順番を整理すると次のようになります。

  • wp-config.php:見慣れない define や require が追加されていないか
  • wp-content 直下のドロップイン(db.php・object-cache.php・advanced-cache.php):利用しているキャッシュの仕組みと合っているか
  • wp-content/mu-plugins:入れた覚えのないファイルが置かれていないか
  • 有効なテーマの functions.php:末尾に大量の処理が追加されていないか
  • uploads・cache・プラグインのフォルダ:画像やキャッシュしか置かれないはずの場所に .php が存在しないか
  • データベースの wp_options:大きなサイズの設定値や、予約処理(cron)の登録

ファイルの日付が偽装されることもあるため、更新日時だけを頼りに絞り込まないことが大切です。SSHを使えるなら、まず uploads 内の PHP ファイルを探すと効率よく調べられます。

隠された管理者はデータベースで数える

今回の隠しユーザーは、管理画面の一覧にも人数表示にも出ないようにされていました。プラグインの処理を経由せずに確認するには、データベースを直接調べます(テーブルの接頭辞 wp_ は、サイトに合わせて読み替えてください)。

管理画面に表示されている管理者の人数より多い場合は、隠されたユーザーが存在します。作成日が近いユーザーがまとまって見つかったら、その日付の前後に入れられたプラグインやファイルにも疑いを向けます。

データベースに残る本体の写しと予約処理

今回のマルウェアは、ファイルを消された場合に備え、自分の写しを wp_options に保存していました。設定値をサイズの大きい順に並べると、見慣れない名前のものが上位に現れます。

WP-CLIを使える場合は、wp cron event list –skip-plugins –skip-themes で予約処理を一覧表示できます。今回のサーバーはFTPでしか操作できなかったので、合言葉を付けた一度だけ動く mu-plugin を設置し、wp_clear_scheduled_hook で不正な予約処理を削除したあと、すぐに取り外しました。残っている予約処理が本体と正規のプラグインのものだけであることも確認しています。

技術者向け:止めるときの注意

今回のような書き戻し型は、ページの応答を返したあとも処理を続けます(register_shutdown_function や fastcgi_finish_request を使う)。その処理の中で本体があるかを確認し、なければ書き戻します。訪問者の画面には何も表示されないので、見た目から動作に気づくことはできません。

停止させる際は、次の点を押さえておきます。

  • WordPressのルート(wp-config.php と同じ場所)に .maintenance を置くと、wp-settings.php は advanced-cache.php・db.php・mu-plugins・プラグイン・テーマを読み込む前に停止する。ただし wp-config.php は先に読み込まれるため、改ざんの有無を別途確認する。作業終了後は .maintenance を必ず消す
  • メンテナンス中のうちに、読み込み口の除去、ファイルの隔離、データベースの写しの削除をまとめて済ませる
  • FTPしか使えず、公開フォルダの外へファイルを移せない場合は、wp-content 内に隔離用のフォルダを作る。.htaccess で外からのアクセスを拒否し、拡張子を .php から .txt に変更する
  • 解除してから数分おき、同じ場所を再確認する。ファイルが戻っていれば、別の読み込み口がまだ残っている
  • 仕上げとして salt を作り直し、すべてのログイン状態を切る。管理画面・サーバー・FTP・データベースのパスワードも変更する

よくある質問

マルウェアを消したのに戻ってくるのはなぜですか?

別の場所に、マルウェアを書き戻す「読み込み口」が残っているためです。今回の事例では、有料テーマの functions.php に読み込み口が仕込まれ、ページが開かれるたびに本体を書き戻していました。また、データベースにも本体の写しが保存されていました。

見覚えのない管理者がいたら、削除すれば大丈夫ですか?

管理者を削除するだけでは十分ではありません。作成元となった仕組み(プラグインやバックドア)が残っていると、再び作られます。サイト全体を調査して不正なファイルとデータベースの設定を取り除き、そのうえでパスワードと salt を変更してください。

mu-plugins にあるファイルは、すべて危険ですか?

いいえ。サーバー会社や制作会社、一部のプラグインが正規に配置する場合もあります。ただし、入れた覚えがないファイルや、名前と中身が一致しないファイルを見つけたときは、改ざんを疑って調べる価値があります。

侵入経路は分かりましたか?

今回の事例では、侵入経路を特定できていません。そのため、本体・プラグイン・テーマを最新にし、パスワードと salt を変更して、自動更新をオンにするところまで、まとめて対応しました。

「消しても戻る」「管理画面に入れない」ときはご相談ください

マルウェアを削除しても戻ってくる、見覚えのない管理者がいる、管理画面に入れなくなった。こうした場合は、当社へご相談ください。状況をうかがい、調査と復旧の範囲・費用を無料でお見積りします。費用は感染の範囲やサーバーで使える操作(SSHの有無など)によって異なるため、着手前にご提示します。

ログイン情報をお預かりする前でも、URL、ご利用中のサーバー会社、発生している症状をお知らせいただければ、進め方をご案内できます。

▶ 無料でお見積りを依頼する(お問い合わせ)

▶ トラブル対応のサービス内容を見る

復旧後の更新担当者が決まっていないサイトでは、当社の保守サポート(月額3,800円から)で、更新と定期的な点検をお任せいただけます。また、ログインできない症状をきっかけに感染が判明した別の事例を、WordPressにログインできない…その裏でマルウェアが動いていた話で紹介しています。

更新履歴

  • 2026年10月28日:公開(2026年10月に当社が対応した事例をもとに作成)

この記事を書いた人

矢部 敦

矢部 敦合同会社Edel Hearts 代表

WordPress専門の開発会社を経営。プラグイン開発・カスタマイズ・保守を専門とし、18時間におよぶUdemyのWordPress講座を開講。出典付きで回答するAIチャットボット「Edel AI Hybrid Chat」開発者。著書『WordPress はじめての最小プラグイン』(Kindle)。本ブログの記事は、実際の開発・運用で得た一次情報をもとに執筆しています。会社情報はこちら

この記事をシェア