漏洞概述
在cURL的addvariable()函数(由setvariable()调用)中,代码为p->name分配内存时未为NUL终止符预留空间,直接复制nlen字节。随后,varcontent()等函数对此名称调用strlen(),假设其为NUL终止,这可能导致越界内存读取,造成程序崩溃(DoS)或潜在信息泄露。
源代码分析
问题代码位置 :https://github.com/curl/curl/blob/master/src/var.c
c
p = calloc(1, sizeof(struct tool_var) + nlen);
if(p) {
memcpy(p->name, name, nlen);
}
数据结构定义:
c
struct tool_var {
struct tool_var *next;
const char *content;
size_t clen; /* content长度 */
char name[1]; /* 作为结构体的一部分分配 */
};
复现步骤
-
克隆仓库并进入目录
bashgit clone https://github.com/curl/curl.git cd curl CFLAGS="-fsanitize=address,undefined -g -O1" ./configure make -j$(nproc) -
通过setvariable()添加变量(例如:"TESTVAR=value")
-
使用varcontent()或varexpand()查找变量
-
通过ASAN/UBSAN日志观察崩溃或越界读取
影响评估
addvariable()未能对存储的变量名进行NUL终止,因此后续对strlen()的调用可能读取超出分配缓冲区的内存,导致程序立即崩溃。这会产生可用性影响(如果代码路径可访问,容易造成DoS),且越界读取可能暴露相邻内存,造成潜在的机密性问题。
项目方回应
cURL开发团队指出代码实际上是安全的,因为:
name[1]大小为1字节- 使用
calloc分配结构体大小加上名称长度时,分配的最后一个字节在memcpy后保持为零
开发团队已添加注释以帮助后续代码阅读者理解:github.com/curl/curl/p...
报告状态
- 状态:不适用(Not Applicable)
- 严重性:无评级
- CVE ID:无
- 赏金:无
- 披露时间:2025年10月31日 11:35 UTC
报告最终被认定为非安全问题,但按照项目透明度政策被公开披露。