cURL连接缓存中的堆缓冲区溢出漏洞分析

本文详细分析了cURL库conncache.c文件中的堆缓冲区溢出漏洞,该漏洞由于错误使用指针数组而非柔性数组导致内存越界写入,可能引发程序崩溃或远程代码执行,影响所有使用连接缓存功能的cURL应用。

报告 #3156384 - conncache.c中的堆缓冲区溢出漏洞:指针数组错误使用导致内存越界写入

漏洞描述

在conncache.c文件中,cpool_bundle结构体错误地使用了指针数组(char *dest[1])而非柔性数组(char dest[])来存储字符串数据,导致在cpool_bundle_create函数中调用memcpy时发生堆缓冲区溢出。

影响分析

摘要:

该漏洞是一个堆缓冲区溢出,由conncache.c文件中的cpool_bundle结构体错误使用指针数组char *dest[1]而非柔性数组char dest[]引起。在cpool_bundle_create函数中调用memcpy(bundle->dest, dest, bundle->dest_len)时,如果目标字符串长度超过指针大小(64位系统上为8字节),会导致写入越界并破坏堆内存。

攻击者可以通过提供特定长度的主机名/目标地址来触发此漏洞,导致内存破坏,可能引发程序崩溃或远程代码执行。此漏洞影响所有使用连接缓存功能的cURL应用程序,特别是在处理长主机名时。

修复方案应将结构体定义改为使用正确的柔性数组:char dest[]char dest[1],并确保内存分配正确考虑字符串长度。

技术讨论

dandrich (cURL工作人员) 评论: char *dest[1]是cpool_bundle结构体中动态缓冲区的占位符。可以看到结构体的分配实际上包含了从&dest[1]开始的缓冲区的额外空间,即calloc(1, sizeof(*bundle) + dest_len)。虽然数据类型看起来不正确(如您所指出的,应该使用char dest[1]),但我没有看到任何缓冲区溢出。cpool_bundle_create()中的memcpy()调用按预期复制到cpool_bundle结构体内的dest数组地址。数组已经分配了足够的空间。它写入的是字符而不是字符指针,但仍然正确复制。

我对需要367行代码来产生简单缓冲区溢出的重现代码表示怀疑。您是如何创建该代码的?

bagder (cURL工作人员) 评论: 我不认为这是一个问题。 您需要使用libcurl API(或curl命令行工具)创建一个重现器来触发声称的问题。直接使用内部函数编写的内容不是有效的证明。

报告状态

  • 报告时间:2025年5月21日 3:55 UTC
  • 报告者:freak_coding
  • 报告对象:cURL
  • 严重程度:中等(4 ~ 6.9)
  • 弱点类型:堆溢出
  • CVE ID:无
  • 赏金:无
  • 披露时间:2025年7月1日 2:08 PM UTC

时间线

  • 2025年5月21日 3:55 AM UTC:freak_coding提交报告
  • 2025年5月21日 5:30 AM UTC:dandrich发表评论
  • 2025年5月21日 5:53 AM UTC:bagder发表评论
  • 2025年5月21日 8:39 PM UTC:bagder关闭报告,状态改为"不适用"
  • 2025年6月28日 12:21 PM UTC:bagder请求披露此报告
  • 2025年7月1日 2:08 PM UTC:bagder披露此报告

附件

  1. test_conncache_overflow.c
  2. recording-1747799575976.webm
  3. test_conncache_log
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计