PHPセキュリティアップデート2026:PHP2Shell CVSS 9.2 対応ガイド
PHPは2026年10月21日、認証を必要としない2つのリモートコード実行(RCE)脆弱性を解消するため、8.5.12、8.4.27、8.3.36、8.2.35をリリースしました。自社のサーバー、クライアントのサーバー、エージェンシーの共用ホスティングのどこかでPHPが動いているなら、これはロードマップに載せる案件ではなく、今日アップグレードする案件です。
今回の開示の進め方自体が異例でした。PHPセキュリティチームは10月20日に事前通知を発表し、リリースを10月21日14:00(UTC)に予定し、前倒し公開の権利を留保しました。CVE識別子は開示の1日前に漏洩し、深刻度や影響を受けるバージョンについて誇張された主張も同時に出回りました。ベンダーは各ディストリビューション向けのパッチをすでに受け取っており、各国のCERTはコードが公開される前からガイダンスの公表を始めていました。つまり、リリース後も対応を遅らせる正当な言い訳は、誰にもなかったということです。
2つの脆弱性、1つの緊急リリース
どちらの不具合も、アプリケーションのロジックエラーではありません。両方とも、PHPがリクエストを準備し、後始末する仕組みそのものにあります。だからこそ、フレームワークの更新も、プラグインの更新も、WAFのルールも、インタープリターのアップグレードの代わりにはなりません。
CVE-2026-109618 — メモリ枯渇時の破壊を経由するRCE。PHPはメモリを使い果たすと、処理を続行せずにリクエストを中断します。勧告が示しているのは、その中断が内部のリクエストデータの初期化途中にPHPを止めてしまい、後のリクエスト後始末の段階で無効なデータが有効なものとして扱われてしまう経路です。メモリ使用量を上限まで押し上げられる攻撃者は、この先の動作を誘導できます。この脆弱性があるからこそ、緩和策のアドバイスは直感に反するものになります。ベンダーが管理者に求めているのは、PHPのメモリー上限を引き締めることではなく、PHPが自らの上限に達しないようにすることです。
CVE-2026-109619 — 残存するグローバル状態を経由するRCE。あるリクエストが所有する内部状態は、その背後のメモリが解放された後も残ることがあります。同じワーカープロセスが処理する次のリクエストは、通常の初期化によるリセットより先に、その残存状態を取り込んでしまう可能性があります。長寿命のワーカー — まさにPHP-FPM、mod_php、LiteSpeedがそうです — では、メモリの再利用は通常かつ恒常の状態です。だからこれは、特殊な構成だけで起きる例外的なケースではありません。
| 識別子 | 内容 | 深刻度 | 修正済みバージョン |
|---|---|---|---|
| CVE-2026-109618 GHSA-w8hw-w9fx-j79w |
メモリ枯渇への対処が、リクエストデータの初期化途中のままPHPを中断させ、後始末の段階が無効なデータを信頼してしまう | CVSS v4.0 9.2 | 8.5.12 · 8.4.27 · 8.3.36 · 8.2.35 |
| CVE-2026-109619 GHSA-6wmf-4rv5-p3rp |
リクエストが所有する状態がメモリ解放後も残存し、同じワーカー上の後続リクエストが再初期化より前にそれを利用してしまう | CVSS v4.0 9.2 | 8.5.12 · 8.4.27 · 8.3.36 · 8.2.35 |
PHP2Shellという名前は、PHPプロジェクトの公式な呼称ではありません。研究者やセキュリティベンダーが名付けたものが定着した呼び名で、スキャナーの出力、ホスティング事業者の通告、CERTの勧告では、この2つのCVEを指すものとして使われます。
実際に影響を受けるのは誰か
勧告は率直です。Webリクエストを処理するPHP環境は、すべてがリスクにあります。nginxやApacheの背後にあるPHP-FPM、mod_phpを組み込んだApache、php-cgi、LiteSpeed、FrankenPHPが含まれます。構成間の違いは、攻撃者がどれだけの手間をかける必要があるかという点だけです。
| 構成 | リスク | 理由 |
|---|---|---|
| mod_phpを組み込んだApache | 最も高い | 勧告は、認証されていないリクエストがアプリケーションコードの実行より前に攻撃を引き起こす、実証済みのエクスプロイトについて説明している |
| PHP-FPM(nginx、Apacheプロキシー) | 高 | 長寿命ワーカーがリクエスト状態を再利用し、ワーカーは通常、サイトと同じユーザーで動作する |
| LiteSpeed、php-cgi、FrankenPHP | 高 | 勧告において、対象となるリクエスト処理構成として明示されている |
| マネージドホスティングと共用ホスティング | まちまち — 要確認 | 通常はプラットフォーム層でパッチが当てられるが、利用者からは見えない。やるべきは、組み込みバージョンとパッチ適用日を文書で入手すること |
| CronジョブとCLIスクリプト | 低め、それでも更新を | 公開されたリクエスト受け口はないが、同じバイナリを共有し、認証情報を保持していることも多い |
貿易ビジネス向けのWordPress、WooCommerce、Laravel、Magento、Magento周辺のERP、その他のPHP予約ポータルをホスティングしているなら、アプリケーションコードが完璧であっても、上の表の最初の3行に該当します。そもそもランタイムを誰が管理すべきかというより広い視点は、トルコでのITアウトソーシングに関する当社のガイドで解説しています。
2分でできるバージョン確認
ここでの落とし穴は、見かけのバージョン番号からの計算です。ディストリビューションはPHP 8.3.6や8.2.xを何年も提供し続け、セキュリティ修正を見かけのバージョン番号と同じものの中へバックポートします。そのため、php -vだけでは保護されているかどうかは分かりません。3つの情報を突き合わせてください。
1. 見かけのPHPバージョンと、トラフィックを処理しているSAPI。
php -i | grep -E 'PHP Version|memory_limit|session.upload_progress.enabled|fatal_error_backtraces'
systemctl list-units --type=service --state=running | grep -Ei 'php|apache|nginx|litespeed'
2. アップストリームではなく、ディストリビューションのパッケージバージョン。DebianとUbuntuではチェンジログが確かな答えです。RPM系システムでは、パッケージのチェンジログを問い合わせます。
zcat /usr/share/doc/php8.3-cli/changelog.Debian.gz | grep -iE 'CVE-2026-10961[89]'
apt-cache policy php8.3-fpm | head -4
# RPM-based hosts
rpm -q php && rpm -q --changelog php | grep -iE 'CVE-2026-10961[89]'
インストール済みバージョンのチェンジログに両方のCVEへの言及があれば、php -vが8.3.6のままであってもパッチは適用済みです。これが、本当のセキュリティ上の答えと、バージョン番号への迷信との違いです。
3. 実行中のプロセスが、修正済みバイナリを読み込んでいるか。再起動を伴わないパッケージ更新は、古いコードをメモリに残したままにします。サービスの起動時刻とパッケージのインストール時刻を比べてください:
stat -c '%y %n' /usr/sbin/php-fpm8.3
cPanel、Plesk、DirectAdminやマネージドプラットフォームでは、これに相当するのはPHPセレクターとホスティング事業者自身のセキュリティ通告の組み合わせです。パネルで宣伝されている最新バージョンではなく、自分のサイトに実際に割り当てられている組み込みバージョンを特定してください。事業者がパッチ適用日を明言できないなら、そのサイトは未修正と扱ってください。当社のデジタルインフラサービスは、この監査に加えてアップグレード自体までカバーします。お問い合わせでスタックを教えていただければ、当社なら何を確認するかをお伝えします。
修正済みバージョンとEOLの崖
PHPは各ブランチを、2年間のアクティブ開発と、さらに2年間のセキュリティ修正で支えます。このポリシーが、10月21日の4本の同時修正を生み出しました — 一方で、古いブランチを手を付けられないまま放置するのも、同じポリシーです。
| ブランチ | 修正リリース | 今回の勧告後のステータス |
|---|---|---|
| PHP 8.5 | 8.5.12 | アクティブサポート中 |
| PHP 8.4 | 8.4.27 | アクティブサポート中 |
| PHP 8.3 | 8.3.36 | セキュリティサポート段階 |
| PHP 8.2 | 8.2.35 | セキュリティサポートは2026年12月31日に終了 — 移行計画を今すぐ |
| PHP 8.1以前 | アップストリームのリリースなし | ベンダーのバックポートのみ。PHPプロジェクトは、ソースからビルドするユーザー向けに7.4、8.0、8.1の最小限のソースバックポートを公開している |
勧告から読み取れる実用的な警告が2つあります。第一に、ディストリビューションではなくコミュニティリポジトリーからPHPをインストールしている場合、そのリポジトリーはセキュリティ対応の時間枠に遅れるおそれがあります。広く使われているRemiパッケージのメンテナーは当日中の更新を用意しないと明言していたため、安全な道はディストリビューションのパッケージかソースビルドです。第二に、PHP 8.1以前で動かしているなら、「ホスティング事業者の対応を待つ」ことは、顧客の代理で下すセキュリティ上の意思決定です — 文書化するか、変えるかです。
本番サーバーをインシデントなしでパッチする
同一マイナーバージョンのセキュリティアップデートでアプリケーションが壊れることはまれです。壊すのは、テストされていない再起動のほうです。以下の順序は、当社が稼働中の貿易プラットフォームで実際に使っているもので、サイトを賭けずにリスクの時間枠を短く保てます。
- まずスナップショット。復元を実際にテスト済みのハイパーバイザーまたはボリュームのスナップショットは数分で復元でき、パッチを当てるという決断のコストを下げてくれます。
- ステージングで同じバージョンを再現。同じブランチ、同じ拡張モジュール、同じPHP設定ファイル、本番データのコピーを用意します。トップページだけでなく、購入フロー、見積もりリクエスト、支払いの経路を動かしてください。
- パッケージ一式をひとかたまりでアップグレード。アップグレード済みのCLIと古いFPMバイナリの混在こそ、
php -vは修正済みなのにWebの経路は未修正、という状態の典型的な原因です。apt-get update && apt-get install --only-upgrade 'php8.3-*'、RPM系ホストではdnf update --security 'php*'を実行します。 - リクエスト処理プロセスを再起動し、再起動したことを確認。
systemctl restart php8.3-fpm(またはApacheのリロード、LiteSpeedの再起動)を実行した後、サービスの起動時刻を再確認し、バージョンとチェンジログの問い合わせをもう一度実行します。 - 1時間、エラーログを見る。OOMのメッセージ、新しい致命的エラーのシグネチャ、異常な5xxの割合は、後述の緩和設定に調整が必要かもしれないというサインであって、アップグレードを先送りする理由ではありません。
- 証跡を記録。パッケージバージョン、両方のCVEに言及するチェンジログの行、再起動のタイムスタンプ。クライアントも、監査人も、ISO 27001流の統制レビューも、求めるのはまさにこれです。保存にかかるのは10秒です。
アップグレードを待たなければならない事情 — 検証済みのERP連携、変更禁止期間のリリースカレンダー、クライアントの承認待ちループ — がある場合は、ポートを開けたまま願いを込めるのではなく、同じ日のうちに代償統制をその前に置いてください。各国CERTの勧告がまさにこの状況のために推奨していたのはこれです。即時のパッチ適用が不可能な場合は、インターネットに面したPHPアプリケーションを公開ネットワークから隔離すること。
一時的な緩和策:窓を狭めることはできても、閉じることはできない
PHP勧告は、完全な緩和策は存在せず、更新だけが唯一の安全な選択であるとはっきり述べています。以下は「週単位ではなく日単位」のつなぎ策と考えてください。アプリケーションが上書きできない階層で適用し、適用後にはすべてのワーカーを再起動します。
CVE-2026-109618(メモリ枯渇の経路)対策
- PHPに、自身の上限ではなくマシンのメモリを使い果たさせる:
memory_limit = -1。できればphp_admin_value memory_limit = -1として設定し、アプリケーションコードが上限を元に戻せないようにします。 - インタープリターの手前でリクエストボディを小さく保つ:勧告のガイダンスは、アップロードがない場合で約8 MB、ある場合で約32 MB。
upload_max_filesizeはpost_max_sizeより小さくします。 - 高くつく制限はプロキシーで強制します。被害は回線上のサイズではなく、デコード後のリクエストで生じるからです。デコード後のボディ総サイズ、入力フィールド数、マルチパートのパート数、ヘッダー数、ネストの深さ — さらに、使いものになる
Content-Lengthなしで届くリクエストもカバーします。 - コンテナーまたはcgroupのメモリ上限で、被害の広がりを抑えます。ワーカーが停止しても、ホスト全体の事件ではなく可用性の事件で済むサイズにします。
RLIMIT_ASやRLIMIT_DATAで代用しないでください。それらは、脆弱な経路に存在するまさにその割り当て失敗を引き起こします。
CVE-2026-109619(残存状態の経路)対策
session.upload_progress.enabled = 0でセッションのアップロード進捗を無効化します。php.ini、FPMプール、サーバー設定 — リクエスト解析より前に適用される場所 — に設定してください。その後、すべてのワーカーを再起動します。FPMは、初期化済みのモジュール状態をリクエスト間で共有するためです。ini_set()や.user.iniでは間に合いません。- PHP 8.5では、
fatal_error_backtraces = 0を設定して再起動します。 - 無効または非推奨のため、初期化の早い段階で診断を出力するリクエストごとの設定を取り除きます。
error_reporting、display_errors、@でメッセージを抑えても、そのコード経路は消えません。 - 攻撃者が到達し得る致命的エラーと長時間のタイムアウトを、アップロードやインポートのハンドラー、コールバックコード、後始末ルーチンの中から探します — 2つの不具合が棲んでいるのは、そこです。
オリジンの手前にCDNやWAFがあれば、それでも十分に役割を果たします。レート制限、異常なリクエスト形状のブロック、仮想パッチ適用は、ノイズを減らし、機会主義的なスキャンを遅らせます。しかし標的型の攻撃者にとっては減速帯にすぎず、修復完了として承認できる統制ではありません。
今日、ホスティング事業者に尋ねるべきこと
サポートの定型返信は、この質問に「常に対策済みです」と答えます。その代わりに、ファイルとして残せる証拠を求めてください:
- 当社のアカウントに割り当てられている組み込みPHPのバージョンと、それがディストリビューションのパッケージなのかベンダービルドなのか。
- CVE-2026-109618とCVE-2026-109619の修正が貴社のサーバー群に届いた日付と、社内のパッケージバージョン文字列。
- 修正が、当社のサイトを処理するSAPI(FPM、LiteSpeed、mod_php)と、復元元になる可能性のあるステージングやバックアップノードに適用されているかどうか。
- プラットフォームがまだ未修正の場合:どの代償統制が、いつまで講じられているのか。
- EOLブランチに関する基本方針 — PHP 8.2のセキュリティサポートが終了する2027年1月1日、当社のサイトはどうなりますか。
この5つの質問に1通のメールで答える事業者は、付き合い続ける価値があります。宣伝文句で煙に巻いてくる事業者なら、移行の話を始める番です。ここで求められるデューデリジェンスは、当社のISO 27001ギャップアセスメント業務と同じで、成果物は安心感ではなく証拠です。
侵害されたと仮定すべきでしょうか?
自動的にそうなるわけではありません — しかし、当てずっぽうではなく確認してください。特に、パッチ前の期間にサーバーが公開インターネットに面していた場合はそうです。
- 自分が作った覚えのないプロセス、リスナー、cronエントリー、そしてPHPワーカーユーザーからの外部への接続を探します。
- 書き込み可能なアプリケーションディレクトリーを、デプロイの正本と突き合わせます。新しいPHPファイル、変更されたアップロードディレクトリー、いつの間にか実行可能になっている一時フォルダーがないか。
- Webログを検索します。開示の時間帯の前後に集中した大量のリクエスト、異常に大きなマルチパートボディ、PHPエラーログにOOMのシグネチャを伴う500応答。
- 修正済みバイナリが実際に動いているか確認します — 上記の再起動時刻の比較が答えをくれます。
- 何か一つでもおかしければ、インシデントとして扱います。ディスクとログを保全し、アプリケーションが読み取れるすべての認証情報をローテーションし、既知の正常なイメージから再構築してください。侵害されたホストの上にPHPパッケージを再インストールすることは、修復ではありません。
当社インフラからの実例
当社はworldwidetradex.comを、Ubuntu 24.04 LTS、nginx、PHP-FPMで運用しています。そこで10月22日、上記の確認を自分たち自身に実施しました。結果は、見かけのバージョン番号からの計算が危うい理由をよく示しています:
php -vはPHP 8.3.6を報告しました — アップストリームのPHPと見比べれば、3年は古くて警戒したくなる数字です。
dpkg -lは8.3.6-0ubuntu0.24.04.13を報告しました。このバージョンに同梱されるDebianのチェンジログには、CVE-2026-109618とCVE-2026-109619がベンダーパッチ適用済みで記載されています。apt-cache policyでは、インストール済みバージョンと候補バージョンが一致しており、保留中の新しいものはありませんでした。
結論:ディストリビューションのバックポート経由で修正済み。mod_phpではなくPHP-FPMで配信されており、パッケージ更新後にFPMサービスは再起動済み。同じ作業、コマンド5つで、求めるクライアントに証拠をお見せできます。
この教訓は、どのスタックにも当てはまります。セキュリティ体制を決めるのは、パッケージバージョンとチェンジログと再起動の組み合わせであって、ホスティングパネルに表示される宣伝用バージョン文字列ではありません。
パッチ適用を、英雄的な行為から日常業務に変える
PHP2Shellが記憶に残るのは、珍しいからではありません。ウェブの大半が動いているインタープリターに、認証前段階の重大な不具合があり、何千ものホストが数時間のうちに対応を迫られたからです。安眠できたチームは運が良かったのではなく — 自動化を備えていたのです。
- インタープリターのセキュリティアップグレードを無人で実行し、バージョンと再起動を自動的に記録する。
- すべてのサイトがどのSAPIとどのPHPブランチを使っているかを把握したインベントリー。ステージング、バックアップ、そして2019年から残っている例のWordPressまで含めて。
- 訓練済みの復元手順。「今すぐパッチを」が「ロールバックできない」と天秤にかけられることがないように。
- ブランチ計画。今後12か月以内にセキュリティサポートが終了するPHPリリースの上に、何も置かない。
- サーバーごとに名前の挙がった担当者を1人と、パッチが水曜日の14:00(UTC)に降ってくる日のための、文書化されたエスカレーション経路。
その能力を人材で賄うのではなく買いたいのであれば、当社がマネージドインフラ業務の一環として、本番PHPプラットフォーム — パッチ適用サイクル、監視、バックアップ、文書化された復元 — の所有を引き受けます。まずは短い概要と数量から始めてください。見積もりをリクエスト。
よくある質問
未修正のPHPバージョンで動いているサイトは、必ずハッキングされているのでしょうか?
必ずしもそうではありません。未修正でインターネットに面したPHP環境は晒されており、開示の頃からスキャンも始まっていましたが、晒されていることと侵害されていることは別物です。まずパッチを当て、その後で上記の検証手順を実行してください。侵害と判断するのは証拠に基づいてのみにすべきです。何か見つかったら、清掃ではなく再構築を選んでください。
ホスティング事業者はPHP 8.3.6と言っています。修正済みでしょうか、されていないでしょうか?
ビルドによります。ディストリビューションのパッケージは、アップストリームのバージョン番号を保ったままCVE修正を含むため、Ubuntu 24.04やDebianのPHP 8.3.6は、すでに両方の修正を含んでいることがあります。完全なパッケージバージョンと、CVE-2026-109618とCVE-2026-109619の名前を挙げたチェンジログの行を請求してください。マネージドプラットフォームでは、代わりにパッチ適用日を尋ねてください。
プラグイン、テーマ、フレームワークの更新で、PHP2Shellから守られますか?
いいえ。どちらの不具合も、PHPインタープリターのリクエスト準備と後始末にあり、アプリケーションコードにはありません。アプリケーションの更新は引き続き良い習慣であり、WAFは機会主義的なトラフィックを遅らせますが、脆弱性を取り除くのはインタープリターのアップグレードだけです。
メモリ上限を下げるだけで、メモリ枯渇の不具合を防げますか?
逆です。CVE-2026-109618に関する勧告の暫定ガイダンスは、PHPが自らのメモリー上限で中断しないようにすること — memory_limit = -1を、アプリケーションコードが上書きできない形で設定する — こと、その上でプロキシーでリクエストの複雑さに上限をかけ、コンテナーまたはcgroupの上限でワーカーを囲むことです。PHPの上限を厳しくすることは、悪用されている故障モードの内側に収まってしまいます。
うちはPHP 8.1以前で、アップストリームのリリースがありません。どうすればよいでしょうか?
可能であれば、サポート対象のブランチへ移行してください。それが長続きする答えです。できない場合は、ディストリビューションまたはベンダーから修正を取得してください。それが唯一現実的な入手源です。ソースからビルドしている場合は、PHPプロジェクトが7.4、8.0、8.1向けに公開した最小限のソースバックポートを適用できます。その決定は記録してください。置き続ける限り、毎月リスクプロファイルが変化するのですから。
稼働中のストアで、PHP 8.3から8.3.36へのアップグレードは危険ですか?
同一マイナーバージョンのセキュリティアップデートが変えるのは言語ではなくインタープリターのバイナリなので、ほとんどのアプリケーションは影響を受けません。リスクは運用上のものです。不完全なパッケージ構成、忘れられた再起動、負荷がかかって初めて現れる設定。スナップショットを取り、PHPパッケージ一式を丸ごとアップグレードし、リクエスト処理プロセスを再起動して検証する — プラットフォームが複雑な場合は、まずステージングで実行してください。
情報源
- PHP — セキュリティ勧告「今すぐ更新を:重大なリモートコード実行脆弱性」および2026年10月21日のリリース告知。緩和ガイダンスと、サポート対象バージョンのページに記載のサポート期間も含みます。
- PHPリポジトリーに対するGitHub Security Advisories:GHSA-w8hw-w9fx-j79w(CVE-2026-109618)とGHSA-6wmf-4rv5-p3rp(CVE-2026-109619)。
- CERT-EU — セキュリティ勧告2026-018「PHPにおける重大な脆弱性」。両方のCVEに言及。
- Infosecurity Magazine — 「予定されていたセキュリティパッチに先立ち、PHPの重大な脆弱性が漏洩」(2026年10月21日)および「脆弱性開示の4日前にAmazonが検出したPHP2Shellの攻撃試行」(2026年10月22日)。
アップグレードの作業を任せたいですか?パッチ適用、バージョン監査、管理・修正済みPHPプラットフォームへの移行、あるいはその周辺のインフラについてご相談いただくには、お問い合わせいただくか、+90 505 679 78 03までお電話ください。