深入解析 urllib3 压缩数据流处理漏洞(CVE-2025-66471)

本文详细分析了Python HTTP客户端库urllib3中的一个高严重性漏洞(CVE-2025-66471)。该漏洞影响1.0至2.6.0之前版本,其流式API在处理高压缩比数据时存在缺陷,可能导致客户端资源耗尽。文章涵盖漏洞的技术原理、影响范围、修复方案及相关的CVSS评分。

CVE-2025-66471:urllib3 流式API不当处理高压缩数据漏洞分析

漏洞概述

CVE-2025-66471 是Python流行的HTTP客户端库 urllib3 中发现的一个高严重性漏洞。该漏洞影响版本1.0至2.6.0(不包括2.6.0),其核心问题在于流式API(Streaming API)在处理高度压缩的HTTP响应数据时存在缺陷,可能导致客户端应用程序遭受资源耗尽攻击。

技术细节

流式API的工作原理

urllib3 的流式API旨在高效处理大型HTTP响应,通过分块读取内容而不是一次性将整个响应体加载到内存中。当流式传输压缩响应时,urllib3 会根据HTTP的 Content-Encoding 头部(例如 gzipdeflatebrzstd)执行解码或解压缩操作。

漏洞触发机制

库必须从网络读取压缩数据并进行解压,直到满足请求的数据块大小。任何超出请求量的解压数据都会保存在内部缓冲区中,供下一次读取操作使用。

问题的关键在于解压缩逻辑可能导致 urllib3 在单次操作中完全解码一小部分高度压缩的数据。这可能导致客户端资源过度消耗(CPU使用率高并为解压数据分配大量内存),即使应用程序仅请求了一小部分数据。

受影响的调用方式

受影响的调用包括使用 urllib3.HTTPResponse 方法的以下操作(除非显式禁用解码):

  • stream()
  • read(amt=256)
  • read1(amt=256)
  • read_chunked(amt=256)
  • readinto(b)

影响范围

受影响的版本

  • urllib3 版本 >= 1.0, < 2.6.0

受影响的用途

使用 urllib3 2.5.0及更早版本流式传输大型压缩响应或来自不可信来源内容的应用程序和库。

修复方案

主要修复措施

升级到至少 urllib3 v2.6.0版本,该版本中库避免了解压超过请求量的数据。

相关依赖升级

如果环境中包含支持Brotli编码的包,请同时升级到至少:

  • Brotli 1.2.0
  • brotlicffi 1.2.0.0

这些版本由修补后的 urllib3 版本中的 urllib3[brotli] extra强制要求。

安全评分

CVSS 4.0 评分

  • 基础评分:8.9(高危)
  • 向量CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:H

CVSS 3.1 评分

  • 基础评分:7.5(高危)
  • 向量CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H

弱点分类

CWE-409

不当处理高度压缩数据(数据放大):产品未处理或错误处理具有极高压缩比、产生大量输出的压缩输入。

致谢与参考

发现者

  • 该问题由 @Cycloctane 报告
  • 补充信息由 @stamparm 在7ASecurity执行并由OSTIF协助的安全审计期间提供

相关参考

总结

CVE-2025-66471揭示了 urllib3 流式处理机制中的一个重要安全缺陷,强调了在处理来自不可信源的压缩数据时需要特别谨慎。开发人员应及时升级到修复版本,并确保相关依赖包也得到相应更新,以防范潜在的资源耗尽攻击风险。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计