curl Rustls后端缓冲区溢出漏洞报告
摘要
curl库的Rustls后端存在缓冲区溢出漏洞,这是由于动态缓冲区管理中的整数溢出导致的。该漏洞可能允许攻击者覆盖内存,导致应用程序崩溃或理论上执行任意代码。但由于需要处理接近4GB(32位系统)或18EB(64位系统)的超大文件,实际利用极不现实,因此真实风险较低。
受影响版本
所有使用Rustls后端且包含易受攻击的Curl_dyn_addn函数动态缓冲区管理代码的curl版本均受影响。
复现步骤
未经过滤的文件输入流入memcpy,用于操纵应用程序内存。这可能导致缓冲区溢出漏洞。
数据流
- 文件:
lib/vtls/rustls.c- 步骤1-2: 第421行13列,
bufbuf(源) - 步骤3: 第424行39列,
buf
- 步骤1-2: 第421行13列,
- 文件:
lib/dynbuf.c- 步骤4: 第167行42列,
const void mem - 步骤5: 第172行25列,
mem - 步骤6: 第70行29列,
const unsigned char mem - 步骤7-8: 第119行28列,
memmemcpy和memcpy
- 步骤4: 第167行42列,
相关代码链接:
影响
如果被利用,此漏洞可能导致内存破坏,引发应用程序崩溃或允许任意代码执行。但利用条件极为苛刻:需要在32位系统上处理接近4GB的文件,或在64位系统上处理约18EB的文件,这在实际中几乎不可能。此外,现代内存保护机制(如ASLR和DEP)进一步降低了成功利用的可能性。因此,总体风险较低。
技术细节
漏洞源于lib/dynbuf.c中的Curl_dyn_addn函数,该函数负责向动态缓冲区添加数据。函数执行大小检查以确保缓冲区有足够容量:
|
|
然而,如果当前缓冲区长度(s->len)与新数据长度(len)之和超过size_t的最大值,会发生整数溢出。这导致条件s->len + len > s->size错误地评估为false,即使总大小超过分配的缓冲区容量。结果,随后的memcpy操作将数据写入缓冲区边界之外,导致缓冲区溢出。
此问题理论上可在处理极大文件(如证书撤销列表CRLs)时触发:
- 在32位系统上(
size_t通常为32位),溢出发生在接近4GB(2³²字节)时。 - 在64位系统上(
size_t为64位),溢出需要约18EB(2⁶⁴字节),这在实际场景中不现实。
缓解措施
为防范此漏洞,建议:
- 用户: 避免处理接近或超过
size_t大小限制(如32位系统4GB,64位系统18EB)的不可信文件。尽可能在处理前验证输入文件大小。 - 开发者: 更新
Curl_dyn_addn函数以包含显式溢出检查。例如,在执行加法前验证s->len + len不超过SIZE_MAX,或使用安全算术库防止整数溢出。补丁可能类似:
|
|
支持材料/参考
无附加材料。
总结
尽管利用的不现实性降低了紧迫性,但在代码库中解决此问题将增强curl库的整体健壮性。本报告全面概述了漏洞、其潜在影响及可操作的缓解步骤,适合技术和非技术读者。
时间线
- 2025年3月14日, 6:42 UTC:
cyberguardianrd提交报告。 - 2025年3月14日, 7:16 UTC:
bagder(curl staff)确认收到报告,承诺调查。 - 2025年3月14日, 7:23 UTC:
bagder指出Rustls后端仍为实验性,不视为安全问题,但承认是合法bug,将提交PR限制输入文件大小。 - 2025年3月14日, 7:31 UTC:
bagder补充说明在32位系统上realloc()可能在达到2GB时失败,实际难以触发漏洞。 - 2025年3月14日, 7:35 UTC:
bagder提供PR链接 #16716。 - 2025年3月14日, 8:01 UTC:
bagder关闭报告,状态设为Informative,强调实验性代码不在漏洞赏金范围内,将作为普通bug处理。 - 2025年6月28日, 12:26 UTC:
bagder请求披露报告。 - 2025年6月30日, 6:54 UTC:
bagder披露报告。
报告详情
- 报告ID: #3037583
- 严重性: 无评级 (—)
- 披露日期: 2025年6月30日, 6:54 UTC
- 弱点类型: 整数溢出
- CVE ID: 无
- 赏金: 无
- 账户详情: 无
|
|