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

本文详细分析了一个在cURL库的HTTP/2请求翻译和CONNECT检测功能中发现的越界读取漏洞。漏洞根源在于复制方法字符串时未正确处理空终止符,可能导致未定义行为、程序崩溃及请求误分类。文中包含了复现步骤、影响分析及修复建议。

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

报告者: gaurav_7777 报告至: curl 报告时间: 2025年11月20日,03:47 UTC 状态: 已披露

摘要

  • 组件: 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(AddressSanitizer)总能检测到这一问题。

复现步骤(简明)

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

  1. 检查版本信息:

    1
    2
    3
    4
    5
    
    cmake --version
    # 输出示例: 3.26.2
    
    pkg-config --modversion libnghttp2
    # 输出示例: 1.52.0
    
  2. 使用 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)"
    
  3. 验证二进制文件和功能:

    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", ...)

时间线

  • 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: 无
  • 赏金: 隐藏
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计