REQUEST ENDS. REFERENCE REMAINS.
消えたメモリ。
残った「参照」。
終わったリクエストが、次のリクエストに影響するのはなぜ?
同じワーカーの中を、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 / 部分的な緩和策
アップロードの進捗をセッションで追跡する機能です。通常の初期化より前にセッション処理へ到達する場合があります。これを無効にすると実証済みの一部経路を防げますが、エラー状態や拡張機能など別経路までは防げません。