マルウェアの概要
このファイルは、WordPress公式プラグイン「File Manager Advanced」のメインPHPファイルを、単体のスクリプトとして設置したものです。一見すると正規プラグインのコードに見えますが、
- 認証機能が無効化された状態
- ファイル操作/データベース操作/PHPコード実行機能を1ファイル内に内包
しており、実質的にはフル機能の「Webシェル(ファイルマネージャ型バックドア)」として動作します。
攻撃者がこのファイルのURLさえ知っていれば、WordPressのログイン権限がなくても、ほぼCパネル相当の操作が可能になります。
特徴
このマルウェア(不正設置された File Manager Advanced)の主な特徴は次のとおりです。
- 認証機能がOFFになっている
- コード冒頭で、以下のようなJSON設定が埋め込まれています:
"authorize":"0"(認証をしない)"login":"admin""password":"phpfm"
authorizeが0のため、ログインフォーム自体をスキップし、誰でもアクセスできる状態になっています。
- コード冒頭で、以下のようなJSON設定が埋め込まれています:
- フル機能のファイルマネージャ
- 任意ディレクトリの閲覧
- ファイルのアップロード/ダウンロード
- コピー/移動/リネーム/パーミッション変更(chmod)
- ZIP圧縮/解凍
- 画像のプレビュー表示
- テキストエディタ(シンタックスハイライト付き)によるファイル編集
- PHPコンソール機能(evalによる任意コード実行)
- 画面上からPHPコードを入力し、サーバー側で
eval()して結果を表示する機能を持っています。 - コード内では
fm_php()という関数にまとめられており、ob_start()で出力バッファリングeval(trim($string));でPHPを実行- 実行結果を文字列として返却
- これは典型的な「PHP Webシェル」の実装パターンで、サーバー上で自由にコマンド/スクリプトを実行できます。
- 画面上からPHPコードを入力し、サーバー側で
- SQLコンソール機能(データベースの直接操作)
- MySQLに接続し、任意のSQLクエリを実行できるコンソールを内蔵しています。
fm_sql_connect()/fm_sql()などの関数で、mysqli_connect()によるDB接続- 任意のSQLの実行
- 結果の表示
- WordPressのデータベースを書き換えたり、ユーザー一覧・ハッシュ化されたパスワードの取得などが可能です。
- HTTPプロキシ機能(外部サイトの経由表示)
curl_exec()を用いて外部URLにアクセスし、その結果をこのファイル経由で表示する「簡易プロキシ」機能があります。- これは、外部の攻撃用スクリプトを中継したり、フィッシング画面を埋め込むのに悪用されるリスクがあります。
- 自己編集・自己保護機能
- このファイル自身や、他のファイルの編集時に、
file_put_contents()とtouch()を使ってタイムスタンプを復元するロジックがあります。 - これにより、改ざん日時の痕跡を目立ちにくくすることができます。
- このファイル自身や、他のファイルの編集時に、
無毒化したコードの一部をサンプルで表記
以下は、問題となる「PHPコンソール」部分を、安全な形に書き換えたサンプルです。元のコードでは eval() により任意のPHPコードを実行していましたが、その部分を完全に無効化しています。
// 危険なPHPコンソール機能(無毒化済みサンプル)
function fm_php($string) {
// 本来はここで eval(trim($string)); を実行していた
// 任意のPHPコードが実行されるため、深刻なセキュリティリスクとなる
// 無毒化:実行せず、固定メッセージを返すだけに変更
return 'PHPコンソール機能は安全上の理由により無効化されています。';
}
もう1つ、認証設定の一部も、安全な形に変更したイメージを示します。
// 認証設定の安全な例(イメージ)
$authorization = json_encode([
'authorize' => 1, // ログイン必須
'login' => 'change_me_admin', // 推測されにくいID
'password' => '強固なパスワードを設定',
'cookie_name' => 'fm_user',
'days_authorization' => 7,
]);
実際の感染ファイルでは、これらの値が固定&公開状態 (authorize:0, login:admin, password:phpfm) となっており、第三者に丸見えのマスターキーを配布しているようなものになっています。
感染ファイルの完全可読化ログ
このファイルは難読化されているわけではなく、1つのPHPファイル内にすべての処理がベタ書きされています。その構造を安全な範囲で整理すると、概ね次のようになります。
- プラグインヘッダー部
Plugin Name: File Manager AdvancedVersion: 5.2.12- Author情報や説明文を含み、正規プラグインに見せかけています。
- 設定・定数定義部
$authorization:認証のON/OFF、ログインID/パスワード、Cookie名、有効期間などをJSON文字列で保持。$fm_config:- デフォルトの表示ディレクトリ
- フォルダサイズを表示するか
- 画像プレビューのON/OFF
- PHP/SQLコンソールの有効化
- プロキシ機能や
phpinfo()へのリンク表示
など、多数の設定項目を配列で保持。
- パス・言語・環境初期化部
realpath('.')や$_REQUEST['path']から、現在操作対象のディレクトリを決定。- 言語ファイルの切り替え(
$default_language = 'ru'など)。 - PHPバージョンチェックや、Phar拡張の有無に応じた処理分岐。
- 認証処理部
$auth = json_decode($authorization, true);で設定を配列に展開。$auth['authorize']が1の場合のみログインフォームを表示し、Cookie でセッション管理。- 今回のファイルでは
authorize:0のため、このブロックは事実上スキップされ、常に誰でも利用可能な状態。
- ファイル・フォルダ操作ロジック
copy,move,rename,delete,chmodなどのアクションを、$_REQUESTの内容に応じて実行。file_put_contents()によるファイル編集機能。- ZIPアーカイブの作成/展開処理(
PharDataやgz処理を含む)。
- コンソール機能(SQL/PHP)
- 画面からの入力を受け取り、
res_lng = 'sql'の場合:fm_sql()を呼び出し、任意SQLを実行。res_lng = 'php'の場合:fm_php()を呼び出し、任意PHPをeval()で実行。
- 実行結果を
<pre>...</pre>でHTML表示。
- 画面からの入力を受け取り、
- HTTPプロキシ機能
?proxy=trueなどのパラメータで起動。curl_exec()で外部サイトにアクセスし、hrefやsrcのURLを書き換えながら、出力をブラウザに返却。
- フッタ・情報表示部
- PHPバージョン、php.iniのパス、ページ生成時間などをフッターに表示。
- GitHubリンクや
phpinfo()へのリンクもここで制御されています。
このように、1ファイルの中に「ファイルマネージャ」「DBクライアント」「PHPシェル」「HTTPプロキシ」がすべて詰め込まれた構成となっており、攻撃者にとって非常に扱いやすいバックドアです。
危険性
このマルウェア(不正設置された File Manager Advanced)によるリスクは、次の通りです。
- サイト全体の乗っ取りが可能
- 任意ファイルのアップロード・編集・削除ができるため、
- テーマやプラグインへの追加バックドア埋め込み
wp-config.phpの書き換え.htaccessによるリダイレクト・SEOスパム
などが自由に行えます。
- 任意ファイルのアップロード・編集・削除ができるため、
- データベース情報の漏えい・改ざん
- SQLコンソールから、ユーザー情報や投稿データを直接閲覧・改ざんできます。
- 管理者アカウントのパスワードハッシュを取得し、オフラインで総当たり攻撃をされる可能性もあります。
- サーバーリソースの不正利用
- PHPコンソール経由で外部スクリプトをダウンロードし、ボットネットや迷惑メール送信、DDoS攻撃の踏み台にされるリスクがあります。
- 検知のしづらさ
- コード自体はオープンソースプラグインとほぼ同じであり、難読化もされていないため、
- 一見「正規のプラグインファイル」に見える
- ファイル名も
file.phpやmanager.phpなど、ありがちな名前が付けられる
- そのため、ログやファイル一覧をざっと見るだけでは不正ファイルだと気づきにくいという特徴があります。
- コード自体はオープンソースプラグインとほぼ同じであり、難読化もされていないため、
- SEO・ブランドへのダメージ
- 不正なリダイレクトやSEOスパム、フィッシングページの設置に悪用された場合、
- 検索結果からの評価低下
- Googleによる「このサイトは安全ではありません」警告
- 顧客・取引先からの信頼失墜
につながります。
- 不正なリダイレクトやSEOスパム、フィッシングページの設置に悪用された場合、
実際の感染事例
本ファイルのような「ファイルマネージャ型バックドア」は、次のようなパターンで設置されることが多いです。
- 脆弱なプラグイン/テーマから侵入し、
/wp-content/uploads/配下に設置 - 正規のプラグインと同名/類似名で
wp-content/plugins/配下に混入 - マルチサイト構成やサブディレクトリ(例:
/old/や/dev/)にひっそりと設置
サイト運営者側の画面(WordPress管理画面)には一切表示されないため、サーバー側のファイル一覧やセキュリティスキャンを行わない限り、見つけにくい種類のマルウェアです。
駆除と復旧の方法
1. 感染ファイルの特定と削除
- サーバー上で、見慣れない
file.php,manager.php,fm.phpなどのファイルを検索します。 - 内容を確認し、
Plugin Name: File Manager Advancedのヘッダーfm_php,fm_sql,enable_php_console,enable_sql_consoleなどの文字列
が含まれている場合、本レポートと同系統のマルウェアと判断できます。
- バックアップを取得した上で、該当ファイルを削除します。
2. コア・プラグイン・テーマの正規ファイルでの上書き
- WordPress本体を最新版へ更新し、必要に応じて公式パッケージから再展開します。
- 使用中プラグイン・テーマについても、公式配布元から再インストールし、改ざんされていないか確認します。
3. データベースの点検
- 管理者ユーザー一覧を確認し、不審なアカウントがないかチェックします。
- パスワードをすべて変更します(特に管理者アカウント)。
- 不審なオプション値(
wp_optionsテーブルのリダイレクト設定や外部スクリプト読み込みなど)を確認します。
4. ログ・アクセス履歴の確認
- アクセスログから、
- このファイルに対するアクセス元IP
?proxy=,?phpinfo=,phprunなどのリクエスト
などを確認し、攻撃の範囲と期間を把握します。
再発防止のセキュリティ対策
- 不要なファイルマネージャ系プラグインを使わない
- 機能的に便利な反面、「侵入後に悪用されやすい」代表的なプラグイン群です。
- どうしても必要な場合は、
- 限定的なサーバー環境のみ
- 強固なパスワード
- 二要素認証
などとセットで利用し、常用は避けることを推奨します。
- サーバーファイルの定期スキャン
- セキュリティプラグインや外部のマルウェアスキャナを活用し、
eval(やbase64_decode(を含む不審なファイルfm_php,file managerなど特定キーワードを含むファイル
を定期的にチェックします。
- セキュリティプラグインや外部のマルウェアスキャナを活用し、
- 脆弱なプラグイン/テーマの整理
- 使っていないテーマ・プラグインは削除し、
- 利用中のものは常に最新版へ更新します。
- 管理画面以外からの編集機能を制限
wp-config.phpにてDISALLOW_FILE_EDITをtrueに設定し、管理画面からのテーマ・プラグイン編集を無効化しておくと、万一侵入されても被害を抑えやすくなります。
- バックアップ体制の整備
- ファイルとデータベースを分けて、世代管理されたバックアップを取得しておくことで、感染後も安全な時点へ復元しやすくなります。
まとめ:早期対応がSEOと信頼回復のカギ
- 本ファイルは、一見正規プラグインに見える「File Manager Advanced」を、認証なしで使えるようにしたファイルマネージャ型バックドアです。
- ファイル操作・DB操作・PHPコード実行・プロキシ等、サイト乗っ取りに十分な機能を1ファイルに内包しています。
- 発見した場合は、ただちに削除し、コア/プラグイン/テーマの正規ファイルによる上書き、ユーザー・DBの点検、パスワード変更を行う必要があります。
- さらに、ファイルマネージャ系プラグインの恒常利用を見直し、脆弱なプラグイン整理・バックアップ体制の強化を進めることで、再発リスクを大きく下げることができます。
著者情報
WordPressのセキュリティ復旧・運用支援を専門する CreativeStudio樂のエンジニアユニット によって執筆されております。
WordPressのマルウェア駆除、改ざん復旧、セキュリティ強化の豊富な実務経験に基づき、企業サイトやブログ運営者が安心してサイトを運営できるよう支援しています。
