curl配置文件解析中的任意释放漏洞分析
报告ID: #3434543 报告标题: curl配置文件解析中的任意释放漏洞 提交者: letshack9707 提交日期: 2025年11月20日 状态: 已公开,被评定为信息性(非安全问题)
摘要
该报告揭示了一个存在于curl工具配置文件解析过程中的内存安全问题。攻击者通过精心构造的配置文件,可以控制传递给free()函数的指针地址,从而导致潜在的双重释放、释放后使用或内存破坏。漏洞的根本原因在于glob_cleanup函数中释放了未正确初始化的堆内存。
受影响版本
- curl 8.17.0 (x86_64-pc-linux-gnu)
- curl 8.16.0 也同样受到影响(可控参数不同)
复现步骤
- 创建一个恶意配置文件(例如
host0.bin),包含特定的URL构造:1 2 3 4--url "http://google.com/iernay{1-2}kFORFNUUklOR1JBTkRTVFJJTkdSQU5EU1RSSU5HUkFORFNUUklOR1JBTkRTVFJJTkdSQU5EU1RSSU5HUkFORFNUUklOR1JBTkRTVFJJT" --url "http://[::%2-socks5]:8080/" --url google.com-Z[.-p].example.com" --doh-url=127.0.0.1 - 使用GDB运行curl加载此配置:
1gdb -ex "r" --args curl --config host0.bin - 程序会在
__GI___libc_free处因段错误而崩溃,此时寄存器$rdi包含可控数据(例如0x2e302e302e373231,即127.0.0.)。
漏洞细节与控制演示
报告者编写了一个Python脚本 mutate.py,用于将配置文件中的可控数据替换为任意指定的地址(例如 0x4242424242424242)。
当使用修改后的配置文件运行curl时,可以观察到 free() 函数被调用,并试图释放该指定地址:
|
|
GDB显示在 __GI___libc_free(mem=0x4242424242424242) 处发生段错误,证实了攻击者可以控制释放的指针。
进一步,如果释放一个之前已经释放过的地址(例如 0x555555602dd0),则会触发tcache的双重释放检测机制,导致程序中止:
|
|
根本原因
漏洞位于 src/tool_urlglob.c 文件的 glob_cleanup 函数中。当处理包含特定范围模式(如[.-p])的URL时,代码路径可能导致释放一个未初始化或部分初始化的堆内存指针。具体问题代码在 tool_urlglob.c:499 行:
|
|
补丁与修复
curl安全团队提供了修复补丁(PR #19614),主要修改了 glob_parse 函数中的逻辑。关键的修复是在增加 glob->size 之前检查先前的操作结果 (res),确保仅在操作成功时才进行后续的内存分配和释放操作。
|
|
安全影响与讨论
curl团队评估: curl团队认为这不是一个安全漏洞,而是一个普通的程序错误(bug)。他们的理由如下:
- curl工具是单进程运行,以当前用户权限执行。
- 攻击者能够诱使用户执行恶意配置文件本身就已经具备了执行任意命令的能力(curl本身支持通过配置执行命令)。
- 即使成功利用此内存问题,攻击者所能做的也不会超过恶意配置文件本身所能直接实现的功能。
- 问题本质上是释放了未初始化的堆内存,攻击者难以稳定地控制释放的具体地址以实现可靠的利用。
报告者观点: 报告者承认利用此漏洞需要绕过ASLR和tcache缓解机制,实际利用具有挑战性。但他认为,这仍然是一个“理论上的漏洞”,因为:
- 它提供了不同于正常命令执行的、非预期的攻击路径。
- 如果存在针对恶意配置文件命令执行的安全防护或净化措施,此漏洞可能绕过那些防护。
最终状态
- 状态: 报告被标记为 Informative(信息性),未被认定为安全漏洞。
- 严重性: 低(0.1 ~ 3.9)。
- 赏金: 无。
- CVE ID: 无。
- 修复: 已通过GitHub PR #19614 修复。
报告者表示,未来类似的curl工具配置文件解析问题将直接提交到GitHub,而非通过漏洞赏金平台报告。