CVE-2026-9375CVE-2026-9375是urllib3 2.6.3版本中存在的一个高危拒绝服务漏洞,CVSS评分为7.5。该漏洞存在于urllib3的流式API(`preload_content=False`)中,当使用Brotli压缩支持时,攻击者可以通过恶意HTTP服务器触发解压炸弹攻击,导致内存耗尽(OOM)从而引发拒绝服务。
urllib3在2.6.0版本中引入了`max_length`保护机制以缓解CVE-2025-66471(解压炸弹漏洞),但在2.6.3版本中,该保护机制在三个独立的代码路径中被绕过。具体包括:`read()`方法中的缓冲区算术运算可能产生负数`max_length`值;`flush_decoder`无条件地将`max_length`覆盖为`-1`;`_flush_decoder()`方法完全未传递任何限制参数,默认使用无限制解压。这些缺陷使得恶意服务器能够通过发送经过Brotli压缩的大量数据,强制urllib3将超大负载解压到内存中,最终耗尽系统资源。
该漏洞影响所有使用urllib3 2.6.3且启用了Brotli支持的应用和库。由于`requests`库底层使用urllib3进行HTTP通信,因此使用`requests`从不受信任的数据源流式获取内容的应用同样受到该漏洞影响。漏洞无需认证、无需用户交互即可通过网络远程利用,对系统可用性造成严重影响。
该漏洞的核心在于urllib3 2.6.3版本中Brotli解压路径对`max_length`保护机制的绕过。urllib3 2.6.0版本引入了`max_length`参数来限制流式解压过程中单个块的最大长度,以防止解压炸弹攻击。然而,在2.6.3版本中,存在三个独立的代码路径使得该保护失效:
1. **`read()`方法中的负数溢出**:`read()`方法中存在缓冲区算术运算,当输入参数与缓冲区大小进行减法运算时,可能产生负数结果。如果`max_length`变为负数,解码器可能将其解释为无限制或异常行为,从而绕过大小限制。
2. **`flush_decoder`无条件覆盖**:`flush_decoder`方法在调用解码器刷新时,无条件地将`max_length`参数设置为`-1`(即无限制),完全忽略了上层传入的大小限制。这使得在刷新解码器缓冲区时,恶意服务器的数据可以无限制地解压到内存中。
3. **`_flush_decoder()`未传递限制**:`_flush_decoder()`方法在调用Brotli解码器时,完全没有传递`max_length`参数。由于参数默认为`None`或无限制值,解码器将无限制地解压所有待处理的数据。
利用方式:攻击者控制一个恶意HTTP服务器,返回经过Brotli压缩的超大响应数据。当受害客户端使用urllib3的流式API(`preload_content=False`)读取响应时,由于上述三个代码路径绕过了大小限制,Brotli解码器会将压缩数据无限制地解压到内存中,导致进程内存耗尽,触发OOM Killer或系统崩溃,造成拒绝服务攻击。