cURL HTTP方法处理中的越界读取漏洞分析

本文详细分析了cURL库中HTTP方法处理存在的越界读取漏洞,该漏洞由于缺少空终止符导致未定义行为和潜在崩溃,涉及HTTP/2请求转换和CONNECT检测机制的技术细节。

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

摘要

  • 组件:libcurl核心HTTP处理(HTTP/2请求转换和CONNECT检测)
  • 类型:由于缺少空终止符导致的越界读取
  • 影响:行为不符合规范,程序可能崩溃(DoS),CONNECT请求可能被错误分类

根本原因

方法字符串在复制时没有空终止符

受影响代码路径

结构体布局:

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

分配和复制(无NUL):

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

不安全使用:

1
2
strcmp("CONNECT", req->method)  假设是空终止字符串
strlen(req->method)  计算HTTP/2伪头部:method的大小

直接风险:如果req->method[m_len]越界,strcmp和strlen都可能访问分配之外的内存。影响因分配器/布局而异;ASan总是能检测到这个问题。

重现步骤(简明)

前提条件:确保安装CMake和nghttp2

版本输出:

1
2
3
4
5
cmake --version
→ 3.26.2

pkg-config --modversion libnghttp2
→ 1.52.0

使用ASan + HTTP/2构建curl:

1
2
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
cmake --build build -j"$(nproc)"

验证二进制文件和功能:

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”,

后续讨论

bagder curl staff 发表评论:6天前 感谢您的报告!我们将花时间调查您的报告,并尽快向您回复详细信息和可能的后续问题!很可能在24小时内。

我们始终努力尽快修复报告的问题。低或中等严重性的问题我们会合并到下一个发布周期的常规版本中。只有更严重的问题我们可能会提前发布修复。

bagder curl staff 发表评论:6天前 根本原因:方法字符串在复制时没有空终止符

这似乎是一个不正确的分析。再次查看结构体。它是用calloc分配的。空终止符已经存在。

icing curl staff 发表评论:6天前 确实,struct httpreq以char method[1]结尾;并且使用结构体大小和m_len进行calloc,这为终止NUL字节提供了空间。

gaurav_7777 发表评论:6天前 嗨Badger,非常感谢您的快速回复! 我只是想确认没有误解。当您说"您的报告"和"我们将调查您的报告"时,您是指我的两个提交吗?

  • 较早的DoS/崩溃报告
  • 新的SharePoint外部存储中的路径遍历报告(今天提交)

我只是想完全确定您正在调查哪一个/哪些,以便我可以准备任何额外信息或PoC(如果需要)。 再次感谢,期待您的更新!

bagder curl staff 关闭报告并将状态更改为"不适用":6天前 @gaurav_7777 我只能看到您的一个提交。就是这个。而且这不是一个安全问题。

gaurav_7777 发表评论:6天前 抱歉抱歉,我很抱歉,这是我的错误

gaurav_7777 发表评论:6天前 我认为这是我的另一个报告..!

bagder curl staff 请求公开此报告:6天前 根据项目的透明政策,我们希望所有报告都被公开并公之于众。

gaurav_7777 取消了公开此报告的请求:6天前 嗨Bagder/团队 — 由于我的错误,这个报告是不正确的;请不要公开它,保持撤回/关闭状态。

bagder curl staff 发表评论:6天前 抱歉,但我们会在完成后公开每一个报告。大多数报告都是错误的。我们希望保持透明,这有助于每个人了解这里发生的情况。所以这个也会被公开。

gaurav_7777 请求公开此报告:6天前 好的,我理解项目政策。我同意公开此报告,我承诺下次会带给您一个有效且高影响的漏洞。

bagder curl staff 同意公开此报告:6天前 此报告已于6天前公开。

报告详情

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