cURL缓冲区读取漏洞分析:addvariable()函数缺失NUL终止符导致未定义行为

本文详细分析了cURL工具中addvariable()函数因缺失NUL终止符而导致的缓冲区读取漏洞,包括漏洞原理、复现步骤和安全影响评估,并记录了开发者的修复过程。

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
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开发人员bagder指出代码实际上是安全的,核心原因在于:

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之后,分配的最后一个字节保持为零。

开发人员已在GitHub上添加注释以帮助后续阅读此代码的人员理解:https://github.com/curl/curl/pull/19287

报告状态

  • 报告ID:#3406123
  • 状态:不适用(Not Applicable)
  • 严重性:无评级(—)
  • 弱点:缓冲区读取(Buffer Over-read)
  • CVE ID:无
  • 赏金:无

报告最终被披露,符合项目的透明性政策。

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