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

本文报告了curl中HTTP/2代理实现存在的潜在整数溢出漏洞,涉及窗口大小计算,可能导致内存损坏或拒绝服务,但经过团队审查后被判定为非安全问题。

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

总结

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  (16*1024)
#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日 12:45 UTC - extramayoextracheeseextrafries 向curl提交报告
  • 15天前 - dfandrich curl员工发表评论
  • 15天前 - jimfuller2024 curl员工发表评论
  • 15天前 - bagder curl员工发表评论
  • 14天前 - bagder curl员工关闭报告并将状态更改为"不适用"
  • 14天前 - bagder curl员工请求披露此报告
  • 14天前 - bagder curl员工披露此报告

报告详情

项目
报告ID #3238249
严重性 中等 (4 ~ 6.9)
披露时间 2025年7月7日 10:16 UTC
弱点 整数溢出
CVE ID CVE-2019-9511, CVE-2019-9513
赏金
账户详情

团队回应

curl团队成员指出,报告中提到的计算使用硬编码常量,在编译时执行,攻击者无法通过HTTP/2帧操纵这些常量,因此不构成安全漏洞。报告最终被判定为"不适用"并公开披露。

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