· adswds-team · セキュリティ · 5 min read
同じ worker の次のリクエスト:PHP CVE-2026-109619
2026-10-21 のもう一つの重大脆弱性 CVE-2026-109619(CVSS 4.0 9.2)。リクエストヒープ解放後も worker が古いグローバル状態を持つ。セッションのアップロード進捗経路は mod_php と FPM で RCE が検証済み。

PHP の告知(2026-10-21)は CVE-2026-109619 をメモリ枯渇の件と並べている。リクエスト所有の内部状態が、背後のメモリ解放後も残り、同じ worker の後続リクエストが通常の初期化より前にそれを使う。GHSA-6wmf-4rv5-p3rp が確認した影響は、未認証のヒープ use-after-free、メモリ開示、Web ワーカー権限での RCE。深刻度は Critical、CVSS 4.0 9.2。
一言で:FPM の子プロセスは前のリクエストを忘れきれていない。
CVE-2026-109618 向けの memory_limit=-1 は、ここのセッション経路を塞がない。
Advisory が確認していること
| 項目 | 内容 |
|---|---|
| 番号 | CVE-2026-109619 / GHSA-6wmf-4rv5-p3rp |
| 影響 / 修正 | 8.2.35、8.3.36、8.4.27、8.5.12 より前 / これらの版 |
| 形 | 生産側がリクエスト状態を worker のグローバルへ出し、消費側が次の通常初期化より前に読む |
| 同一 worker | worker 数やリサイクルは成功率を下げるだけで、条件は消えない |
| PHP 8.5 | fatal_error_backtraces 有効時、バックトレース状態のリセットはシャットダウンで必ず漏れる。確認済み mod_php RCE の土台 |
| アップロード進捗 | 既定で有効。session_start() は不要。この経路の RCE は mod_php と FPM で検証済み |
| その他 | エラー、例外、オブジェクト、拡張の状態はアプリと拡張に依存する。パッチはより広いリセットをまとめて入れている |
致命的エラー(パース / コンパイル失敗、未捕捉エラー、require 失敗、Maximum execution time exceeded)や OOM は、リセット前に生産側を中断できる。非致命の診断も、シャットダウン後期にエラー状態を埋め直せる。error_reporting の変更、@、display_errors / log_errors の無効化は、初期化前の読み取りを止めない。
FPM ではプール設定と .user.ini はこの早期の消費側ではない。nginx や Apache mod_proxy_fcgi が初期化前に診断を出す PHP_VALUE / PHP_ADMIN_VALUE を渡すと、INI 診断経路が条件付きで開く。検証済みの FPM セッション経路は別で、起動成功後のアプリ実行中に状態を出し、致命的エラーのあと、次のリクエストのアップロード進捗がそれを消費する。
修正と、修正ではない設定
完全な修正は状態リセットを含む上記バージョン。8.1 以前は通常更新の外で、7.4 / 8.0 / 8.1 には最小のソース backport がある。8.2 のセキュリティ修正は 2026-12-31 で止まる。rpms.remirepo.net は告知当日に包がなかった。
すぐ上げられない場合の、不完全な緩和:
-
session.upload_progress.enabled=0をphp.ini、FPM プール、またはリクエスト解析前に効くサーバ設定へ書き、全 worker を再起動する。ini_set()や.user.iniに頼らない。確認済みのセッション経路だけを塞ぐ。 - PHP 8.5 のみ:
fatal_error_backtraces=0にして再起動。 - 初期化前に警告を出す無効・非推奨の設定を外す。診断を隠しても効果はない。
- 性能が許すなら
pm.max_requests=1。汎用の修正ではない。 - 監査中は
log_errors、使えるerror_log、E_ALLを付ける。ログが静かでも安全ではない。 - CVE-2026-109618 も同時に扱う。
ランディングノード
nginx → PHP-FPM では、こちらが 通常の動的プールで RCE が検証された側である。アップロード進捗は既定で開いており、フォームや素材アップロード、コールバックが同じ worker に当たれば Advisory の条件に入る。中断は必要なので「任意の GET で必ず成功」ではない。session_start() を呼ぶアプリに限る話でもない。
訪問者フィルタは worker 内の残り状態を見ない。8.3.36(または自ブランチの修正版)へ上げてから session.upload_progress を確認する。
まとめ
CVE-2026-109619 はリクエスト境界を越える古いグローバル状態である。8.5 の致命的エラーのバックトレースは mod_php、アップロード進捗は mod_php と FPM で確認されている。修正版は 10 月 21 日のもう一つの RCE と同じ。緩和は経路ごとに違う。



