日本のレンタルサーバー上で複数のWordPressサイトを守る、緊張感のあるサイバーセキュリティ editorial illustration。暗いサーバールームを背景に、中央に安全なサーバーラックと複数のWebサイトを示すモニター、手前に管理者が実行している読み取り専用の点検スクリプトを表すターミナル画面、PHPのバージョン確認、アップロード領域、管理者アカウント、改ざんファイルを象徴する小さな警告アイコンを配置する。古いPHPを示す赤い危険な光がサーバーへ侵入しようとする一方、更新済みのPHPを示す青緑色の防壁が攻撃を遮断している構図。WordPress固有のロゴやブランドは使わず、画面上の文字・数字・コード・ロゴは読めない抽象的な記号にする。専門的で信頼感のあるニュース記事用ビジュアル、リアルな3Dイラストと洗練されたインフォグラフィックの融合、青・黒・赤を基調にした高コントラスト、清潔で整理された構成、横長16:9、高解像度。

WordPress を最新にしても塞がらない ― PHP 本体の脆弱性に備える点検スクリプトを公開しました


PHP 本体に、認証なしで任意のコードを実行できる脆弱性が公開されました。WordPress やプラグインをいくら最新にしても塞がらない種類のもので、対策はサーバーの PHP を上げることです。弊社では、レンタルサーバー上の WordPress をまとめて点検するスクリプトを GitHub で公開しました。この記事では、何が起きているのかと、自社サイトの確認方法をご紹介します。

何が起きているのか

今回の脆弱性(CVE-2026-109618 / CVE-2026-109619)は、WordPress でもプラグインでもなく、PHP そのものにあります。PHP はほぼすべてのレンタルサーバーで WordPress を動かしている土台のプログラムです。

公開されている情報によると、影響と対策は次のとおりです。

項目内容
影響を受けるバージョンPHP 5.4.0 〜 8.5.11
修正版PHP 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12 以降
攻撃に必要な権限なし(ログイン不要)
侵入口session.upload_progress(ファイルアップロードの進捗を扱う PHP の標準機能)
応急処置session.upload_progress.enabled = Off にする

問題は、WordPress 側に穴がなくても成立する点です。本体もプラグインも最新で、ログイン画面を守っていても、PHP が古ければ攻撃が通ります。普段の「WordPress を最新に保つ」という対策では防げません。

攻撃が成功すると、サーバー上で任意のプログラムを実行されます。実際の被害としては、バックドア(侵入口)となる PHP ファイルの設置、管理者アカウントの追加、サイト閲覧者を別サイトへ飛ばす改ざんなどが典型です。

まずやるべきことは一つで、サーバーの PHP を修正版に上げることです。多くのレンタルサーバーでは管理画面からバージョンを切り替えられます。

「うちは大丈夫?」の確認が意外と難しい

「PHP のバージョンを見ればいい」――そのとおりなのですが、ここに落とし穴があります。レンタルサーバーでは、SSH でログインして見る PHP と、サイトを表示している PHP が別バージョンだったりします。

サーバーにログインして php -v を実行するとコマンドライン用の PHP のバージョンが返りますが、実際にサイトを配信しているのは別の PHP です。さらに、サーバーに複数ドメインを置いている場合、ドメインごとに PHP のバージョンが違うこともあります。

WordPress の管理画面なら、ツール → サイトヘルス → 情報 → サーバーで「PHP バージョン」を確認できます。これが「そのサイトを動かしている PHP」の正しい値です。

ただしサイトが 10 も 20 もあると、管理画面を 1 つずつ開いて見て回るのは現実的ではありません。そこで今回のスクリプトでは、サイト自身が返す HTTP ヘッダー(X-Powered-By)から、サイトヘルスと同じ値をコマンドラインで取得しています。サイトの数だけ自動で繰り返し、CLI 側と Web 側を分けて表示します。

公開したスクリプト

サーバーに SSH でログインし、次の 1 行を実行するだけです。指定したフォルダー配下の WordPress を自動で見つけて、サイトごとに点検します。

curl -s https://raw.githubusercontent.com/web-soudan/wp-security-audit-on-jp-hosting/refs/heads/main/check-intrusion.sh | bash -s -- /home/example

ファイルをダウンロードしてから実行することもできます。

bash check-intrusion.sh /home/example            # 通常の実行

確認するのは次の項目です。「サーバーが安全か」と「すでにやられていないか」を一度に見ます。

確認対象内容
PHP のバージョンCLI 側と Web 側を分けて判定。修正版かどうかを自動で判断
応急処置の設定session.upload_progress が有効のままになっていないか
アップロードフォルダー本来あるはずのない PHP ファイル、写真.jpg.php のような二重拡張子、画像に埋め込まれた PHP
本体ファイルの改ざんWordPress 公式の配布物と 1 ファイルずつ照合(チェックサム検証)
最近変更されたファイルどの構成要素がいつ変わったか。更新作業と突き合わせできる形で表示
更新日時の偽装攻撃者が日付を過去に戻した痕跡(かなり有効な手がかりです)
wp-config.php / .htaccess不審なコードの混入、拡張子の偽装、外部への転送、緩い権限
ユーザーと権限管理者一覧、直近に追加された管理者、アプリケーションパスワード
サイト設定誰でも登録できる設定にされていないか、サイト URL の書き換え

