HN 日本語サマリー

← 一覧へ戻る
セキュリティ

PHP session.upload_progress ヒープの解放後使用 (CVE-2026-109618 / -109619)

PHP session.upload_progress heap UAF (CVE-2026-109618 / -109619) (jackalsyn.com)

134 pointsby rfarley0438 コメント

要約

PHPの`session.upload_progress`機能に、`session.upload_progress.enabled`が有効な場合にヒープの解放後使用(UAF)の脆弱性が存在します。この脆弱性は、攻撃者が細工したリクエストを送信することで、任意のコード実行につながる可能性があります。対策として、`session.upload_progress.enabled`を無効にするか、multipartアップロードを制限することが推奨されています。

全文翻訳

Overview

2つのキャッシュされたバケットポインタ、1つの解放済みツリー。zend_call_functionに到達するPHP session.upload_progressのヒープ解放後使用。

PHPのsession.upload_progressハンドラ(ext/session/session.c内のphp_session_rfc1867_callback)は、2つの生のzval *バケットポインタをライブなHashTableにキャッシュします:post_bytes_processedとcurrent_file_bytes_processedです。どちらも、リクエストライフサイクルが攻撃者の足元で解放する配列を指しています。完全なバンドルを歩くには、上の[SOURCE]を押してください:トリガーリクエスト、両方のPoCチェーン、抽出ハーネス、および検証済みのビルドごとのシンボルデルタが含まれています。

標準設定で十分です。session.upload_progress.enabled=1とデフォルトの名前、プレフィックス、freq=1%、min_freq=1です。単一の高速なマルチパートPOSTが両方のキャッシュを武装させます。2回目のupdate()はセッションファイルを再読み込みし、zend_hash_updateはそのHashTableデストラクタzval_ptr_dtorを通じて以前のデコードされたツリーを破壊します。解放されたバケットはその後回収され、古いポインタはzend_call_function、つまりsystem()を呼び出す攻撃者形状のzend_fcall_info / zend_internal_functionに着地します。

以下のすべてが実際のphp-src(8.4.4および8.2.34)で検証されています:元の書き込みの各行参照、ZVAL_COPY_VALUEの追加参照なし移動、再デコード/track_initフリー、および構造体オフセット(zend_fcall_infoは64B、param_countは+48、zend_internal_function.handlerは+88、IS_STRING_EX 0x106、IS_OBJECT_EX 0x308)。

この投稿のフレームワークは、ビルドごとのデルタ抽出(--syms)を組み込んでいます。なぜなら、zval_ptr_dtorとzend_call_functionの間のオフセットはビルドごとに変化するからです。公式のLiteSpeed lsphp82 8.2.34デバッグシンボルは、3つのディストリビューションサブビルド(bookworm 0xc930、noble 0xcef0、jammy 0xd060)の正確な値を提供し、以下に含まれています。

php-up-2026 (bundle)/

ディレクトリをクリックして展開 · ファイルをクリックして内容を表示

ソースを検査するためにツリーからファイルを選択

Usage

チェーンの検証、抽出、配信方法

$ python3 php_up_framework.py --selftest # フォーミング + ボディレイアウトチェック

$ python3 php_up_framework.py --syms --binary /path/to/lsphp # dtor / call / delta を抽出

$ python3 php_up_framework.py --build --bug 619 --dtor <leak> -o body.bin

$ python3 php_up_framework.py --lab --bug 618 --dtor <leak> # php-fpm ラボ配信

$ python3 php_up_framework.py --live <target-url> --bug 619 --dtor <leak>

Mitigation (pre-patch)

公式アドバイザリが公開される前に何をすべきか。これらはすべて今夜行うことができます。

1. PHPのインベントリを取る

すべてのホストとバージョン(php -v)を把握してください。PHP 7.x以前のバージョンは修正プログラムを受け取らないため、アップグレードを計画してください。

2. 一時的な対策を適用する(最良のインテル、低リスク、元に戻せる)

php.ini / .user.ini / .htaccessで:

session.upload_progress.enabled = Off

PHP-FPMまたはWebサーバーをリロードしてください。私の分析では、これは2つの可能性のあるパスのうち1つを閉じます。

3. エッジでマルチパートアップロードをクランプする

2番目の可能性のあるパスは、上記のどの設定に関係なく、multipart/form-data POSTで常に実行されるマルチパートパーサー自体にあります。WAFまたはリバースプロキシを使用している場合は、アップロードを必要としないエンドポイントへのマルチパートPOSTの検査を強化するか、レート制限してください。これは、エンタープライズベンダーが有料顧客のために静かに展開しているネットワークレイヤーの緩和策と同じです。

4. パッチがリリースされたらすぐに適用する

現在の安定版:8.5.11 / 8.4.26 / 8.3.35 / 8.2.34。ホスティングが管理されている場合は、プロバイダーのタイムラインを今日確認してください。

なぜこれを無料で公開するのか

パッチ前の緩和策はサブスクリプション特典であるべきではありません。私は一人で事業を行っており、リークとパッチの間のギャップで最も火傷する可能性が高い組織は、エンタープライズ脅威インテル契約を持っていない小規模チームです。上記のステップは無料です。リスクを軽減するために今夜を過ごしてください。明日インシデント対応をするのではなく。

公式アドバイザリが公開されたらフォローアップし、私の根本原因の読みが正しかったかどうか、Andrew Dorman (@acd421)およびArch&Yuki (@ArchKnight23)とともに確認します。

Download

どこで入手するか。

通常の場所からの署名付きリリース:

  • wget http://jackalsyn.com/posts/phpupAssets/php-up-2026.tar.gz
  • tar -xzf php-up-2026.tar.gz
  • hash(256) a29d640e0481ff64a39541faeeeec0f998ecd18fb692816e75a6bcfa0f683017

クレジット: