cURL变量管理中的缓冲区越界读取漏洞分析

本文详细分析了cURL工具中addvariable()函数因缺少NUL终止符而导致的缓冲区越界读取问题,包含完整的复现步骤、代码分析和安全影响评估,虽然最终确认为误报但仍具有重要参考价值。

漏洞报告概述

报告ID: #3406123
漏洞类型: 缓冲区越界读取
提交者: sagorhawlader
提交时间: 15天前

技术细节

问题描述

addvariable()函数(被setvariable()使用)中,代码为p->name分配内存时没有为null终止符预留空间,直接复制nlen字节。随后,varcontent()等函数在此name上调用strlen(),假设它是null终止的。这可能导致越界内存读取,造成程序崩溃(DoS)或潜在信息泄露,具体取决于运行时上下文。

受影响代码

源代码文件:https://github.com/curl/curl/blob/master/src/var.c

问题代码段:

1
2
3
4
p = calloc(1, sizeof(struct tool_var) + nlen);
if(p) {
    memcpy(p->name, name, nlen);
}

复现步骤

  1. 克隆仓库并进入目录

    1
    2
    3
    4
    
    git clone https://github.com/curl/curl.git
    cd curl
    CFLAGS="-fsanitize=address,undefined -g -O1" ./configure
    make -j$(nproc)
    
  2. 通过setvariable()添加变量(例如"TESTVAR=value")

  3. 使用varcontent()varexpand()查找变量

  4. 通过ASAN/UBSAN日志观察崩溃或越界读取

安全影响

addvariable()未能对存储的变量名进行NUL终止,因此后续对strlen()的调用可能读取超出分配缓冲区的内存,导致程序立即崩溃。这会产生可用性影响(如果代码路径可达则容易造成DoS),且越界读取可能暴露相邻内存,造成潜在的机密性问题。

项目方回应

技术分析

cURL开发团队指出代码实际上是安全的,关键点在于tool_var结构体的设计:

1
2
3
4
5
6
struct tool_var {
  struct tool_var *next;
  const char *content;
  size_t clen; /* content length */
  char name[1]; /* allocated as part of the struct */
};

核心解释:name[1]大小为1字节。当代码使用calloc分配结构体大小加上名称长度时,在memcpy之后,该分配的最后一个字节保持为零(由于calloc的零初始化特性)。

解决方案

开发团队添加了注释以帮助后续阅读此代码的人员:https://github.com/curl/curl/pull/19287

最终状态

  • 状态: 不适用(Not Applicable)
  • 严重性: 无评级
  • CVE ID: 无
  • 赏金: 无
  • 披露时间: 2025年10月31日 11:35 UTC

报告最终被确认为误报,但按照项目透明性政策,所有报告都被公开披露。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计