検出したものには、すべて更新日時を並べて表示します。「この日に作業した記憶がない」が判断の手がかりになるためです。

スクリプトは読み取り専用です。ファイルやデータベースを書き換えたり、マルウェアを削除したりはしません。検出と報告だけを行います。

実行結果の読み方

確認が必要な行には [!] が付きます(画面上では赤い太字)。[i] は参考情報です。

[0] サーバーの PHP(CLI)と緩和設定
[!] CLI(php -v): PHP 8.3.30 は未修正です(修正版: 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12)
[!] session.upload_progress.enabled = On。侵入口になるため Off を推奨
--------------------------------------------------
WordPress   : /home/example/example.com/public_html
SiteURL     : https://example.com

[1] このサイトの PHP バージョン
[!] Web 側(X-Powered-By): PHP 8.2.34 は未修正です

[2] uploads 内の実行可能ファイル
[!] uploads に実行可能ファイルがあります(Web シェル設置の典型)
      2026-10-21 03:14  .../wp-content/uploads/2026/10/shell.php

[6] ユーザー・権限・サイト設定
[!] 直近 3 日に登録された管理者がいます
      2026-10-21 03:10:52  wp_support  [email protected]
--------------------------------------------------
検査したサイト: 2 件
  [!]    9 件  /home/example/example.com/public_html
  [ ]    0 件  /home/example/other.example.jp/public_html

最後に、どのサイトにいくつ検出があったかを一覧で示します。サイト数が多いサーバーでも、出力をさかのぼらずに「どこを見ればいいか」が分かるようにしています。

なお、検出=侵害確定ではありません。たとえば「最近変更されたファイル」は、単に前日にプラグインを更新しただけかもしれません。逆に、何も検出されなければ安全、とも言い切れません。あくまで「典型的な痕跡があるか」の一次点検としてご利用ください。

「警告だらけ」にしないために

この種のツールで一番困るのは、警告が多すぎて読む気がなくなることです。実際のサーバーで動かして、次のような調整を行いました。

更新作業と改ざんを分ける。 テーマを 1 回更新すると、数千のファイルが一斉に変わります。そのまま並べると 2,500 行の警告になり、肅清です。そこで「どのプラグインが何件変わったか」にまとめ、数ファイルだけが変わっている箇所を個別に出すようにしました。改ざんは「一部だけが変わっている」形で現れるからです。

画像の中身を見るときの判定を厳密に。 画像に PHP コードを埋め込む攻撃があるため中身を検査していますが、当初の判定では普通のスクリーンショット 25 枚を誤検知しました。PHP の目印にする文字列が短すぎて、圧縮された画像データに偶然現れていたためです。

正規のプラグインを警告しない。 セキュリティプラグインの Wordfence は、マルウェアと同じ仕組み(全リクエストの前に自分を読み込ませる)を正当な目的で使います。中身が Wordfence の標準形であることを確かめた場合だけ、参考表示に回すようにしました(改ざんされていれば警告に戻ります)。

「確認できなかった」を「問題なし」と書かない。 これが一番大事だと考えています。データベースに接続できなかったときや、サイトの応答が遅くてタイムアウトしたときに「該当なし」と表示すると、安全だと誤解させてしまいます。未確認は「未確認」と明示するようにしました。

見つかったときの対応

順番が大事です。ファイルを消すだけでは、同じ穴から再度入られて終わります。

  1. PHP を修正版に上げる(8.2.35 / 8.3.36 / 8.4.27 / 8.5.12 以降)。すぐに上げられない場合の応急処置は session.upload_progress.enabled = Off
  2. 不審なファイル・管理者アカウント・アプリケーションパスワードを精査して除去する
  3. 認証情報(データベース・管理者・API キー・FTP)をすべて変更する

ついでに触れておくと、アプリケーションパスワードは見落とされがちです。これは外部ツールから接続するための鍵で、管理者パスワードを変更しても有効のままです。攻撃者に発行されていると、パスワードを変えたつもりでも入り続けられます。

ほかのスクリプト

同じリポジトリには、日本のレンタルサーバーでの運用を想定したスクリプトをまとめています。

スクリプト用途
check-intrusion.sh今回ご紹介した侵害の一次点検
check-wp.shサイト情報の収集と、改ざん検知(チェックサム検証)
check-sc.sh削除しても自分を再生する型のバックドアの痕跡検査
check-wpress.shAll-in-One WP Migration のバックアップ(.wpress)の棚卸し
check-log-and-file-sakura.sh / -xserver.shアクセスログから攻撃の痕跡を検索
update-wp-all.sh / update-minor-wp-all.shサーバー内の WordPress を一括で更新

リポジトリはこちらです。

web-soudan/wp-security-audit-on-jp-hosting

ご利用にあたって

検査系のスクリプトは読み取り専用ですが、サーバー上でコマンドを実行することに変わりはありません。内容をご確認のうえ、自己責任でご利用ください。更新系のスクリプトはサイトを実際に変更するため、必ずバックアップを取ってから実行してください。

「自社のサイトが心配」「確認したいがサーバー操作に不安がある」といった場合は、お気軽にご相談ください。


トップへ戻る