PHP2Shell Lab
オフライン教材

REQUEST ENDS. REFERENCE REMAINS.

消えたメモリ。
残った「参照」。

終わったリクエストが、次のリクエストに影響するのはなぜ?
同じワーカーの中を、6つのステップでのぞいてみよう。

比較する状態
比較する状態
STEP 01 / 06通常の状態

状態と「参照」を保存。

クライアント
WORKER W · 同じプロセスリクエスト後も存続
ワーカー内の参照→ SLOT A
SLOT A説明用の場所ラベル

古い参照・危険な連鎖参照を消去・経路を遮断
6秒ごと

これは、仕組みを理解するための模型です。

実際のメモリ配置や処理順序を再現した exploit ではありません。UAF が起きることと、RCE に成功することは別です。意図したデータの再利用・精密な悪用・同じワーカーへの到達など、複数の条件が必要です。

ここではセッション状態の経路を簡略化しています。参照を残す側(producer)と使う側(consumer)は、同じワーカーが扱う別の HTTP リクエストです。

FPM / mod_php と、対策の注意点

FPM:起動処理(リクエスト初期化)が失敗すると、その子プロセスは終了します。検証済みの経路は、正常に起動した後のアプリケーション実行で状態を公開し、致命的エラーを経て、次のリクエストの upload progress が使うものです。適切なアプリケーション操作が必要です。

mod_php:multipart の起動処理中に状態の公開と致命的エラーが起きる経路も成立します。PHP 8.5 の fatal backtrace と、初期化前の設定診断を組み合わせた RCE も確認されています。FPM と同じ条件ではありません。

唯一の信頼できる対策:完全な状態リセット修正を含む PHP リリースへ更新することです。進捗機能 OFF は一部のセッション経路だけを遮断します。管理設定で無効化した場合は全ワーカーの再起動が必要で、他の状態や経路の修正にはなりません。

致命的エラーだけでなく、終了処理中の非致命的な診断で、消去済みのエラー状態が再び設定される場合もあります。警告の非表示・ログが空であること・ワーカーが複数あることは、安全の証明にはなりません。

ことばの小さな辞典

ワーカー / リクエスト

リクエストは、ブラウザーなどから届く1回の HTTP の依頼。ワーカーは依頼を処理するプロセスです。1つのワーカーが、時間をおいて別々の依頼を扱うことがあります。すべての依頼が同じワーカーに届くわけではありません。

参照 / 古い参照

参照は、データの場所を指す「札」のようなもの。データを片づけたのに札だけが残ると、古い場所を正しいものとして使ってしまうおそれがあります。SLOT A はこの教材だけのラベルで、実際のアドレスではありません。

UAF / use-after-free

解放したメモリを、その後も有効だと思って使ってしまうこと。読む・解放する・分岐に使うなどの操作が含まれます。元のデータがもう存在しない場所を扱うため、情報漏えいや処理の異常につながります。

RCE / 模擬シェル

RCE はリモートから意図しないコードを実行させること。精密な悪用が成立した場合の権限は Web ワーカーのものです。自動的に root になるわけではありません。この教材のシェル・逆方向の接続は概念だけで、実行も接続も行いません。

upload progress / 部分的な緩和策

アップロードの進捗をセッションで追跡する機能です。通常の初期化より前にセッション処理へ到達する場合があります。これを無効にすると実証済みの一部経路を防げますが、エラー状態や拡張機能など別経路までは防げません。