10/23/2026にPHPのRCE脆弱性(Critical: CVE-2026-115560)が公開されました。これは世間を混乱させたPHPの脆弱性(CVE-2026-109618, CVE-2026-109619)とは異なる問題で、現在のところ策しか出ていません(そもそもsession.upload_progress.enabledはデフォルトが1なので、今回の脆弱性については悪用は限定的です)。今回はこちらの脆弱性の概要と、各ディストリビューションの対応について纏めます。
(2026/10/25追記:今回の脆弱性の成立する条件は限定的、という説明が漏れていたので加えました)。
[一次情報源]
修正方法・緩和策
2026/10/24時点では、この脆弱性を修正したバージョンのPHPは公開されていません。
修正したバージョンがリリースされるまでの緩和策としては、一次情報源にあるように
session.upload_progress.enabled=0
を設定後、全てのWorkerを再起動してください。
CVSS/プライオリティ
- CVE-2026-115560
- 影響するバージョン
- N/A
- Priority/CVSS SCORE
- Vendor(CVSSv4): 9.2 Critical
- Vendor(CVSSv31): Not disclosed:
- CNA(CVSSv4): Not disclosed:
- CNA(CVSSv31): Not disclosed:
- NVD(CVSSv4): Not disclosed
- NVD(CVSSv31): Not disclosed
- Red Hat(CVSSv4): Not disclosed
- Red Hat(CVSSv31): Not disclosed
- CVSS Vector
- Vendor(CVSSv4): CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
- Vendor(CVSSv31): Not disclosed
- CNA(CVSSv4): Not disclosed
- CNA(CVSSv31): Not disclosed
- NVD(CVSSv4): Not disclosed
- NVD(CVSSv31): Not disclosed
- Red Hat(CVSSv4): Not disclosed
- Red Hat(CVSSv31): Not disclosed
- EPSS Score/Percentile
- DATE(JST): 2026-10-23
- EPSS: Not Available
- Percentile: Not Available
- 影響するバージョン
修正方法
各ディストリビューションの情報を確認してください。
CVE概要(詳細はCVEのサイトをご確認ください)
- https://www.cve.org/CVERecord?id=CVE-2026-115560
- グローバルステートのStale(古い状態)によるRCE(リモートコード実行)
- PHPには、エラー、セッション、オブジェクト、拡張機能の状態など、さまざまなグローバル状態が存在します。これらはワーカーによって保持されますが、実際には特定の1つのリクエストが所有するメモリ領域を指しています。こうした状態は、リクエストに関連するメモリが解放される前にリセットされなければなりません。しかし、次のリクエストの正規の初期化処理が始まる前に、入力処理、設定の読み込み、セッション処理、あるいはエラー処理といった操作が実行されることがあります。その際、前のリクエストでリセットされなかった古い状態(stale state)に意図せずアクセスしてしまうことで、use-after-freeが発生します。ヒープのレイアウトを巧みに操作することで、リモートコード実行(RCE)を成立させることが出来る可能性があります。 状態が残ってしまう原因は複数あります。メモリ不足に起因するものを含む致命的なエラーが発生すると、本来行われるはずのリセット処理が実行されないまま、処理が中断されてしまうことがあります。また、シャットダウンの過程でエラー状態が一度クリアされたにもかかわらず、警告やその他の致命的ではない診断情報によって、再びエラー状態が書き込まれてしまうケースもあります。その結果、ワーカーのグローバル領域が依然としてリクエストのヒープ領域を参照している状態で、当該ヒープ領域が解放されてしまいます。その後、次のリクエストの正規の初期化処理が始まる前に実行される操作が、この古い(無効な)値を参照・利用してしまうのです。 この脆弱性を悪用するには、「プロデューサー」と「コンシューマー」の両方が必要となります。プロデューサーとは、あるリクエストが所有する状態を、後のリクエストからアクセス可能な場所に保存してしまうPHPの操作を指します。一方、コンシューマーとは、その後に実行されるPHPの操作であり、プロデューサーによって保存された古い状態を読み取ったり、解放したり、それに基づいて条件分岐を行ったりするなど、何らかの処理を行うものを指します。
- 具体的な脆弱性は、以下の条件で発生します。
- アクセス可能なPHP処理が、リクエストに固有の状態(ステート)をグローバルにアクセス可能な場所に格納する(この処理を「生成側」と呼びます)。
- その状態がリセットされないか、あるいは本来のリセット処理が行われた後に、別の処理によって再びその状態が設定されてしまう。
- PHPがリクエスト用のメモリを解放する一方で、永続的に稼働するワーカー(プロセスやスレッド)が、その状態を参照するグローバルなデータを保持し続ける。
- 同じワーカーが、別のリクエストを処理する。
- PHPの処理が、リクエストの初期化プロセスによる正常なリセットが行われる前に、古い状態(ステート)を読み取る、解放する、それに基づいて条件分岐を行う、あるいはその他の操作を行う(この処理を「消費側」と呼びます)。
主なディストリビューションの対応方法
詳細は、各ディストリビューションの提供元にご確認ください
- Debian
- Red Hat Enterprise Linux/CentOS/Rocky Linux/Alma Linux
- Ubuntu
- SUSE/openSUSE
対処方法
現在のところは、緩和策を行ってください。また、各ディストリビューションの案内に従い、可能であればアップデートを行ってください。