CVE-2025-43859: Request Smuggling Vulnerability in Python’s h11 HTTP Library
2025/04/27 SecurityOnline — Python で記述され、最小限の機能だけを持ち、I/O に依存しない、HTTP/1.1 プロトコル・ライブラリ h11 に、深刻な脆弱性 CVE-2025-43859 (CVSS:9.1) が発見された。この脆弱性により、不適切なコンフィグやバグのある HTTP プロキシと連携するアプリケーションにおいて、h11 に対するリクエスト・スマグリング攻撃の可能性が生じている。

h11 のアドバイザリでは、「チャンク化されたメッセージ本文の、行末文字に対する h11 による解析の緩さにより、特定の状況下におけるリクエスト・スマグリングにつながる可能性がある」と警告されている。
チャンク化された転送エンコーディングを用いる HTTP/1.1では、リクエスト/レスポンスの本文が、可変サイズのセグメントで送信される。それぞれのチャンクは、CRLF シーケンス (\r\n) で終了する。しかし、h11 のバージョン 0.14.0 以下は、末尾のバイトが (\r\n) であることを適切に検証せず、誤って任意の2バイトを受け入れていた。
この寛容さ自体が、直ちに危険というわけではない。しかし、チャンク形式のエンコードを誤って解釈するリバース・プロキシの背後で h11 を使用すると、不整合が発生する。たとえば、リバース・プロキシが “read until end of line” 関数を使用し、単純に最後までを読み込もうとすると、本来よりも長いバイト列を取り込む可能性が生じる。その結果として h11 とプロキシは、同じバイト・ストリームを異なる方法で解釈することになる。
h11 に関するアドバイザリには、「2つの HTTP プロセッサが、同じバイト列を受け入れながら異なる方法で解釈する場合には、リクエスト・スマグリング攻撃が発生する条件が整う」と記されている。
アドバイザリに掲載されている実例は、不正なチャンク形式のリクエストを、h11 が二種類の HTTP リクエストとして解釈する一方で、バグのあるプロキシでは、それらが結合され一体化したリクエストとして認識されるというものだ。したがって、2つ目のリクエストに機密性の高いヘッダー (Cookie: SESSION_KEY=abcdef…など) が含まれている場合において、サーバでは最初のリクエストの一部としてヘッダーが取り扱われ、実質的に認証情報の漏洩や、アクセス制御のバイパスを引き起こす可能性が生じる。
このような状況は、保護されるエンドポイントへのアクセスを制限するために、プロキシが使用されている環境において特に危険である。
h11 のアドバイザリには、「最も深刻な攻撃の1つとして挙げられるのは、異なるユーザーからの2つの HTTP リクエストを、同じコネクション経由で送信するものだ。脆弱なプロキシは、両方のリクエストをバックエンド・サーバに転送し、そのバックエンド・サーバは、2番目のユーザーの認証情報を、1番目のリクエスト本文の一部として解釈する可能性を持つ」と記されている。
さらにアドバイザリは、「したがってサーバは、2つが連結されたリクエストを認識し、それらを /one である1つのリクエストとして解釈するが、その本文には /two のセッションキーが取り込まれている。それにより、あるユーザーが、別のユーザーの認証情報を盗む可能性が生じる」と警告している。
この問題は、h11 のバージョン 0.15.0 で、すでに修正されている。h11 を使用している開発者に対して、強く推奨されるのは、速やかなアップグレードである。
Python の軽量 HTTP ライブラリである h11 に、リクエスト・スマグリングの脆弱性が発生しています。深刻な状況とのことですので、開発者の皆さんは、アップデートをお急ぎください。この脆弱性の原因が、丁寧に説明されているので、リクエスト・スマグリングが理解しやすくなります。なお、関連トピックとして、2025/03/09 に「Python ライブラリ python-json-logger の脆弱性が FIX」という記事をポストしています。よろしければ、Python で検索と併せてご参照ください。
You must be logged in to post a comment.