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

本文详细分析了cURL库conncache.c文件中cpool_bundle结构体使用指针数组而非柔性数组导致的堆缓冲区溢出漏洞,包括漏洞原理、影响范围和修复建议,涉及内存分配和memcpy操作的安全问题。

堆缓冲区溢出漏洞报告 #3156384

漏洞概述

在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],并确保内存分配正确考虑字符串长度。

时间线

  • 2025年5月21日 03:55 UTC - freak_coding向curl提交报告
  • 2025年5月21日 05:30 UTC - curl员工dfandrich发表评论
  • 2025年5月21日 05:53 UTC - curl员工bagder发表评论
  • 2025年5月21日 20:39 UTC - bagder关闭报告并将状态改为"不适用"
  • 2025年6月28日 12:21 UTC - bagder请求披露此报告
  • 2025年7月1日 14:08 UTC - bagder披露此报告

技术细节

附件

  • test_conncache_overflow.c (367行代码的复现程序)
  • recording-1747799575976.webm (演示视频)

开发者回应

curl开发团队认为:

  1. char *dest[1]在cpool_bundle结构体中作为动态缓冲区的占位符
  2. 结构体的实际分配包含了缓冲区的额外空间:calloc(1, sizeof(*bundle) + dest_len)
  3. 虽然数据类型看起来不正确,但未发现缓冲区溢出问题
  4. memcpy()调用按预期复制到cpool_bundle结构体内的dest数组地址
  5. 需要提供使用libcurl API或curl命令行工具的复现程序

报告信息

  • 报告ID: #3156384
  • 严重程度: 中等 (4 ~ 6.9)
  • 弱点类型: 堆溢出
  • CVE ID: 无
  • 赏金: 无
  • 披露时间: 2025年7月1日 14:08 UTC
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计