报告 #3434510 - HTTP方法处理中的越界读取导致未定义行为和潜在崩溃
报告者: gaurav_7777 报告至: curl 报告时间: 2025年11月20日,03:47 UTC 状态: 已披露
摘要
- 组件: libcurl 核心 HTTP 处理(HTTP/2 请求翻译和 CONNECT 检测)
- 类型: 由于缺少空终止符导致的越界读取
- 影响: 规范未定义的行为,程序可能崩溃(拒绝服务),且 CONNECT 请求可能被错误分类
- 根本原因: 复制方法字符串时未包含空终止符
受影响的代码路径
结构体布局:
|
|
分配与复制(无 NUL 终止符):
|
|
不安全的用法:
strcmp("CONNECT", req->method)—— 假设字符串以空字符结尾strlen(req->method)—— 用于确定 HTTP/2 伪头部:method的大小
直接风险: 如果 req->method[m_len] 越界,strcmp 和 strlen 都可能访问到分配内存之外的空间。具体影响因分配器/布局而异;ASan(AddressSanitizer)总能检测到这一问题。
复现步骤(简明)
前提: 确保已安装 CMake 和 nghttp2。
-
检查版本信息:
1 2 3 4 5cmake --version # 输出示例: 3.26.2 pkg-config --modversion libnghttp2 # 输出示例: 1.52.0 -
使用 ASan 和 HTTP/2 支持构建 curl:
1 2mkdir -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 检查的路径。
建议的修复方案(最小化且稳健)
在两个创建函数中,不仅添加空终止符,还要为其分配内存:
|
|
- 需要修改的位置:
Curl_http_req_makeCurl_http_req_make2此项更改消除了本地的未定义读取,而不改变逻辑。可选加固措施:替换strcmp("CONNECT", ...)。
时间线
- 2025-11-20 03:47 UTC:
gaurav_7777提交报告。 - 2025-11-20 07:37 UTC:
bagder(curl 员工) 发表评论,感谢报告并承诺调查。 - 2025-11-20 07:40 UTC:
bagder指出分析有误,认为calloc已分配了空终止符空间。 - 2025-11-20 07:49 UTC:
icing(curl 员工) 确认分析,指出结构体末尾的char method[1];和calloc调用已预留了终止 NUL 字节的空间。 - 2025-11-20 07:52 UTC:
bagder将报告状态改为“不适用”并关闭,认为这不是一个安全问题。 - 2025-11-20 09:08 UTC:
bagder根据项目透明政策,请求披露此报告。 - 2025-11-20 09:20 UTC: 在
gaurav_7777同意后,报告被披露。
报告详情
- 报告ID: #3434510
- 严重性: 高 (7 ~ 8.9)
- 弱点: 缓冲区过度读取
- CVE ID: 无
- 赏金: 隐藏