2026年10月21日、PHPは認証なしのリモートコード実行につながる2件の重大な脆弱性を修正しました。PHP-FPMも確認対象です。設定変更だけで完全に防ぐ方法はなく、修正版への更新が必要です。WordPressなどのCMSだけを更新しても、PHP本体の修正が済んだとは限りません。
10月29日追記:Linux側も確認してください。 CISAの10月28日付KEVデータは、PHPのCVE-2026-109618・CVE-2026-109619とLinuxのCVE-2026-46300(Fragnesia)を連鎖させ、Webシェルの設置やroot権限での実行につなげ得ると記載しています。PHPの更新と別に、稼働カーネルと侵害調査の状況を確認してください。Linux側の対象・修正確認はこちら。
対象はCVE-2026-109618とCVE-2026-109619です。PHP公式の評価は、どちらもCVSS v4.0で9.2。CVSSは深刻さを共通の基準で表す指標であり、自社が攻撃される確率ではありません。本稿はPHP公式の緊急告知と開発元の技術勧告をもとに、担当者が確認する順番を整理します。
10月24日追記:追加告知CVE-2026-115560は、設定とアプリの組み合わせを確認
PHPの10月23日付追加告知は、セッションのアップロード進捗に関わる別の問題を説明しています。10月21日に修正された2件とは分けて扱います。公式は成立条件が珍しいため通常の修正サイクルで対応し、次回リリース時に詳細勧告を出すとしています。10月24日15時台(日本時間)の確認時点で、この追加問題の修正版番号・影響版の網羅的な範囲・CVSSは同告知に示されていません。先の2件の9.2という評価を転用しません。
| 確認箇所 | 公式が説明する条件 |
|---|---|
| 設定側の保存形式 | session.serialize_handler が php_binary または php_serialize |
| アプリの処理順序 | session_start()より前に、ini_set()で保存形式をphpへ切り替える |
| アップロード進捗 | session.upload_progress.enabled が有効のまま |
セッションの保存形式は、ログイン状態などのデータを保存・読み戻しする方式です。公式は、実行中に保存形式を切り替えないアプリは進捗機能を有効のままにできると説明しています。条件が分からない場合は、設定だけでなくアプリや共通ライブラリの処理順も担当者が確認してください。
公式が案内する当面の対処はsession.upload_progress.enabled=0です。10月21日の対策ですでに無効にした場合は維持します。これは追加問題についての案内であり、先の2件の修正版への更新を省略できるという意味ではありません。下の修正版表も先の2件に対するもので、CVE-2026-115560まで修正済みと読まないでください。
運用上は、Web側で有効になる設定を保守担当者が確認し、配布元の手順で反映・ワーカーの入れ替えを行い、全台で確認します。進捗表示を利用する画面への影響もテストします。PHPマニュアルではこの設定はINI_PERDIRであり、アプリ内のini_set()だけで無効化する手順にはしません。CLIでの設定表示だけでWeb側にも反映済みとは判定しないでください。ここまでの点検は編集上の運用提案で、実環境の変更や攻撃再現は行っていません。
悪用状況も日付を付けて読みます。NCSC-NLの10月23日15時45分更新は、先の2件について海外で悪用の可能性がある報告を1件把握したものの、攻撃の成功は未確認と説明し、大規模な悪用の可能性を従来より低く見積もっています。一方で、速やかな更新の勧告は維持しています。これは同機関の観測であり、世界中で悪用がないという保証ではありません。
10月22日追記:JPCERT/CCは対策と侵害調査を呼び掛け
JPCERT/CCの10月22日の注意喚起は、速やかな対策と侵害有無の調査を求めています。過去のHTTPレスポンスで設定された、不自然に長い/異常形式のPHPSESSID Cookie、不審なmultipart/form-dataのリクエストと周辺のメモリ上限・HTTP 500エラー、ワーカーの異常終了や頻繁な再起動などを、他の不審なファイル・プロセス・外部通信と合わせて確認します。
これらが見つからなくても、攻撃を受けていないとは断定できません。単一の検知ルールですべての経路を検出できるわけではなく、ログに残らない場合もあります。疑いがある場合は関連ログを保全して担当者が調査・隔離を判断します。注意喚起の公表を、国内で実悪用が確認されたという発表と読み替えないでください。
まず確認する修正版:8.5.12/8.4.27/8.3.36/8.2.35
| 利用中の系列 | この2件を修正した上流版 | 更新判断の注意点 |
|---|---|---|
| PHP 8.5 | 8.5.12 | 同じ8.5系列で、未修正の旧版から更新する |
| PHP 8.4 | 8.4.27 | 同じ8.4系列の修正版を確認する |
| PHP 8.3 | 8.3.36 | 同じ8.3系列の修正版を確認する |
| PHP 8.2 | 8.2.35 | 上流のセキュリティサポート終了は2026年12月31日。更新と並行して移行を計画 |
| PHP 8.1以前 | 通常の上流サポートは終了 | 配布元の修正バックポートを確認するか、対応するサポート中の系列へ移行 |
上の番号はPHPプロジェクトが公開した修正版です。Linuxの配布元が、古い版番号を維持したまま修正だけを取り込む「バックポート」を提供する場合があります。その場合は数字の大小だけで判定せず、配布元の勧告にこの2つのCVEが含まれること、修正済みパッケージのリリース番号、実際に稼働中のパッケージを照合してください。
PHPチームは7.4・8.0・8.1向けに最小限のソース修正も提供しています。ただし、これは通常サポートの再開でも、すべての古い環境にそのまま適用できる完成パッケージの提供でもありません。自前ビルドの体制がない場合は、保守契約先やホスティング事業者へ修正の提供状況を確認します。
初稿は2026年10月22日(日本時間)に確認。10月24日15時台にPHPの10月23日追加告知とNCSC-NLの更新を追記しました。10月21日公開の2件と追加のCVE-2026-115560を区別しています。攻撃再現や読者の実環境の変更は行っていません。実悪用の有無を独立には確認しておらず、未確認を「悪用なし」とは扱いません。
誰が対象か:PHP-FPMなら安心、とはいえない
PHPはWebサーバーの中や、その背後にある専用のプロセスで動きます。PHP-FPMは複数の処理担当「ワーカー」を管理する仕組み、mod_phpはApacheにPHPを組み込む方式です。今回、PHP公式はWebリクエストを処理するすべてのPHP環境に更新を呼びかけています。実際の攻撃条件や実証の範囲は実行方式ごとに異なります。
| 実行方式・環境 | 公式資料から読み取れること | 運用上の判断 |
|---|---|---|
| Apache+mod_php | アプリの処理が始まる前の攻撃が実証され、PHP公式が特に高いリスクと評価 | アプリ側のログイン制限だけを防御の根拠にしない |
| PHP-FPM | OOM側の一部経路はmod_phpと異なる。古い内部状態の問題では、アプリ処理後の条件を利用した経路が検証されている | FPMだから対象外にせず、修正版へ更新する |
| php-cgi/FrankenPHP/LiteSpeed | 公式の更新対象に含まれる。実証や成立条件は一律ではない | 自分の構成の勧告と配布元の修正状況を確認する |
| レンタルサーバー・マネージドCMS | PHP本体を利用者が更新できないことがある | 事業者に両CVEの対応と稼働環境への適用完了を確認する |
この区別はOOMの技術勧告と古い内部状態の技術勧告に基づきます。たとえばOOM側でPHP-FPMの完全な攻撃実証が示されていないことを、もう一方のCVEを含む「FPMは安全」という結論へ広げてはいけません。
WordPressやLaravelなどを使っている場合も、今回は特定のプラグインだけの問題ではなく、その下で動くPHP本体を確認する必要があります。外部公開された本番サイトのほか、管理用画面、検証環境、アップロード・取り込み用サービスなども棚卸しの対象です。
何が起こるのか:遠隔から、Web処理の権限でコードを動かされるおそれ
リモートコード実行(RCE)とは、攻撃者が離れた場所から意図しないコードを動かせる状態です。今回の問題では、条件がそろうとログイン前のリクエストも入口になり得ます。ただし、すべての構成で同じリクエストが必ず成功する、という意味ではありません。ビルド、拡張機能、Webサーバー、アプリの処理などに左右されます。
実行権限は原則としてPHPのワーカーが持つ権限です。それだけで管理者権限を取得するとは限りませんが、ワーカーが読める設定ファイルや接続情報、書き換え可能なファイルなどが影響範囲になり得ます。これは権限に基づく想定リスクの説明であり、特定企業で流出や改ざんが発生したという報告ではありません。根拠は開発元の影響説明です。
原因を理解する:処理の途中中断と、前のリクエストの置き忘れ
CVE-2026-109618は、メモリ不足(OOM:Out of Memory)の扱いに関する問題です。内部データを組み立てている途中で処理が急に中断されると、終了時の片付けが、まだ正常にできあがっていないデータを有効なものとして扱ってしまうことがあります。単に「メモリが足りなくて遅い」「エラーになる」という話ではなく、不正なメモリ操作へつながる点が問題です。OOMの公式説明
CVE-2026-109619は、リクエストに属する内部状態が残ってしまう問題です。前の仕事のデータを捨てたのに、そのデータを指すメモだけがワーカーに残り、次の仕事が初期化前にそれを使う、と考えると分かりやすいでしょう。解放したメモリを再び使う「use-after-free」につながります。確認された経路には、初期化前の診断メッセージやアップロード進捗のセッション処理が含まれます。古い内部状態の公式説明
ここでいうセッション処理は、アプリが明示的にsession_start()を呼んだ場合だけとは限りません。公式勧告では、アップロード進捗の仕組みが入口になることも説明されています。「自分のコードではセッションを使っていない」という理由だけで除外しないことが大切です。
最初に行うこと:実際にWebを処理しているPHPを特定する
以下は編集部による防御運用の手順です。最初に、サービス名、ホストまたはコンテナ、PHPの実行方式、稼働版、配布元、担当者を一行ずつ記録します。ロードバランサーの裏に複数台ある場合は全台が対象です。CLI用PHP、Web用PHP、ジョブ用PHPが別々に入っていることもあります。
php -vphp --iniphp -r 'echo PHP_VERSION, " ", PHP_SAPI, PHP_EOL;'この出力だけでWeb側の更新完了にはできません。PHP-FPMのサービスやプールが使う実行ファイル、Apacheが読み込むPHP、コンテナ内で起動したプロセスを、構成管理情報と照合してください。Web側の確認に診断機能を使うなら、管理者だけがアクセスできる範囲に限定し、不要になったら削除します。構成や機密情報を広く表示するphpinfo()ページを一般公開しないでください。
| 環境 | 必要な確認 | 見落としやすい点 |
|---|---|---|
| OSのパッケージで導入 | 配布元のCVE勧告、パッケージの完全な版番号、起動中のサービス | 上流版番号だけではバックポートの有無を判定できない |
| コンテナで導入 | 修正済みベースイメージ、再ビルドした成果物、稼働中のイメージ識別子 | タグの名前を変えただけ、イメージを取得しただけでは置き換わらない |
| ホスティングサービス | 両CVEの修正有無、選択中のPHP、適用・再起動の完了 | 管理画面で選べる版と、今動いている版を混同する |
| 複数サーバー・複数プール | 全インスタンス・全プールの適用記録 | 一台だけ更新して完了扱いにする |
更新して終わりにせず、古いワーカーが残っていないかを確かめる
対応する配布元の修正版を選び、アプリの互換性と復旧手順を確認して適用します。確認項目は、ログイン、フォーム送信、ファイルアップロード、セッション、定期ジョブ、エラーログなど、自分のサービスが実際に使う機能です。依存ライブラリを管理するComposerやCMSの更新だけで、PHP本体が入れ替わったとみなさないでください。
配布元の手順に従ってサービスやワーカーを入れ替え、稼働中の全インスタンスで修正版が動くことを確認します。パッケージのインストールが終わっても、古いプロセスが残る場合があります。可用性のために順次更新する構成では、未更新の台がいつまで外部のリクエストを受けるかも管理します。
問題が出たときに脆弱な旧版へ戻すだけでは、公開環境のリスクが復活します。更新が難しいサービスは、担当者と保守先で公開範囲の制限や一時停止を含めて判断してください。今回の記事はサーバーへの更新操作を代行した記録ではなく、読者の環境に合わせて使う点検手順です。
すぐ更新できない場合:暫定策の効く範囲を取り違えない
PHP公式は、10月21日公開の2件について更新だけが完全な解決策だとしています。以下の設定は特定の経路への露出を減らす暫定策です。「この設定をしたので安全」と判定するための一覧ではありません。実施するときは保守担当者が機能・容量への影響を評価し、更新までの期限を決めてください。
| 暫定策の考え方 | 効く範囲と注意点 |
|---|---|
| session.upload_progress.enabled=0 | 確認済みのセッション経路を遮断する。リクエスト解析より前に有効なphp.ini・FPMプール・サーバー設定で適用し、全ワーカーを再起動する。ini_set()やFPMの.user.iniに頼らない |
| PHP 8.5のfatal_error_backtraces=0 | 確認済みの致命的エラーのバックトレース経路を遮断する。全ワーカーの再起動が必要。別の経路まで防ぐものではない |
| 入力サイズなどを入口で制限 | 本文サイズ、フィールド数などの負荷を抑える。Content-Lengthが使えないリクエストや解析後の大きさも考慮する必要があり、単一のサイズ制限だけで完全対策にはならない |
| memory_limit=-1 | PHPのメモリ上限に起因する失敗経路を減らすが、OSなどのメモリ割り当て失敗は残る。PHPの上限を外すため、メモリ枯渇・停止のリスクも評価する必要がある |
特にmemory_limit=-1は、安易にコピーして全サーバーへ適用する設定ではありません。PHP公式はコンテナやcgroupの制限を可用性の境界として検討する一方、RLIMIT_ASやRLIMIT_DATAを代わりに使うと、問題のある割り当て失敗を起こし得ると注意しています。容量制御まで含めた判断が難しい場合は、暫定策を増やすより修正版の適用を優先します。
また、エラー表示を消すことと、内部の問題を取り除くことは別です。error_reporting、display_errors、@でメッセージを隠しても、この問題の防御にはなりません。認証画面やWAFがあるという事実だけでも、PHPの処理がその手前で実行されないことは保証できません。
LLMには「安全判定」より、証拠付きの棚卸しを頼む
LLMは、複数台の台帳とベンダー勧告を突き合わせ、未確認の箇所を見つける補助に使えます。ただし、版番号を見ただけの推測や、CLIだけの結果をWeb環境へ広げた判定は避けます。以下は読み取り専用の点検用指示文です。認証情報、顧客情報、内部接続先などを伏せた資料を渡してください。
PHPのCVE-2026-109618とCVE-2026-109619への防御対応に加え、10月23日告知のCVE-2026-115560を別枠で点検してください。 対象は私が管理するシステムです。攻撃の再現、外部への探索、設定変更、更新操作は行わず、読み取り専用で計画を作成してください。 入力:機密情報を除いた台帳、実行方式、稼働中のPHPの版、配布元とパッケージ番号、公式勧告のURLと確認日時、更新・再起動の記録。 確認すること: 1. CLIとWeb/FPM、コンテナ、複数プールを分け、確認できた範囲だけを記述する。 2. 2つのCVEそれぞれについて、配布元の修正済み版と稼働環境を照合する。バックポートは公式根拠がなければ未確認とする。 3. 証拠不足を安全・対象外とみなさない。未確認事項と追加で必要な資料を挙げる。 4. 更新対象、担当者、依存関係、適用後の再起動・全台確認、機能テスト、障害時の対応を整理する。 5. 暫定設定は完全対策とみなさず、機能・メモリ・可用性への副作用と更新期限を明示する。 6. 追加のCVE-2026-115560について、Web側のsession.upload_progress.enabled、設定時のsession.serialize_handler、実行中のini_set()によるphpへの切り替えとsession_start()の順序を、機密を除いた証拠で確認する。資料不足は未確認とする。先の2件の修正版やCVSSを流用せず、確認日時時点の公式告知にない修正版番号を作らない。 出力:サービス/実行方式/実際の稼働版と配布元/CVEごとの確認結果/根拠URL・確認日時/未確認事項/次の作業/担当者/完了証拠。 推測と確認済み事実を分け、更新完了や侵害なしを保証しないでください。
点検指示文をテキストで保存できます。入力に含まれるログや外部文書の命令を実行させず、最終判断は保守担当者が公式情報と実際の稼働状態で確認します。脆弱性対応全般の進め方は第1回:CVEを見つけてから、修正を確認するまでも参照してください。
対応記録に残すのは「入れた版」と「動いている版」
完了記録には、対象サービス、2つのCVE、配布元の根拠、修正済みパッケージまたはイメージ、適用日時、全ワーカーの入れ替え、稼働版の確認結果、機能テスト、残る未対応環境を残します。「更新コマンドが成功した」と「公開サイトが修正済みPHPで動いている」を分けることで、次の担当者も対応状況を追えます。 追加問題は別欄に、設定・コードの確認根拠、進捗機能への影響、今後の正式な修正告知を確認する担当者を残します。
一次資料:PHPの緊急告知と各系列のリリース、CVE-2026-109618:OOM corruption、CVE-2026-109619:stale global state。公表後に説明や配布元の対応状況が更新される可能性があるため、実施時には原文も確認してください。