cURL库doh_decode_rdata_name函数中的未初始化指针释放漏洞分析

本文详细分析了cURL库中doh_decode_rdata_name函数存在的未初始化指针释放问题,包括漏洞触发条件、代码位置、潜在影响以及开发团队的响应和修复过程。

Free of uninitialized pointer in doh_decode_rdata_name()

漏洞报告概述

报告ID #3037326 披露了cURL库中doh_decode_rdata_name()函数(位于lib/doh.c)在特定条件下会释放未初始化指针的安全问题。

漏洞详情

当剩余缓冲区长度*remaining <= 0时,代码第1033行会执行free()操作,释放未初始化的指针thename.bufr。该问题在v8.12.1版本中存在,截至2025年3月11日仍在master分支中存在。

相关代码段

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
static CURLcode doh_decode_rdata_name(unsigned char **buf, size_t *remaining,
                                      char **dnsname)
{
...
  struct dynbuf thename;

  DEBUGASSERT(buf && remaining && dnsname);
  if(!buf || !remaining || !dnsname)
    return CURLE_OUT_OF_MEMORY;
  rem = (int)*remaining;
  if(rem <= 0) {
    Curl_dyn_free(&thename);    // 第1033行:释放未初始化指针
    return CURLE_OUT_OF_MEMORY;
  }
  Curl_dyn_init(&thename, CURL_MAXLEN_host_name);

Curl_dyn_free()函数执行:

1
Curl_safefree(s->bufr);

s->bufr在第1033行调用时尚未初始化。

漏洞验证方法

使用Visual Studio 2022进行验证:

  1. 使用调试信息构建cURL
  2. 设置curl项目的命令行参数
  3. 在第1032行设置断点
  4. 运行curl,当断点触发时,通过调试器将rem修改为0
  5. 单步执行到第1033行,观察未初始化的s->bufr(在调试版本中通常为0xcccccccccccccccc)
  6. 执行Curl_safefree()调用时会抛出访问冲突异常

潜在影响

可能导致基于use-after-free漏洞的任何影响。

开发团队响应

cURL开发团队bagder在收到报告后迅速响应:

  • 确认这是一个正确的bug报告
  • 指出该功能处于实验性阶段,默认未启用,不被视为安全问题
  • 创建了PR #16710进行修复

最终处理

报告最终被标记为"Informative"(信息性),确认为一个当前不可达的次要bug,不属于安全问题。报告于2025年6月28日披露。

技术细节

  • 弱点类型:Use After Free
  • CVE ID:无
  • 严重性:未评级
  • 赏金:无

该漏洞虽然在实际中无法触发,但仍揭示了代码中存在的潜在风险,值得开发者关注和修复。

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