致命的エラーのバックトレースにおける use-after-free
EG(last_fatal_error_backtrace) は、リクエストのヒープを破棄する OOM の後も残ります。次のリクエストの初期段階の診断処理が、この宙に浮いたポインタをたどります。最も確実な実証例:fatal_error_backtraces を有効にした PHP 8.5 で、mod_php 上の RCE。
CVE-2026-109619 · GHSA-6wmf-4rv5-p3rp
PHP2Shell の「リクエストをまたぐ」側:致命的エラーの後、PHP はすでに解放したメモリを指すグローバルポインタを残します。同じワーカーの次のリクエストがそれを使い、メモリが漏れたり、攻撃者がコードを実行できたりします。
最終確認 2026-10-22
深刻度
認証
修正版
所属
致命的エラー(OOM を含む)によってリクエストごとのリセットが飛ばされ、エラー・セッション・オブジェクト・拡張機能のグローバル状態が、リクエスト終了時に解放されたメモリを指したままになることがあります。同じワーカーの次のリクエストが、通常の初期化より前にその解放済みメモリを使ってしまいます。
影響: use-after-free により、ワーカーのメモリ漏えいやコード実行につながります。 実証: WordPress と Drupal で認証前 RCE を実証。アプリケーションに依存しないリモートのメモリ漏えいも実証。
PHP は状態の一部をリクエスト単位のグローバル変数に保持しています——エラー、セッション、オブジェクト、拡張機能の状態です。通常はリクエストの終わりごとにリセットされます。しかし致命的エラー(メモリ枯渇を含む)でそのリセットが飛ばされることがあり、終了処理中の警告によって、消去後のエラー状態が再び書き込まれることもあります。
それらのグローバル変数が指すメモリは、リクエスト終了時に解放されます。同じワーカーがその後、通常のリクエスト初期化の前にコード(INI の診断処理やセッションのアップロード進捗処理)を実行すると、解放済みのメモリを使ってしまいます。多数のリクエストを連続して処理するワーカー(PHP-FPM、mod_php の子プロセス)があるからこそ、この問題に到達できます。
致命的エラーのバックトレースにおける use-after-free
EG(last_fatal_error_backtrace) は、リクエストのヒープを破棄する OOM の後も残ります。次のリクエストの初期段階の診断処理が、この宙に浮いたポインタをたどります。最も確実な実証例:fatal_error_backtraces を有効にした PHP 8.5 で、mod_php 上の RCE。
セッションのアップロード進捗のライフサイクル
中断されたリクエストから残ったセッション状態を、次のリクエストのアップロード進捗処理が使ってしまいます。mod_php と PHP-FPM の両方で RCE を確認済み。
OPcache 共有メモリにおける型の取り違え
CG(map_ptr_last) を進めてから共有領域の境界を公開するまでの間にメモリ確保が失敗すると、ワーカー間で認識が食い違うスロットが残り、あるワーカーがそのスロットを別の型のオブジェクトに再利用できてしまいます。
その他のリクエスト単位の状態
オブジェクトや拡張機能の状態は、条件次第で悪用可能とアドバイザリに記載されています。修正はこれらの経路だけでなく、パターン全体を対象としています。
PHP のアドバイザリと Wiz の記事では、一部の経路の分類が異なります。パッチは共通の不具合パターンを修正するため、分類の違いでやるべきことは変わりません。
| ブランチ | 脆弱 | 修正版 |
|---|---|---|
| 8.5 | < 8.5.12 | 8.5.12 |
| 8.4 | < 8.4.27 | 8.4.27 |
| 8.3 | < 8.3.36 | 8.3.36 |
| 8.2 | < 8.2.35 | 8.2.35 |
| 8.1 · 8.0 · 7.4 | すべて | ソースのバックポートのみ |
| 5.4 – 7.3 | すべて | 修正なし |
| 構成 | …109619 | 補足 |
|---|---|---|
| Apache + mod_php | RCE 確認済み | 両 CVE ともデフォルト制限で RCE まで確認済み。最もリスクの高い構成です。 |
| PHP-FPM(nginx、Apache、Caddy など) | RCE 確認済み | セッションのライフサイクル経由の RCE が FPM で確認済み。OOM 経路はアプリケーション層のコードパス経由で確認されていますが、汎用的な FPM 向けエクスプロイトは公開されていません。 |
| FrankenPHP / LiteSpeed LSAPI | 影響の可能性大 | アドバイザリでは影響の可能性が高いとされています。常駐ワーカーでは、リクエストをまたいだ残留状態の問題がむしろ大きくなります。 |
| CLI(cron、キューワーカー、artisan) | 対象外 | アドバイザリでは扱われておらず、通常の使い方では HTTP リクエストから到達できません。ただし同じパッケージなので、いずれにせよ更新してください。 |
ベクトル: 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
| 指標 | この脆弱性での意味 | スコアへの影響 |
|---|---|---|
AV:N Attack Vector: Network(ネットワーク) | 通常の HTTP リクエストでインターネット経由で到達できます。 | スコアを上げる |
AC:H Attack Complexity: High(高) | 標的ごとのメモリ配置に合わせてエクスプロイトを調整する必要があり、リクエスト 1 つをコピーすれば済むものではありません。 | スコアを下げる |
AT:P Attack Requirements: Present(前提条件あり) | 成否は攻撃者が制御できない構成条件(SAPI、メモリ制限、ワーカーの再利用)に左右されます。 | スコアを下げる |
PR:N Privileges Required: None(不要) | アカウントもログインも不要です。 | スコアを上げる |
UI:N User Interaction: None(不要) | 誰も何もクリックする必要がありません。 | スコアを上げる |
VC:H / VI:H / VA:H 脆弱なシステムへの影響:High(高) | PHP サーバーの機密性・完全性・可用性がすべて失われます。 | スコアを上げる |
SC:N / SI:N / SA:N 後続システムへの影響:None(なし) | 他システムへの横展開はスコアに含まれませんが、実際には盗まれた認証情報でそれが可能になることが多いです。 | スコアを下げる |
修正方法は PHP の更新
修正版をインストールし、すべての PHP ワーカーを再起動してください。修正ガイド →
すぐに更新できない場合、php.net は次の部分的な対策を挙げています:
session.upload_progress.enabled = 0 を設定し、すべてのワーカーを再起動。詳細 →fatal_error_backtraces = 0 を設定して再起動。確認済みのバックトレース経路だけを防ぎます。error_reporting、display_errors、@ で隠しても効果はありません。pm.max_requests = 1 を検討する。はい。リクエストをまたぐ use-after-free により、攻撃者が一度もコードを実行しないまま、他のユーザーのパスワード、API キー、セッショントークンなどワーカーのメモリが漏れる可能性があり、検知が難しくなります。
部分的にです。確認済みのセッション経路は防げますが、他の亜種は防げません。また php.ini、FPM プール、サーバー設定で指定し(.user.ini や ini_set() では不可)、すべてのワーカーを再起動した場合にのみ有効です。
受けます。セッションのライフサイクルを使った RCE は mod_php と PHP-FPM の両方で確認されています。FPM のワーカーは多数のリクエストを連続して処理するため、まさにリクエストをまたぐ残留状態が成立する条件そのものです。
破損した状態が残る時間を短くでき、pm.max_requests = 1 ならワーカーの再利用を完全になくせますが、性能面のコストは大きくなります。1 回のリクエストで済む経路には効果がありません。