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

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のバージョンが表示されます。
[PHP バージョン]の行のすぐ下にある[PHP SAPI]の行はPHPの実行方式を表し、fpm-fcgiはPHP-FPM構成です。ここでは[サーバー]セクションの[PHP バージョン]・[PHP SAPI]の2行だけを見ます。
攻撃はログインなしのリクエストから始まります。特別に細工したリクエストをPHPがWordPressのコードより先に読む段階で2つの欠陥のどちらかに触れ、サーバーでのコード実行につながります。修正版はこの流れを止めるので、やることはサイトのPHPを修正版以上に上げることです。
ターミナルの[php -v]は、コマンドラインの既定のPHPのバージョンしか表示しません。cPanelのEA-PHPやCloudLinuxのalt-phpのように1台のサーバーに複数のバージョンのPHPを入れる構成では、サイトが使うバージョンと違うことがあります。そのため基準はサイトヘルスの[PHP バージョン]の値にします。
php -vPHP 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 Packagesdnf 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-fpmのワーカーまで新しいバージョンで実行されています。
php -vPHP 8.3.xx (cli) (built: Oct 19 2026 14:00:34) (NTS gcc x86_64)systemctl is-active php-fpmactivecurl -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 | -1 | FPMプール・Apache設定のphp_admin_value(アプリケーションが戻せないように) | CVE-2026-109618・メモリ上限の失敗経路(完全ではない) |
| post_max_size | 8M(アップロードが必要なら32M)・upload_max_filesizeはそれより小さく | php.ini・プール設定 | CVE-2026-109618 |
| session.upload_progress.enabled | 0 + すべてのワーカーを再起動 | php.ini・FPMプール・サーバー設定(ini_set()・.user.iniは不可) | CVE-2026-109619・確認済みのセッション経路のみ |
| fatal_error_backtraces | 0 + すべてのワーカーを再起動(PHP 8.5のみ) | 上と同じ | CVE-2026-109619・確認済みのバックトレース経路のみ |
php_admin_valueはアプリケーションが戻せないサーバー側の設定のため、共有ホスティングの利用者は自分で変えられないことが多く、その場合も結局はホスティング会社に依頼することになります。php.netは、Webサーバーやプロキシの段階でも、リクエスト本文のサイズと入力フィールドの数、multipartの分割数、ヘッダーの数、ネストの深さに上限を設けるよう案内しています。
🔢 FAQ & おすすめコンテンツ
ℹ️ 提携について
当サイトのコンテンツにはアフィリエイトリンクが含まれています。訪問者がこのリンクを通じて商品やサービスを購入すると、当サイトは販売元から手数料を受け取ります。この過程において、購入者が支払う金額(イベント割引適用で金額が下がります↓)は上昇しません。掲載されている価格・割引・在庫情報は作成時点のものであり、実際とは異なる場合がありますので、ご購入前に販売元にて最終確認をお願いいたします。商品の選定および評価は独自の基準に基づいて行われており、手数料の支払いの有無は紹介順や評価内容に影響を与えません。