深入解析cURL HTTP方法处理中的越界读取漏洞

本文详细分析了一个在cURL库的HTTP方法处理中发现的越界读取漏洞。该漏洞由于未正确终止字符串,可能导致未定义行为、程序崩溃或对CONNECT请求的错误分类,并提供了复现步骤与修复建议。

报告 #3434510 - HTTP方法处理中的越界读取导致未定义行为和潜在崩溃

报告者:gaurav_7777 提交对象:curl 提交时间:13天前

摘要

  • 组件:libcurl 核心 HTTP 处理(HTTP/2 请求转换和 CONNECT 检测)
  • 类型:由于缺少空字符终止导致的越界读取
  • 影响:规范未定义的行为,程序可能崩溃(拒绝服务),CONNECT 请求可能被错误分类
  • 根本原因:复制方法字符串时未添加空终止符

受影响的代码路径

结构体布局:

1
struct httpreq { ... char method[1]; }

分配与复制(无NUL):

1
2
req = calloc(1, sizeof(*req) + m_len);
memcpy(req->method, method, m_len);

不安全的使用:

  • strcmp("CONNECT", req->method) — 假设字符串以空字符结尾
  • strlen(req->method) — 确定 HTTP/2 伪头部 :method 的大小

直接风险:如果 req->method[m_len] 超出分配的内存范围,strcmpstrlen 都可能访问超出分配范围的内存。影响因分配器/布局而异;ASan 总能检测到这一点。

复现步骤(简洁版)

前提:确保已安装 CMake 和 nghttp2。

版本输出

1
2
3
4
5
1 cmake --version
1→ 3.26.2

1 pkg-config --modversion libnghttp2
1→ 1.52.0

使用 ASan + HTTP/2 构建 curl

1
2
1 mkdir -p build && cmake -B build -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_FLAGS='-O1 -g -fsanitize=address' -DCMAKE_EXE_LINKER_FLAGS='-fsanitize=address' -DCURL_USE_NGHTTP2=ON
1 cmake --build build -j"$(nproc)"

验证二进制文件和功能

1
1 ./src/curl --version

构建版本验证

影响

  • 拒绝服务/崩溃:在创建 HTTP/2 伪头部或检查 CONNECT 逻辑时发生越界读取。
  • 逻辑缺陷:由于可能比较未初始化的值,检测 CONNECT 的函数可能表现出不同的行为。

触发面:任何生成 struct httpreq(例如,自定义方法)然后执行 HTTP/2 转换或 CONNECT 检查的路径。

建议的修复方案(最小且稳健)

在两个创建函数中,不仅添加空终止符,还要为其分配内存:

1
2
3
4
5
- req = calloc(1, sizeof(*req) + m_len);
+ req = calloc(1, sizeof(*req) + m_len + 1);
  if(!req) goto out;
  memcpy(req->method, method, m_len);
+ req->method[m_len] = '\0';
  • 需要修改的位置
    • Curl_http_req_make
    • Curl_http_req_make2

此更改消除了局部未定义读取,而不改变逻辑。可选加固:替换 strcmp("CONNECT", ...) 的使用。

讨论时间线

  • 12天前 - bagder (curl staff) 发表评论:感谢报告,团队将进行调查并尽快回复。
  • 12天前 - bagder (curl staff) 发表评论:认为关于缺少空终止符的根因分析不正确。结构体使用 calloc 分配,空终止符已经存在。
  • 12天前 - icing (curl staff) 发表评论:确认结构体 httpreqchar method[1]; 结尾,并使用 calloc 分配了结构体大小和 m_len,这为终止的 NUL 字节提供了空间。
  • 12天前 - 报告者 gaurav_7777 进行了一些关于其他提交报告的澄清询问。
  • 12天前 - bagder (curl staff) 将报告状态更改为“不适用”并关闭报告,认为这不是安全问题。
  • 12天前 - 报告者 gaurav_7777 承认错误,并最初要求不要公开披露此报告。
  • 12天前 - bagder (curl staff) 强调根据项目透明度政策,所有报告完成后都将被披露。
  • 12天前 - 报告者 gaurav_7777 最终同意披露此报告。

报告详情

  • 报告日期:2025年11月20日,UTC时间3:47
  • 报告者:gaurav_7777
  • 报告对象:curl
  • 报告ID:#3434510
  • 严重程度:高 (7 ~ 8.9)
  • 披露日期:2025年11月20日,UTC时间9:20
  • 弱点:缓冲区过度读取
  • CVE ID:无
  • 赏金:隐藏
  • 账户详情:无
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计