以前は CVE Replay として公開されていました。リポジトリ名とプレゼンテーションは変更されましたが、固定されたリリース、元の報告者の帰属、フィクスチャのパス、および記録された結果は元のアイデンティティを保持しています。
独立したオフライン研究では、正確なリリースと境界付きフィクスチャを使用して公開された修正を比較します。各研究は、測定された動作、トランスポート境界、および帰属を明示的に保ちます。
CVE-2026-44431 · urllib3 2.6.3 → 2.7.0 · 2026年9月27日再現
リクエストは 3 つの機密ヘッダーを 1 つのオリジンに運びます。リダイレクトが宛先を変更します。次のリクエストはまだそれらを運ぶでしょうか?
この独立したリグレッションは、2 つの正確な urllib3 リリースから実際のリダイレクト実装を実行します。バージョン 2.6.3 は影響を受ける低レベル API を通じて 3 つのヘッダーすべてを保持します。バージョン 2.7.0 はそれらを削除します。無害なヘッダーは存続し、通常のリクエストは依然として機能します。
| フィクスチャ | urllib3 2.6.3 | urllib3 2.7.0 |
|---|---|---|
| 低レベルクロスオリジンリダイレクト | 3 つの機密ヘッダーを保持 | 0 保持 |
| 小文字名での同一ケース | 3 保持 | 0 保持 |
| 高レベル API コントロール | 0 保持 | 0 保持 |
| 直接 200 レスポンス | 意図どおり 3 保持 | 意図どおり 3 保持 |
| リダイレクトを明示的に無効化 | 1 回の呼び出し、302 返却 | 1 回の呼び出し、302 返却 |
| カスタム削除セットが無害なマーカーを追加 | 4 つのヘッダーすべてを保持 | 4 つすべてを削除 |
12/12 シナリオ期待値が合格。 各シナリオはまた、レスポンスステータス、トランスポート呼び出し回数、初期ヘッダーセット、無害ヘッダーの結果、および呼び出し元のヘッダーが変更されていないことをチェックします。脆弱な結果は期待されるベースライン結果であり、合格するセキュリティチェックではありません。
機械可読な結果には、キャプチャされた引数、正確な wheel ハッシュ、ランタイム、テストソースハッシュ、帰属、および再現時刻が含まれます。
2026年5月7日に公開された上流のアドバイザリは、urllib3 のプロキシ経由の低レベルリダイレクトパスにおける情報漏洩問題を特定しています。影響を受けるバージョンとして >=1.23, <2.7.0 をリストしています。ProxyManager.connection_from_url(...).urlopen(..., assert_same_host=False) を呼び出すと、設定された機密ヘッダーを別のオリジンへのリダイレクトされたリクエストに運ぶ可能性がありました。高レベルマネージャ API はすでにそれらを削除していました。
上流の修正は、再帰的な低レベルリクエストの前に Retry.remove_headers_on_redirect を適用します。私たちの小文字ヘッダーケースは、上流のリグレッションのヘッダー名の大文字小文字への注意に従います。カスタム削除ケースは、ルールが 3 つのデフォルト名だけでなく、設定されたセットを尊重することをチェックします。
アドバイザリは christos-cantina-security を報告者、illia-v をコーディネーター、sethmlarson を修正レビュアーとしてクレジットしています。ここでの Sergio Rodriguez の貢献は、独立したオフラインハーネスと前後分析です。これは彼らの公開された CVE の再現です。
Python 3.10 以降を使用してください。pip install や仮想環境は不要です。各バージョンは、新しく分離されたサブプロセス内で純粋な Python wheel から直接インポートされます。
ポートフォリオリポジトリのルートから:
python -B ./labs/cve-replay/run_replay.py --fetch
python -B ./labs/cve-replay/run_replay.py
最初のコマンドは 2 つの正確な wheel をラボの無視された .cache/wheels/ ディレクトリにダウンロードし、マニフェストに対して SHA-256 ハッシュをチェックします。2 番目のコマンドはダウンロードせずにそのキャッシュを使用します。スタンドアロンのソースチェックアウトの場合は、python -B run_replay.py --fetch を実行し、次に --fetch なしで同じコマンドを実行します。--cache は別のローカルキャッシュディレクトリを受け入れます。
HTTPConnectionPool._make_request は 2 レスポンストランスポートに置き換えられます。固定された location を持つ 302、次に 200 です。フィクスチャはその境界に到達する引数をキャプチャします。urllib3 のパース、リトライポリシー、ヘッダーフィルタリング、および再帰的なリダイレクト処理は、選択された wheel から変更されずに実行されます。
すべての宛先は固定された予約済み .invalid 名です。すべてのヘッダー値は DUMMY で始まります。ソケット構築と DNS 関数は即座に例外を発生させます。ライブラリのインポート時の IPv6 機能プローブは拒否され、別途記録されます。リプレイシナリオはネットワーク操作を試みません。リスニングサーバーやライブターゲットはありません。
これはリダイレクト引数の処理を検証します。エンドツーエンドのプロキシトラフィックを測定するものではありません。バージョン 2.7.0 はこの特定の CVE に対する最初の修正です。この歴史的な比較は、新しいサポートされているリリースよりもそれを選択することを推奨するものではありません。
フィクスチャスクリプトと分析はオリジナルのポートフォリオ作品です。urllib3 はその MIT ライセンスの下で配布されている上流プロジェクトです。そのコードとリリース wheel はポートフォリオソースアーカイブに再配布されていません。それらは PyPI から別途ダウンロードされ、実験のために変更されずにインポートされます。