urllib3: HTTPResponse.stream()/read_chunked() が、無制限のチャンクサイズをメモリにバッファリングする。
## 影響
urllib3の[ストリーミングAPI](https://urllib3.readthedocs.io/en/2.7.0/advanced-usage.html#streaming-and-i-o)は、HTTPレスポンス全体を一度にメモリに読み込むのではなく、コンテンツをチャンク単位で読み込むことで、大規模なHTTPレスポンスを効率的に処理するように設計されています。 [チャンク転送符号化されたレスポンス](https://httpwg.org/specs/rfc9112.html#chunked.encoding)をデコードする場合、このAPIは、改行文字`\n`またはEOF(ファイル終端)が現れるまで、各チャンクのサイズフィールドをバッファリングします。
悪意のあるHTTPサーバーは、`Transfer-Encoding: chunked`を返し、改行文字なしで非常に長いバイト列を送信することで、ストリーミングクライアントがその全長をバッファリングさせ、urllib3がチャンクサイズを無効として拒否し、意図した以上のメモリを割り当ててしまう可能性があります。
この問題を修正するために、非ストリーミングの場合と同様に、65536バイトを超えるチャンクサイズフィールドを拒否します。これは、現在、Python標準ライブラリによって処理されています。ただし、これはチャンクデータのサイズフィールドのみに適用され、チャンクデータ自体はすでに正しく処理されています。したがって、悪意のないサーバーには影響はありません。
## 影響を受ける利用方法
urllib3のバージョンが2.8.0より前のアプリケーションやライブラリは、信頼できないソースからチャンクされたレスポンスをストリーミングする場合に影響を受ける可能性があります。具体的には、HTTPResponseオブジェクトの[read_chunked()](https://urllib3.readthedocs.io/en/stable/reference/urllib3.response.html#urllib3.response.BaseHTTPResponse.read_chunked)および[stream()](https://urllib3.readthedocs.io/en/stable/reference/urllib3.response.html#urllib3.response.BaseHTTPResponse.stream)メソッドが影響を受けます。
また、内部でurllib3を使用しているrequestsのストリーミングAPIも影響を受けます。
## 対策
urllib3のバージョンを2.8.0以降にアップグレードしてください。2.8.0以降では、チャンクサイズが65536バイトを超えるものは拒否されます。アップグレードがすぐにできない場合は、[read()](https://urllib3.readthedocs.io/en/stable/reference/urllib3.response.html#urllib3.response.BaseHTTPResponse.read)メソッドを使用して、レスポンス全体を一度に読み込むことを検討してください。
影響を受けるパッケージ:
- pip (Python) urllib3: 影響を受けるバージョンは1.10.3以上、2.8.0未満。2.8.0で修正済み。