HTTP/2代理窗口大小计算中的整数溢出风险分析

本文详细分析了curl中HTTP/2代理实现存在的整数溢出漏洞,涉及窗口大小计算可能导致内存损坏或拒绝服务,并讨论了漏洞的影响范围及修复建议。

报告 #3238249 - HTTP/2代理窗口大小计算中的整数溢出风险 | HackerOne

摘要

curl中的HTTP/2代理实现在缓冲区大小计算中存在潜在的整数溢出漏洞,可能导致内存损坏或拒绝服务。

AI使用声明

本报告由人类安全研究人员通过手动代码审查准备。未使用AI生成本报告。

受影响版本

所有包含HTTP/2代理实现的curl版本(自该功能引入以来)。在Linux x86_64上使用curl 8.6.0进行了测试。

漏洞分析

检查cf-h2-proxy.c中的窗口大小计算:

1
2
3
#define PROXY_H2_CHUNK_SIZE  (161024)
#define H2_TUNNEL_WINDOW_SIZE        (10 * 1024 * 1024)
#define PROXY_H2_NW_RECV_CHUNKS  (H2_TUNNEL_WINDOW_SIZE / PROXY_H2_CHUNK_SIZE)

如果通过恶意HTTP/2帧操纵任一值,计算H2_TUNNEL_WINDOW_SIZE / PROXY_H2_CHUNK_SIZE可能溢出。

1
2
nghttp2_session_set_local_window_size(ctx->h2, NGHTTP2_FLAG_NONE, 0,
PROXY_HTTP2_HUGE_WINDOW_SIZE);

使用100MB窗口大小(PROXY_HTTP2_HUGE_WINDOW_SIZE)可能导致内存耗尽。

支持材料/参考文献

  • 易受攻击的代码位于curl源代码库中的lib/cf-h2-proxy.c
  • 其他HTTP/2实现中也发现了类似漏洞(CVE-2019-9511,CVE-2019-9513)

影响

控制恶意HTTP/2代理服务器的攻击者可能:

  • 导致整数溢出,进而导致内存损坏
  • 通过极大的窗口大小触发资源耗尽
  • 通过精心构造的窗口大小通告导致拒绝服务

影响范围限于:

  • 使用启用HTTP/2代理支持的curl的系统
  • 当连接到不受信任或受损的HTTP/2代理时
  • 需要攻击者处于中间人位置或控制代理服务器

建议修复

  • 为窗口大小计算添加边界检查
  • 为窗口大小实现合理的最大限制
  • 添加对来自对等方的窗口大小通告的验证
  • 考虑对大小计算使用饱和算术

附加信息

此漏洞是通过手动代码审查发现的,重点关注HTTP/2代理实现中的整数处理。由于需要代理服务器受损或中间人位置,风险在一定程度上得到缓解,但潜在影响证明解决这些问题是有必要的。

该漏洞与已知的HTTP/2实现缺陷具有相似特征,这些缺陷已在其他软件(例如nghttp2、Apache HTTP Server)中被利用。

时间线

  • 2025年7月6日 00:45 UTC - rbxcoolkidd向curl提交报告
  • 2025年7月6日 04:42 UTC - dfandrich(curl工作人员)发表评论
  • 2025年7月6日 06:44 UTC - jimfuller2024(curl工作人员)发表评论
  • 2025年7月6日 10:04 UTC - bagder(curl工作人员)发表评论
  • 2025年7月6日 21:04 UTC - bagder关闭报告并将状态更改为"不适用"
  • 2025年7月6日 21:04 UTC - bagder请求披露此报告
  • 2025年7月7日 10:16 UTC - bagder披露此报告

报告详情

  • 报告时间:2025年7月6日 00:45 UTC
  • 报告者:rbxcoolkidd
  • 报告对象:curl
  • 报告ID:#3238249
  • 严重性:中等(4 ~ 6.9)
  • 披露时间:2025年7月7日 10:16 UTC
  • 弱点:整数溢出
  • CVE ID:CVE-2019-9511,CVE-2019-9513
  • 赏金:无
  • 账户详情:无
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计