PHP 脆弱性:PHP2Shellのパッチと PHP バージョンの確認(WordPress)

公正取引委員会の広告文 Ver 3.1
公正取引委員会の広告文 Ver 3.2(モバイル専用)
テスト環境 RHEL系AlmaLinux 9.8PHP 8.3 · WordPress 7.1.32026-10-22 確認

PHP2Shellは、2026年10月21日にパッチが公開されたPHPの脆弱性2件(CVE-2026-109618・CVE-2026-109619)の名前です。ログインしていないリクエストでもサーバー上でコードが実行されるリモートコード実行の欠陥のため、サイトが使っているPHP バージョンを確認し、パッチ適用版に上げることが先決です。WordPress 7.1.3が入ったNginx + Apache構成のサーバーで、サイトヘルスからPHP バージョンを確認し、phpパッケージだけをパッチ適用版に上げてから再確認した手順です。

1️⃣ PHP 脆弱性 PHP2Shell:欠陥の仕組みと影響範囲

この欠陥はWordPressのコードが実行される前にリクエストを読み込むPHPエンジンの中にあるため、プラグインとテーマを最新に保っていても、PHPを上げなければそのまま残ります。CERT-EUの勧告によると2件ともCVSS 9.2で、技術的な詳細が公開されて議論されており、初期の概念実証(PoC)コードも出回り始めました。

CVE-2026-109618は、リクエストがメモリ上限(memory_limit)を超えて中断されたとき、半分しか初期化されていないリクエストデータを後処理が正常なデータとして扱ってしまう欠陥です。CVE-2026-109619は、致命的エラーのあとに解放されたメモリの状態が残り、同じワーカーが処理する次のリクエストで初期化前に再び使われてしまう欠陥です。

php.netの告知によると、Webリクエストを処理するすべてのPHPのインストールが対象で、そのうちApache mod_phpを最も危険な構成としています。ログインなしのリクエスト1つで、アプリケーションのコードが実行される前に攻撃が発動するデモがmod_phpで行われたためです。

PHPの実行方式影響備考
Apache mod_php🔴 影響あり・最も危険ログインなしのリクエスト1つで、アプリケーションのコードが実行される前に攻撃が発動したデモ
PHP-FPM🔴 影響あり—
php-cgi🔴 影響あり—
FrankenPHP🔴 影響あり—
LiteSpeed🔴 影響あり—

修正版は8.2.35、8.3.36、8.4.27、8.5.12で、これより低い8.2〜8.5系はすべて影響を受けます。PHP 8.1以下はPHPプロジェクトのサポートが終わった系列のため公式のパッチ適用版がなく、ディストリビューションやホスティング会社が移植した修正(バックポート)で対応します。

CISAが10月21日に告知した時点では実際の悪用は確認されていませんでしたが、CISAはパッチを当てずに放置すると危険だとして、インターネットに公開されているシステムから直ちにパッチを当てるよう勧告しました。CERT-EUは同日の勧告で、概念実証コードが出回り始めたことで、攻撃者がすでに悪用している可能性が高まったと判断しました。

2️⃣ PHP バージョンの確認:サイトヘルス › 情報 › サーバー

欠陥のことを知っていても、自分のサイトがどのPHP バージョンで実行されているか分からなければ、やるべきことは決まりません。管理画面で [ツール › サイトヘルス]を開き、[情報]タブの[サーバー]セクションを展開すると、[PHP バージョン]の行に、サイトのリクエストを実際に処理しているPHPのバージョンが表示されます。

サイトヘルスの情報タブ画面:左メニューのツール › サイトヘルス、サーバーセクションのサーバー構造・Web サーバー・PHP バージョン・PHP SAPIの行 — PHP 脆弱性 PHP2Shellのパッチ確認の基準となるPHP バージョン(WordPress 7.1.3)

[PHP バージョン]の行のすぐ下にある[PHP SAPI]の行はPHPの実行方式を表し、fpm-fcgiはPHP-FPM構成です。ここでは[サーバー]セクションの[PHP バージョン]・[PHP SAPI]の2行だけを見ます。

🧩 PHP2Shellの攻撃の流れ
解説ダイアグラム
①ログインなしのリクエスト誰でも送れるWebリクエスト
②特別に細工したリクエストPHPがWordPressのコードより先に読む
③PHPの欠陥メモリ不足 → 作りかけのデータをそのまま使うCVE-2026-109618終わったリクエストの状態を次のリクエストが使うCVE-2026-109619
④サーバーでコード実行サイトの乗っ取り
✅ 修正版ではこの流れが止まる8.2.35 · 8.3.36 · 8.4.27 · 8.5.12

攻撃はログインなしのリクエストから始まります。特別に細工したリクエストをPHPがWordPressのコードより先に読む段階で2つの欠陥のどちらかに触れ、サーバーでのコード実行につながります。修正版はこの流れを止めるので、やることはサイトのPHPを修正版以上に上げることです。

