报告 #3434510 - HTTP方法处理中的越界读取导致未定义行为和潜在崩溃
摘要
- 组件:libcurl核心HTTP处理(HTTP/2请求转换和CONNECT检测)
- 类型:由于缺少空终止符导致的越界读取
- 影响:行为不符合规范,程序可能崩溃(DoS),CONNECT请求可能被错误分类
根本原因
方法字符串在复制时没有空终止符
受影响代码路径
结构体布局:
|
|
分配和复制(无NUL):
|
|
不安全使用:
|
|
直接风险:如果req->method[m_len]越界,strcmp和strlen都可能访问分配之外的内存。影响因分配器/布局而异;ASan总是能检测到这个问题。
重现步骤(简明)
前提条件:确保安装CMake和nghttp2
版本输出:
|
|
使用ASan + HTTP/2构建curl:
|
|
验证二进制文件和功能:
|
|
影响
- 拒绝服务/崩溃:在创建HTTP/2伪头部或检查CONNECT逻辑时发生越界读取
- 逻辑缺陷:由于执行了未初始化值的比较,检测CONNECT的函数可能表现不同
触发表面:任何生成struct httpreq(例如,自定义方法)然后执行HTTP/2转换或CONNECT检查的路径
建议修复(最小且稳健)
在两个创建器中,不仅添加空终止符,还要为其分配内存:
|
|
需要修改的位置:
- 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:无
- 赏金:隐藏
- 账户详情:无