报告 #3434510 - HTTP方法处理中的越界读取导致未定义行为和潜在崩溃
报告者:gaurav_7777 提交对象:curl 提交时间:13天前
摘要
- 组件:libcurl 核心 HTTP 处理(HTTP/2 请求转换和 CONNECT 检测)
- 类型:由于缺少空字符终止导致的越界读取
- 影响:规范未定义的行为,程序可能崩溃(拒绝服务),CONNECT 请求可能被错误分类
- 根本原因:复制方法字符串时未添加空终止符
受影响的代码路径
结构体布局:
|
|
分配与复制(无NUL):
|
|
不安全的使用:
strcmp("CONNECT", req->method)— 假设字符串以空字符结尾strlen(req->method)— 确定 HTTP/2 伪头部:method的大小
直接风险:如果 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_makeCurl_http_req_make2
此更改消除了局部未定义读取,而不改变逻辑。可选加固:替换 strcmp("CONNECT", ...) 的使用。
讨论时间线
- 12天前 -
bagder (curl staff)发表评论:感谢报告,团队将进行调查并尽快回复。 - 12天前 -
bagder (curl staff)发表评论:认为关于缺少空终止符的根因分析不正确。结构体使用calloc分配,空终止符已经存在。 - 12天前 -
icing (curl staff)发表评论:确认结构体httpreq以char 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:无
- 赏金:隐藏
- 账户详情:无