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 の標準形であることを確かめた場合だけ、参考表示に回すようにしました(改ざんされていれば警告に戻ります)。
「確認できなかった」を「問題なし」と書かない。 これが一番大事だと考えています。データベースに接続できなかったときや、サイトの応答が遅くてタイムアウトしたときに「該当なし」と表示すると、安全だと誤解させてしまいます。未確認は「未確認」と明示するようにしました。
見つかったときの対応
順番が大事です。ファイルを消すだけでは、同じ穴から再度入られて終わります。
- PHP を修正版に上げる(8.2.35 / 8.3.36 / 8.4.27 / 8.5.12 以降)。すぐに上げられない場合の応急処置は
session.upload_progress.enabled = Off - 不審なファイル・管理者アカウント・アプリケーションパスワードを精査して除去する
- 認証情報(データベース・管理者・API キー・FTP)をすべて変更する
ついでに触れておくと、アプリケーションパスワードは見落とされがちです。これは外部ツールから接続するための鍵で、管理者パスワードを変更しても有効のままです。攻撃者に発行されていると、パスワードを変えたつもりでも入り続けられます。
ほかのスクリプト
同じリポジトリには、日本のレンタルサーバーでの運用を想定したスクリプトをまとめています。
| スクリプト | 用途 |
|---|---|
check-intrusion.sh | 今回ご紹介した侵害の一次点検 |
check-wp.sh | サイト情報の収集と、改ざん検知(チェックサム検証) |
check-sc.sh | 削除しても自分を再生する型のバックドアの痕跡検査 |
check-wpress.sh | All-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
ご利用にあたって
検査系のスクリプトは読み取り専用ですが、サーバー上でコマンドを実行することに変わりはありません。内容をご確認のうえ、自己責任でご利用ください。更新系のスクリプトはサイトを実際に変更するため、必ずバックアップを取ってから実行してください。
「自社のサイトが心配」「確認したいがサーバー操作に不安がある」といった場合は、お気軽にご相談ください。

