星阵围棋手机版
64.59MB · 2025-11-21
在cURL的addvariable()函数(由setvariable()调用)中,代码为p->name分配内存时未为NUL终止符预留空间,直接复制nlen字节。随后,varcontent()等函数对此名称调用strlen(),假设其为NUL终止,这可能导致越界内存读取,造成程序崩溃(DoS)或潜在信息泄露。
问题代码位置:
p = calloc(1, sizeof(struct tool_var) + nlen);
if(p) {
memcpy(p->name, name, nlen);
}
数据结构定义:
struct tool_var {
struct tool_var *next;
const char *content;
size_t clen; /* content长度 */
char name[1]; /* 作为结构体的一部分分配 */
};
克隆仓库并进入目录
git clone
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…
报告最终被认定为非安全问题,但按照项目透明度政策被公开披露。