
ローカルの curl/libcurl ビルドについて、CVE-2026-92392 の HTTP/2 アップロードにおける use-after-free 脆弱性への露出を検査します。パッシブなインベントリ、マウント済みイメージのスキャン、および範囲を限定したループバック PoC プローブを備えています。
cve_2026_92392_check.py は、ローカルの curl および libcurl アーティファクトについて
CVE-2026-92392(curl/libcurl における HTTP/2 アップロードの
use-after-free)への露出を評価します。
これは、パッシブなローカルインベントリ、提供されたバナーによる評価、非実行の マウントイメージスキャン、および境界付きのループバック HTTP/2 プロトコルプローブをサポートします。 プローブは防御的かつ非兵器化されています。コマンドペイロード、シェルコード、 メモリアドレス操作、情報漏洩ロジック、RCE ペイロードは含まれていません。
アクティブプローブは 127.0.0.1 にのみバインドし、リモートのターゲット URL や
ホストを受け付けず、選択されたローカルの curl バイナリのみを実行します。
チェッカーは4つの異なる証拠レベルを区別します:
| 証拠レベル | 確立するもの | 確立しないもの |
|---|---|---|
| ビルド分類 | バージョンで特定された curl/libcurl アーティファクトが上流の影響範囲外にあるか、上流で影響を受けるがベンダーのパッチ状態が不明か、提供されたパッチ状態の証拠を用いて影響が確認されているか | アプリケーションが実際に影響を受ける HTTP/2 アップロード経路を使用しているかどうか |
| ランタイム露出コンテキスト | 提供されたアプリケーションの事実が、HTTP/2 アップロードが攻撃者制御のエンドポイントに到達し得ることを示すかどうか | 脆弱性が実際にトリガーされたかどうか |
| プロトコル刺激 | ローカルループバックハーネスが、1つの HTTP/2 接続上で2回のアップロードを伴う、文書化された両方のリセットバリアントを配信したかどうか | use-after-free、クラッシュの原因、またはコード実行 |
| CVE に帰属するサニタイザー結果 | 候補シーケンス、AddressSanitizer のヒープ use-after-free、上流で影響を受けるアーティファクトの同一性、および一致する HTTP/2 スタックがすべて観測されたかどうか | 別のシステムにおける信頼性または実用的な悪用可能性 |
クリーンな実行、不完全なプロトコル実行、またはクラッシュしないサニタイザー実行は、 ビルドが安全であることを証明するものではありません。
CVE-2026-92392 は curl/libcurl の HTTP/2 アップロード処理に影響します。アップロード中、
影響を受けるビルドは REFUSED_STREAM または HTTP_1_1_REQUIRED のいずれかを運ぶ
HTTP/2 RST_STREAM を処理する可能性があります。その後、元の転送の HTTP/2 状態が
切り離された後に、バッファされたアップロードデータが新しいリクエストとして
解析される可能性があります。その後の HTTP/2 コールバックが、古い Curl_easy ポインタを
参照する可能性があります。
このチェッカーを改訂するために使用された REA 比較により、関連するクリーンアップの 順序の違いが確認されました:
Curl_conn_ev_data_done を呼び出し、保留中の
ハンドルを処理し、その後にのみ Curl_req_done を呼び出します。Curl_req_done は req_flush に到達しますが、HTTP/2 の data-done 経路は
すでにストリームコンテキストをクリアしています。Curl_conn_ev_data_done の前に Curl_req_done を実行し、
その古い順序を排除しています。これはチェッカーの証明モデルを裏付ける実装上の証拠です。ベンダーの パッチ状態については、依然として独立した検証が必要です。
上流のアドバイザリは、脆弱な実装が curl 8.12.0 で導入されたと特定しています。 チェッカーは上流リリースを次のように分類します:
| リリース条件 | 分類 |
|---|---|
| 8.12.0 より前 | NOT AFFECTED |
| 8.12.0 から 8.22.0 まで(修正済みバックポートを除く) | 上流で影響あり |
| 8.14 ブランチの 8.14.3 以降 | 修正済みバックポート |
| 8.16 ブランチの 8.16.2 以降 | 修正済みバックポート |
| 8.20 ブランチの 8.20.2 以降 | 修正済みバックポート |
| 8.23.0 以降 | NOT AFFECTED |
| 開発版、スナップショット、ナイトリービルド、または曖昧なバージョン | INDETERMINATE |
ベンダーは curl の上流バージョン文字列を変更せずに修正をバックポートできます。 したがって、影響を受ける上流バージョンはインベントリの証拠であり、ベンダービルドが 未パッチであることの決定的な証明ではありません。
--patch-state は、下流のセマンティック修正状態がベンダーのアドバイザリ、パッケージの
変更履歴、ソース比較、またはその他の信頼できるアーティファクトレベルの方法によって
検証されている場合にのみ使用してください。
--patch-state の値 | 意味 |
|---|---|
unknown | デフォルト。影響を受ける上流バージョンは UPSTREAM-AFFECTED VERSION を生成します。 |
absent | オペレーターが下流の修正が存在しないことを独自に検証済み。HTTP/2 対応の影響を受けるビルドは AFFECTED BUILD を生成します。 |
present | オペレーターが下流のセマンティック修正が存在することを独自に検証済み。これはオペレーターによる主張であり、curl の上流修正とのバイナリ等価性を自動的に証明するものではありません。 |
--poc 用のローカル curl 実行ファイル。--poc-proof asan 用の AddressSanitizer 計装済み curl ビルド。--tls を使用する場合のみ openssl コマンド。アクティブ PoC モードは、スクリプト、ラッパー、正体不明のネイティブ実行ファイル、および PE/Windows バイナリを拒否します。パッシブ評価はバナーおよびマウントされたファイルシステムに対して引き続き利用可能です。
PATH 内で見つかった curl バイナリを検査します:
python3 cve_2026_92392_check.py
JSON形式で出力します:
{
"name": "example",
"version": "1.0.0",
"description": "サンプル設定",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
python3 cve_2026_92392_check.py --json
内部セルフテストを実行します:
python3 cve_2026_92392_check.py --self-test
python3 -O cve_2026_92392_check.py --self-test
選択した curl 実行ファイルと libcurl 共有ライブラリを検査します:
python3 cve_2026_92392_check.py \
--curl-binary /opt/curl/bin/curl \
--libcurl-path /opt/curl/lib/libcurl.so \
--json
信頼できる curl バナーをバイナリを実行せずに評価する:
python3 cve_2026_92392_check.py \
--version-string 'curl 8.12.0 libcurl/8.12.0 nghttp2/1.61.0' \
--json
8.12.0 のようなベアバージョンは、検証済みの curl/libcurl の識別情報としての証拠にはなりません。
チェッカーは意図的にリモートホストへ接続しません。認可された管理チャネルを通じてバナーを取得し、ローカルに保存してから、ローカルで評価してください:
ssh [email protected] 'curl --version' > host-curl-version.txt
python3 cve_2026_92392_check.py \
--version-file host-curl-version.txt \
--http2-use unknown \
--untrusted-upload unknown \
--https-certificate unknown \
--json
アプリケーションレビューまたは信頼できるトレースによって、アップロードがHTTP/2を使用し、攻撃者が制御するエンドポイントに到達でき、そのHTTPS証明書を受け入れることが確認された場合は、それらの事実を明示的に提供してください:
python3 cve_2026_92392_check.py \
--version-file host-curl-version.txt \
--http2-use yes \
--untrusted-upload yes \
--https-certificate yes \
--patch-state unknown \
--json
クリアテキストの h2c には --https-certificate not-applicable を使用します。
--http2-use yes は実行時の HTTP/2 使用を識別します。これは、その
成果物が HTTP/2 サポート付きでコンパイルされたことを証明するものではありません。同様に、--untrusted-upload yes
はアプリケーションのデータフローを記述し、--https-certificate yes は
別個の HTTPS 信頼条件を記録します。
--root を使用すると、検出されたファイルを実行せずに、マウントされたコンテナイメージ、VM イメージ、または展開された
ファイルシステムをスキャンできます:
python3 cve_2026_92392_check.py \
--root /mnt/rootfs \
--json
ルートスキャン:
curl、curl.exe、libcurl アーティファクトのみを検査する。INDETERMINATE のままとなる場合がある。ビルド判定は 2 つの条件によって決定される:
| 前提条件 | 意味 |
|---|---|
| P1 | 影響を受ける上流範囲内の検証済み curl/libcurl の識別情報とバージョン。ただし検証済みの下流パッチ状態に従う |
| P2 | 評価対象アーティファクトにコンパイルされた HTTP/2 サポート |
実行時の露出は別途評価される:
| 前提条件 | 意味 |
|---|---|
| P3 | 評価対象のアップロードが実際に HTTP/2 をネゴシエートする |
| P4 | アプリケーションが攻撃者制御の HTTP/2 エンドポイントへアップロードできる |
| P5 | HTTPS 使用時に HTTPS 証明書が受け入れられる |
| P6 | アーキテクチャ、libc、TLS 割り当て動作、CA バンドルなど、エクスプロイト固有の環境詳細 |
| P7 | アップロードサイズ、並行性、ペイロードウィンドウ、タイミングなど、エクスプロイト側の段取り |
P1 と P2 がビルドの適用可否を決定する。P3 と P4 は、潜在的に影響を受ける使用が特定されるかどうかを決定する。P5 から P7 はリモートエクスプロイトの条件に影響するが、HTTP/2 の use-after-free が存在するかどうかには影響しない。
| 判定 | 意味 |
|---|---|
NOT AFFECTED | バージョンが上流の影響範囲外であるか、修正済みバックポートが特定されたか、HTTP/2 が権威的に存在しない。 |
UPSTREAM-AFFECTED VERSION | HTTP/2 サポートを備えた影響を受ける上流バージョンが特定されたが、下流のパッチ状態は不明。 |
AFFECTED BUILD | 影響を受ける上流バージョンと HTTP/2 サポートが特定され、独立して検証された証拠として --patch-state absent が指定された。 |
INDETERMINATE | 製品の識別情報、バージョン、HTTP/2 サポート、またはリリース状態を確立できなかった。 |
デフォルトのアクティブプローブは、127.0.0.1 にバインドされたサーバーに対して 2 つの合成アップロードを実行する。これは文書化された両方のリセットバリアントを送信する:
REFUSED_STREAMHTTP_1_1_REQUIRED各バリアントについて、ハーネスはアップロードの停止を待ち、部分的なレスポンスを送信し、RST_STREAM を送信し、ストリームレベルの証拠を記録する。プロトコルの証明は、両方のリセットバリアントが送信され、各バリアントについて 1 つの接続上で 2 つのアップロードストリームが観測された場合にのみ満たされる。
python3 cve_2026_92392_check.py \
--curl-binary /path/to/curl \
--poc \
--poc-proof protocol \
--json
STIMULUS REPRODUCED という結果は、境界付けられたプロトコル条件が観測されたことを意味します。これは use-after-free、クラッシュの因果関係、CVE の帰属、またはコード実行を証明するものではありません。
デフォルトでは、選択されたアーティファクトが上流で影響を受ける HTTP/2 対応の curl ビルドとして識別されない場合、PoC モードはスキップされます。--force は、ローカルのネガティブコントロールに対して無害なループバックハーネスを実行することを許可しますが、ネイティブフォーマットや製品識別の検証をバイパスするものではありません。
python3 cve_2026_92392_check.py \
--curl-binary /path/to/known-fixed-curl \
--poc \
--force \
--json
AddressSanitizer モードは、無害なリクエスト風のマーカーを含む、ローカルで生成された合成アップロードを使用します。これはクリーンアップ経路の候補プローブであり、公開されているエクスプロイトの形状をコピーしたものではありません。
python3 cve_2026_92392_check.py \
--curl-binary /path/to/asan/curl \
--poc \
--poc-proof asan \
--json
チェッカーが CVE-2026-92392 REPRODUCED を報告するのは、以下のすべてが真である場合のみです:
heap-use-after-free を報告した。on_begin_headers および HTTP/2 コンテキストを含む)と一致した。