GitHubのアドバイザリーに、FrankenPHPの脆弱性「CVE-2026-82416」が掲載されました。ワーカーモードで並行処理する際、別の利用者のセッションIDを引き継ぎ、セッション情報の露出や乗っ取りにつながる恐れがあります。掲載日は資料に記載されておらず、影響の判定にはFrankenPHPの版番号ではなく、PHPのビルド構成の確認が必要です。
別の利用者のIDが残り、Cookieが無視される
セッションIDは、利用者のセッションを識別するための情報です。本件では、並行処理中に別の利用者のIDがリクエストに引き継がれるほか、同じワーカースレッドが以前処理したリクエストのIDを再利用する場合があります。
原因は、PHPのsession拡張を共有モジュールとして読み込む構成で、リクエストごとのセッションID初期化処理がビルドから除外されることです。残ったIDによって、新しいリクエストのCookieが無視されます。情報の露出や乗っ取りだけでなく、利用者が断続的にログアウトされるといった動作上の問題も生じます。
アドバイザリーによると、1.11.x~1.12.xで該当するCコードは変わっていません。特定のリリースでコードが変更されて生じた問題ではないため、版番号の比較だけで対象外と判断しないことが重要です。
修正はリクエストごとの初期化、回避策も提示
修正では、共有モジュール構成でもワーカーが各リクエストのセッション状態を初期化するようにします。PHP 8.6-dev ZTSと2ワーカーによる検証では、並行リクエスト600件中の漏えいが修正前の519件から修正後は0件になったとしています。これは記載された検証環境での結果です。
ただし、資料には修正済みバージョンの番号がありません。「最新版なら解消する」とは判断できません。回避策としては、公式の静的バイナリまたはDockerイメージの利用が挙げられています。
別の回避策は、session_write_close()の後にsession_id('')を呼ぶ方法です。ワーカーループ内でIDを空にする回避策では、session.use_strict_mode=1を併用します。コード変更を選ぶ場合は、この併用条件も開発担当へ伝える必要があります。
日本での提供は発表には書かれていません。日本向けの提供時期や日本語対応などを判断できる情報も、今回の資料にはありません。
影響する会社・しない会社
- 影響する: FrankenPHPのワーカーモードを使い、PHPのsession拡張を共有モジュールとして読み込むビルドを運用する会社です。対象にはRPM・Debianパッケージや、session拡張を共有するphp-zts配布物が含まれます。パッケージの種類だけでなく、実際の構成を確認してください。
- 影響しない: session拡張を静的に組み込んだビルドを利用する会社です。公式の静的バイナリとDockerイメージは、今回の脆弱性の影響対象外です。
情シスが今日やること
以下は社内の初動手順の提案です。発表による対応期限ではありません。
- 利用状況を棚卸しする。 IT資産台帳や運用構成資料からFrankenPHPを使うシステムを探し、開発担当・運用委託先にワーカーモードの利用有無を確認してください。版番号だけで調査を終えないよう、確認項目にPHPのビルド構成も入れます。
- 配布元とsession拡張の組み込み方を確認する。 開発担当にビルド記録や配布物の構成資料を確認してもらい、共有モジュールか静的組み込みかを記録します。確認用の管理画面や操作手順は発表には書かれていません。構成が不明なものは、対象外とせず未確認として残してください。
- 対象環境の対応方法を決める。 運用担当・開発担当と、公式の静的バイナリやDockerイメージへの切り替え、またはコード側の回避策を検討します。修正を取り込む場合は、導入前に修正内容が含まれることを確認してください。対応担当者と実施予定日も決めます。
- 変更前後の確認項目を共有する。 開発担当に、並行リクエスト時のセッション分離とログイン継続を確認するよう依頼します。ヘルプデスクには、断続的なログアウトも本件の症状に含まれると伝えてください。変更完了の判断前に、構成と検証結果を記録します。