ターミナルの[php -v]は、コマンドラインの既定のPHPのバージョンしか表示しません。cPanelのEA-PHPやCloudLinuxのalt-phpのように1台のサーバーに複数のバージョンのPHPを入れる構成では、サイトが使うバージョンと違うことがあります。そのため基準はサイトヘルスの[PHP バージョン]の値にします。

php -v
PHP 8.3.xx (cli) (built: Jun  3 2025 17:17:57) (NTS gcc x86_64)

3️⃣ PHP 8.2未満なら:ホスティング会社にバックポートの適用を確認し、なければ依頼

サイトヘルスの[PHP バージョン]が8.2未満(7.x・8.0・8.1)なら、php.netの公式なパッチ適用版はありません。php.netのサポート対象バージョンの表(2026年10月22日確認)では、サポート中の系列は8.2・8.3・8.4・8.5の4つだけで、8.1以下の公式版にはセキュリティパッチが出ません。

その代わり、ディストリビューションやホスティング会社が、バージョン番号はそのままに修正だけを移植したパッケージ(バックポート)を出すことがあります。あるマネージドホスティングのテストサーバーの7.4.33・8.0.30・8.1.34パッケージがその例です。変更履歴に[Backported from 8.2.35 — CVE-2026-109618, CVE-2026-109619]という行が入っていました。

バージョン番号が同じでも、修正が入っているかはパッケージの変更履歴でCVE番号を探して確認します。Debian・Ubuntu系では[zcat /usr/share/doc/php8.2-cli/changelog.Debian.gz | grep 109618]のように探します。RPM系は[rpm -q --changelog php-common | grep 109618]の形で、パッケージ名のバージョン番号はサイトが使うバージョンに合わせます。

そのため8.2未満なら、まずホスティング会社にバックポートが適用されているかを確認し、適用されていない、または確認できない場合は、サポート対象のバージョン(8.2以上)に上げるよう依頼します。上げたあとはサイトヘルスの[PHP バージョン]の値で再確認します。

CISAは、8.1以下を使っている組織がすぐにアップデートできない場合、パッチ適用かアップグレードまでPHPベースのシステムをオフラインにしておくよう勧告しました。

自分でサーバーを運用していて8.1以下を使っているなら、ディストリビューションのバックポートパッケージを入れるか、PHPのセキュリティチームが出した7.4・8.0・8.1用のソースパッチを適用できます。それでもサポートが終わった系列なので、サポート対象のバージョンに上げるのが根本的な対応です。

4️⃣ PHP 8.2以上なら:パッチ適用版にアップデートして再確認

8.2以上でもパッチ適用版より低いなら、PHP自体を上げます。マネージドホスティングや共有ホスティングでは事業者がサーバー全体にパッチを適用するので、事業者の告知や問い合わせで適用状況とビルドを確認し、サイトヘルスの[PHP バージョン]が変わったかを見ます。Cloudwaysはステータスページの告知によると、10月21日22:19 UTCにサポート中の全PHPバージョン(5.6〜8.4)へのパッチ適用を始めました。10月22日10:11 UTCには完了を知らせています。

自分で運用しているサーバーは、php.netの告知どおりディストリビューションやLTSベンダーのリポジトリのパッケージで上げます。アップデート前にプレビューで変わるパッケージの一覧を確認し、phpで始まるパッケージだけが上がってほかのパッケージがついてこないかを見て、OSのほかのアップデートと混ぜないようにします。

dnf upgrade --assumeno 'php*'
Dependencies resolved.
================================================================================
 Package       Architecture  Version         Repository  Size
================================================================================
Upgrading:
 php           x86_64  8.3.xx-1.…        …       1.9 M
 php-cli       x86_64  8.3.xx-1.…        …       5.6 M
 php-common    x86_64  8.3.xx-1.…        …       1.3 M
 php-fpm       x86_64  8.3.xx-1.…        …       1.9 M
 (php-gd・php-intlなどの拡張パッケージの行は省略)

Transaction Summary
================================================================================
Upgrade  xx Packages
dnf upgrade 'php*'
Upgraded:
  php-8.3.xx-1.….x86_64
  php-cli-8.3.xx-1.….x86_64
  php-common-8.3.xx-1.….x86_64
  php-fpm-8.3.xx-1.….x86_64
  (拡張パッケージの行は省略)

Complete!

今回の実測では、phpで始まるパッケージだけがパッチ適用版に上がり、パッケージのインストールが終わるとphp-fpmが自動で再起動しました。修正版はphp-fpmのワーカーが再起動して初めて反映されるため、自動再起動がない環境では[systemctl restart php-fpm]を自分で実行します。

