PHPの脆弱性「PHP2Shell」のニュースを読んで、「メモリ不足」「状態が残る」という説明に首をかしげた方は多いと思います。私も最初に公式の説明を読んだとき、それがなぜサーバーの乗っ取りにまでつながるのか、すぐには飲み込めませんでした。

この記事では、PHP2Shellの仕組みを、プログラミングを知らなくても追えるように、レストランにたとえて説明します。正確さのために、たとえの後には公式の説明も添えます。

前提 PHPは「注文を次々にさばく厨房」

PHP2Shellの仕組みの前に、PHPの動き方を押さえておきます。Webサイトを見るとき、ブラウザはサーバーに「このページをください」と頼みます。この頼みごとを、リクエストと呼びます。PHPは、リクエストを受け取ってページを組み立てる、厨房のような役割をしています。

ここで大事なのは、1人の料理人(ワーカーと呼ばれるプログラム)が、たくさんの注文を順番にさばいていることです。1つの注文が終わったら、調理台を片付けて、次の注文に移ります。この「片付け」が、今回の2つの欠陥の両方に関わっています。

1件目 材料が足りなくなったとき、片付けが壊れる

1件目(CVE-2026-109618)は、メモリが足りなくなったときの欠陥です。メモリは、料理人が作業に使う調理台の広さのようなものです。

料理の途中で調理台がいっぱいになると、PHPは作業を中断します。問題は、中断したのが、材料を並べている最中だったときです。並べかけの材料が中途半端な状態のまま、片付けの担当が来て、それを「ちゃんと並んだ材料」として扱ってしまう。

攻撃者は、わざと調理台をいっぱいにするような注文を送り、片付けがこの中途半端なものを触る状況を作ります。その状況を足がかりに、サーバー上で任意のプログラムを動かせる、というのが公表された内容です。好きなプログラムを動かせるということは、サイトの中身を書き換えたり、保存されている顧客情報を持ち出したりできるということです。具体的な攻撃の手順は、悪用を広げないためにこの記事では扱いません。

PHPの公式の説明は、メモリ不足の処理が、内部のデータの初期化が途中のときにPHPを中断させ、後片付けがその不正なデータを有効なものとして扱いうる、というものです。

2件目 前の客の忘れ物を、次の客の料理に使ってしまう

2件目(CVE-2026-109619)は、前の注文の情報が、片付けのあとも残ってしまう欠陥です。

料理人は、注文が終わるたびに調理台を空にするはずです。ところが、注文の途中で大きなエラーが起きて作業が打ち切られると、片付けが最後まで終わらないことがあります。すると、前の客の「忘れ物」が調理台に残ったままになる。次の客の注文を作るときに、料理人がその忘れ物を、正しい材料だと思って使ってしまう。

攻撃者は、1回目の注文でわざとエラーを起こして忘れ物を仕込み、2回目の注文でそれを使わせます。PHPの公式の説明では、リクエストが持っていた内部の状態が、その裏のメモリが解放された後も残り、同じワーカーの後のリクエストがそれを使ってしまう、とされています。

なぜmod_phpが一番危ないのか

PHPの公式発表は、Apache(Webサーバーとして広く使われているソフト)の「mod_php」という動かし方が最も危ないとしています。

PHPの動かし方には、Webサーバーの中に組み込む方式(mod_php)と、PHPを別のプログラムとして動かす方式(PHP-FPMなど)があります。Rapid7の解説によると、mod_phpでは、リクエストの受け付けの段階で失敗しても後片付けが走るため、1件目の攻撃が、サイトのプログラムが動き始める前に成立することが実証されています。厨房のたとえでいうと、注文票を受け取った時点で、もう狙われているということです。

PHP-FPMの場合は、受け付けに失敗した料理人がそのまま交代するので、1件目のこの流れは起きにくいとされています。ただし2件目は、同じ料理人が次の注文を受けたときに起きるので、PHP-FPMでも成立が確認されています。安全な動かし方はない、と考えるのが正確です。

既定の機能が入口になっていた

2件目の攻撃の入口として確認されたのは、ファイルのアップロードの進み具合を記録する機能や、PHP 8.5でエラーの詳細を記録する機能でした。どちらも、最初から有効になっている機能です。

これが、今回の件が深刻に扱われた理由の1つだと思います。特殊な設定をしているサイトだけでなく、何も手を加えていない普通のサイトが対象になっていました。これらの機能を止める一時的な対策は、別の記事にまとめています。

仕組みを知って、何が変わるか

PHP2Shellの仕組みを追ってみてわかるのは、どちらの欠陥も、異常が起きたときの後片付けの問題だということです。普段の動作では表に出ず、わざと異常を起こされたときにだけ顔を出す。こういう欠陥は、人の目のレビューでは見つけにくいものです。

自分のサイトが対象かどうかは、PHPのバージョンでわかります。

今回の欠陥を見つけたのは、AIを使って調べていたセキュリティ企業でした。その経緯は別の記事で紹介しています。