cURL缓冲区读取漏洞分析:addvariable()函数缺失NUL终止符导致未定义行为
漏洞概述
在cURL的addvariable()函数(被setvariable()使用)中,代码为p->name分配内存时没有为null终止符预留空间,并直接复制nlen字节。随后,varcontent()等函数对此名称调用strlen(),假设它是null终止的。这可能导致越界内存读取,引发崩溃(DoS)或潜在信息泄露,具体取决于运行时上下文。
源代码分析
问题代码位置:https://github.com/curl/curl/blob/master/src/var.c
|
|
复现步骤
-
克隆仓库并进入
1 2 3 4git 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开发人员bagder指出代码实际上是安全的,核心原因在于:
|
|
关键在于name[1]的大小为1字节。当代码使用calloc分配结构体大小加上名称长度时,在memcpy之后,分配的最后一个字节保持为零。
开发人员已在GitHub上添加注释以帮助后续阅读此代码的人员理解:https://github.com/curl/curl/pull/19287
报告状态
- 报告ID:#3406123
- 状态:不适用(Not Applicable)
- 严重性:无评级(—)
- 弱点:缓冲区读取(Buffer Over-read)
- CVE ID:无
- 赏金:无
报告最终被披露,符合项目的透明性政策。