上げたあとは、[php -v]とサイトヘルスの[情報]タブの[PHP バージョン]の行がどちらもパッチ適用版以上かを見て、php-fpmサービスの状態とサイトの応答まで確認します。コマンドラインの値だけが変わり[PHP バージョン]の値がそのままなら、php-fpmを再起動してから再確認します。

サイトヘルスの情報タブ画面:アップデート後にサーバーセクションのPHP バージョンの行がパッチ適用版以上かを再確認 — 左メニューのツール › サイトヘルス、サーバーセクションのPHP バージョン・PHP SAPIの行(WordPress 7.1.3)

アップデートのあとも、同じ[ツール › サイトヘルス]の[情報]タブで[サーバー]セクションを展開して[PHP バージョン]の行を見ます。この値が上げたバージョンに変わっていれば、php-fpmのワーカーまで新しいバージョンで実行されています。

php -v
PHP 8.3.xx (cli) (built: Oct 19 2026 14:00:34) (NTS gcc x86_64)
systemctl is-active php-fpm
active
curl -s -o /dev/null -w '%{http_code}\n' 'https://example.com/?r=1'
200

バージョン番号そのものが上がるパッケージは新しいバージョン番号で、番号をそのままにしたバックポートパッケージは変更履歴のCVE番号で、パッチが当たったかを確認します。今回のサーバーは前者だったため[rpm -q --changelog php-common]にCVE番号の行はなく、変更履歴の最初の行の新しいバージョン番号で確認しました。

5️⃣ すぐに上げられないとき:php.netが案内する暫定対策

すぐに上げられないサーバー向けに、php.netは以下の設定を暫定対策として案内しつつ、これらの対策は特定の攻撃経路を減らすだけで、インストールを安全にするものではないと明記しました。メモリ上限をRLIMIT_ASやRLIMIT_DATAで代わりに設定すると、かえって脆弱なメモリ割り当ての失敗を引き起こすことがあるため使わないようにとも書いています。

設定値設定場所防ぐもの
memory_limit-1FPMプール・Apache設定のphp_admin_value(アプリケーションが戻せないように)CVE-2026-109618・メモリ上限の失敗経路(完全ではない)
post_max_size8M(アップロードが必要なら32M)・upload_max_filesizeはそれより小さくphp.ini・プール設定CVE-2026-109618
session.upload_progress.enabled0 + すべてのワーカーを再起動php.ini・FPMプール・サーバー設定(ini_set()・.user.iniは不可)CVE-2026-109619・確認済みのセッション経路のみ
fatal_error_backtraces0 + すべてのワーカーを再起動(PHP 8.5のみ)上と同じCVE-2026-109619・確認済みのバックトレース経路のみ

php_admin_valueはアプリケーションが戻せないサーバー側の設定のため、共有ホスティングの利用者は自分で変えられないことが多く、その場合も結局はホスティング会社に依頼することになります。php.netは、Webサーバーやプロキシの段階でも、リクエスト本文のサイズと入力フィールドの数、multipartの分割数、ヘッダーの数、ネストの深さに上限を設けるよう案内しています。

🔢 FAQ & おすすめコンテンツ

WordPressの自動更新が扱うのはコアとプラグイン、テーマ、翻訳だけで、PHPはサーバーにインストールされたプログラムなので、サーバー管理者かホスティング会社が上げます。コア・プラグイン・テーマの自動更新は WordPress の更新 画面とプラグイン・テーマの画面でそれぞれオンにし、それらの画面にPHPのバージョンは表示されません。

技術的な詳細の全文は、php.netの告知がCVE番号の横にリンクしているGitHubのセキュリティアドバイザリー2件にあります。CVE-2026-109618はGHSA-w8hw-w9fx-j79w、CVE-2026-109619はGHSA-6wmf-4rv5-p3rpです。CERT-EUの勧告も同じ2件を参考文献に挙げており、攻撃の再現手順の詳細はこの記事に載せていません。

CISAは、PHPのワーカープロセスがシェルを起動したりツールをダウンロードしたりする動きを監視するよう案内しています。パッチを当てるまでは、Webアプリケーションファイアウォールがある程度の防御になり得るとも書いています。PHPはほかのソフトウェアの部品として組み込まれて目立たないことが多いため、PHPが実行されているシステムの一覧づくりから始めるよう勧めました。

ℹ️ 提携について
当サイトのコンテンツにはアフィリエイトリンクが含まれています。訪問者がこのリンクを通じて商品やサービスを購入すると、当サイトは販売元から手数料を受け取ります。この過程において、購入者が支払う金額(イベント割引適用で金額が下がります↓)は上昇しません。掲載されている価格・割引・在庫情報は作成時点のものであり、実際とは異なる場合がありますので、ご購入前に販売元にて最終確認をお願いいたします。商品の選定および評価は独自の基準に基づいて行われており、手数料の支払いの有無は紹介順や評価内容に影響を与えません。

コメントを残す

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

人間であることを証明してください: 8   +   4   =