技術約6分で読めます

PHPのCVE-2026-115560は、serialize_handlerを実行中に切り替えるアプリだけが対象

いけさん目次

TL;DR

最終更新 10月23日22時30分(日本時間)
何が出たか PHP公式が10月23日19時12分に、CVE-2026-115560の告知を出した。21日のphp2shell修正版(8.5.12、8.4.27、8.3.36、8.2.35)では直っていない
対象 設定で session.serialize_handler を php_binary か php_serialize にしたうえで、実行中に ini_set() で php へ戻してから session_start() するアプリ。アップロード進捗の記録が有効なことも条件
やること 次の定例リリースまで session.upload_progress.enabled=0 にする。21日のCVE-2026-109619の緩和策で入れたなら、そのままでいい
未公表 影響を受けるバージョン、修正が入るリリース、深刻度のスコア。詳しいアドバイザリは次のリリースと一緒に出る


php2shellは、10月21日にPHPが修正した未認証RCE2件(CVE-2026-109618、CVE-2026-109619)の通称だ。
その修正版から2日後、PHP公式が新しいCVE番号の付いた告知を出した(PHP公式のお知らせ)。
告知のタイトルは「Informational advisory: Session upload progress」で、日本時間23日19時12分の公開。
CVE-2026-115560はphp2shellの2件とは別の問題で、21日の修正版を当てたサーバーにも残っている(The Hacker News)。

公式は、緊急リリースではなく通常のリリースの周期で直すとしている。
条件がそろうと外部からコードを実行される(RCE)おそれがあるが、条件の組み合わせが珍しく、実際には起こりにくいと書いている。
それまでの対策として、php2shellの修正版が出る前に紹介した session.upload_progress.enabled=0 を勧めている。

対象になる3つの条件

公式の告知では、設定とアプリのコードが次の3つを全部満たす場合にだけ起こる。

条件内容
設定php.iniなどの設定で、session.serialize_handler を php_binary か php_serialize にしている
アプリのコード実行中に ini_set()(スクリプトの実行中に設定を変える関数)で session.serialize_handler を php に切り替え、そのあとで session_start() を呼ぶ
アップロード進捗session.upload_progress.enabled が有効のまま

session.serialize_handler は、$_SESSION の中身をファイルなどに保存するときの書式を決める設定だ。
PHPマニュアルによると既定値は php で、php_binary はPHP内部の別の書式、php_serialize は serialize() と unserialize() をそのまま使う書式になっている。
設定は既定のままで、アプリ側でも切り替えていないなら、2つ目までの条件に当たらない。

session.upload_progress.enabled はファイルのアップロード中に進み具合をセッションへ書き込む機能で、既定で有効になっている。
公式は、実行中に session.serialize_handler を切り替えないアプリなら、この機能を有効のままにしてよいとしている。
アップロード進捗の記録が書式の切り替えとどう関わって問題になるのかは、告知に書かれていない。

21日に設定を切ったサーバーは何もしなくていい

session.upload_progress.enabled=0 は、21日に公開されたCVE-2026-109619のアドバイザリ(GHSA-6wmf-4rv5-p3rp)でも緩和策に挙がっていた設定だ。
公式は、そのときに入れたならそのままにしておけばよく、ほかの作業はいらないと書いている。

まだ入れていないなら、次の定例リリースが出るまで入れておく。
21日のアドバイザリは、CVE-2026-109619向けにこの設定を入れる場合、php.ini、FPMプール(PHP-FPMのワーカーをまとめる設定の単位)、サーバー設定のどれかに書き、すべてのワーカー(リクエストを処理する常駐プロセス)を再起動するよう求めていた。
ini_set() とFPMの .user.ini には頼らないようにとも書いてある。
23日の告知には設定する場所の注意はない。
21日と同じ場所に書いておけば、CVE-2026-109619の緩和策の条件も満たせる。
レンタルサーバーやphp.iniでの切り方は、修正版が出る前に書いた記事の手順にまとめている。

この設定で止まるのは、アップロード中の進捗をセッションへ記録する処理だ。
アップロードの進捗バーをこの機能で出しているサイトは、進捗が表示されなくなる。
ロリポップは22日の対応で全バージョンの session.upload_progress を無効にしていて(ロリポップのお知らせ)、利用者が自分で設定を変えなくてもこの状態になっている。

自分のアプリが条件に当たるか

設定とコードの両方を調べる。
設定ファイルとアプリのコードを session.serialize_handler で検索すれば、どちらに書かれているかが分かる。

# 設定ファイル(パスは環境に合わせる)
grep -rn "serialize_handler" /etc/php* /etc/httpd /etc/apache2 2>/dev/null

# アプリのコード、.htaccess、.user.ini
grep -rn "serialize_handler" /var/www --include="*.php" --include=".htaccess" --include=".user.ini"

設定側で php_binary か php_serialize を指定していて、コード側に ini_set('session.serialize_handler', 'php') があれば、条件の2つ目までに当たる。
コード側の切り替えは、アプリ本体だけでなく、Composer(PHPのパッケージ管理ツール)で入れたライブラリ(vendor/ の下)にも含まれる場合がある。
ディレクトリごとの設定ファイルである .htaccess(Apache用)の php_value や .user.ini(PHP用)で切り替えている場合が条件に入るかは、告知では触れていない。
公式が挙げているのは ini_set() での切り替えだけだ。

まだ公表されていないこと

23日の告知は情報提供のためのもので、詳しいアドバイザリはCVE-2026-115560の修正と一緒に次のリリースで出すとしている。
The Hacker Newsによると、23日時点で次の項目が出ていない。

項目23日時点
影響を受けるバージョン未公表
修正が入るリリース「次の定例のバグ修正リリース」とだけ書かれている
深刻度のスコア(CVSS。0〜10で表す指標)未公表
CVE-2026-109619と原因が同じか未公表
攻撃の観測報告なし。21日以降の攻撃は、21日に直った2件を狙ったもの

前回取り上げた「修正後も残る」主張との関係

前回の記事では、修正後の8.5.12にも未認証(ログインなし)のRCEが残ると主張する個人のページ(php2shell-zeros)を取り上げた。
そのうち「Zero 1」のA項目は、セッションの書き込みと読み込みで session.serialize_handler が食い違うと、攻撃者が選んだオブジェクトを作らせられるという主張だった。
作られたオブジェクトのクラスに __wakeup() や __destruct() があると、復元時や後片付けの時点でそれが自動で動くので、攻撃者が用意した処理の実行につながるとしている。
食い違いの原因として、ディレクトリごとの php_value、仮想ホストの設定、.htaccess、アプリの ini_set() を挙げている。

公式の3つの条件も、設定とアプリの ini_set() で session.serialize_handler が食い違う形になっていて、主張と似ている。
ただ、公式の告知は報告者や見つかった経緯を書いていないので、同じ問題を指しているのかは分からない。
前回の記事の時点で、Zero 1はPHPへ正式に届け出ていない主張だった。
食い違いの原因の範囲も違い、主張は .htaccess などでの切り替えも含めているのに対し、公式が挙げているのはphp.iniなどの設定と ini_set() の組み合わせだけになっている。