堆缓冲区溢出漏洞报告 #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开发团队认为:
char *dest[1]
在cpool_bundle结构体中作为动态缓冲区的占位符- 结构体的实际分配包含了缓冲区的额外空间:
calloc(1, sizeof(*bundle) + dest_len)
- 虽然数据类型看起来不正确,但未发现缓冲区溢出问题
- memcpy()调用按预期复制到cpool_bundle结构体内的dest数组地址
- 需要提供使用libcurl API或curl命令行工具的复现程序
报告信息
- 报告ID: #3156384
- 严重程度: 中等 (4 ~ 6.9)
- 弱点类型: 堆溢出
- CVE ID: 无
- 赏金: 无
- 披露时间: 2025年7月1日 14:08 UTC