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から別途ダウンロードされ、実験のために変更されずにインポートされる。