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

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

整数溢出风险在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  (161024)
#define H2_TUNNEL_WINDOW_SIZE        (10 * 1024 * 1024)
#define PROXY_H2_NW_RECV_CHUNKS  (H2_TUNNEL_WINDOW_SIZE / PROXY_H2_CHUNK_SIZE)

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

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)中被利用。

时间线

  • 11天前:extramayoextracheeseextrafries向curl提交报告
  • 10天前:curl工作人员dfandrich、jimfuller2024和bagder发表评论,质疑漏洞的可利用性
  • 10天前:bagder将报告状态更改为"不适用",认为不是安全问题
  • 10天前:bagder请求披露此报告
  • 9天前:bagder披露此报告

报告详情

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