cURL LDAP缓冲区溢出漏洞分析
漏洞描述
该漏洞是cURL源代码中针对OS/400(IBM i)平台的一个栈缓冲区溢出漏洞,位于packages/OS400/os400sys.c文件中。
受影响组件:
- 文件:
curl/packages/OS400/os400sys.c - 函数:
static char Curl_ldap_err2string(char cp, char *cp2)
漏洞位置: 第741、773和804行,每行都包含以下结构:
|
|
漏洞机制:
Curl_ldap_err2string函数使用不安全的strcpy()函数将源字符串(cp2)复制到目标缓冲区(cp)。源字符串cp2由LDAP服务器返回的错误消息填充,这意味着其长度和内容完全可以通过恶意服务器响应由攻击者控制。
strcpy()函数在执行复制操作时不对目标缓冲区cp进行任何边界检查。如果攻击者精心构造的错误消息(在cp2中)长于为cp分配的大小,该操作将导致栈上的越界写入。
影响分析
拒绝服务(DoS) - 高严重性
- 机制:当恶意、过大的LDAP错误字符串被
strcpy复制到小的目标缓冲区(cp)时,会立即覆盖栈上的相邻数据,破坏进程的内部状态。 - 结果:应用程序(cURL客户端)将立即崩溃。
信息泄露 - 中等严重性
- 机制:内存损坏或随后的崩溃可能导致栈或相邻堆内存的内容被不当处理,可能暴露存储在覆盖缓冲区附近敏感数据。
远程代码执行(RCE) - 严重性
- 机制:攻击者可以精心构造过大的LDAP错误字符串(有效载荷)来覆盖栈上存储的函数返回地址。
- 结果:攻击者获得程序执行流程的控制权,允许他们在运行cURL应用程序的用户上下文中执行任意代码。
复现步骤(概念验证)
前提条件:
- cURL源代码(包含易受攻击的os400sys.c文件的版本)
- Linux环境(如Kali)和必要的开发包
- 能够运行LDAP服务器并发送大型恶意错误字符串的Python脚本
步骤1:使用地址清理器(ASAN)编译cURL
|
|
步骤2:启动恶意LDAP服务器
|
|
步骤3:执行易受攻击的客户端
|
|
预期结果:
ASAN运行时将立即检测到由strcpy操作导致的缓冲区溢出,并终止进程,生成清晰的诊断报告。
修复建议
用边界检查的替代方案替换不安全的strcpy()函数,以防止缓冲区溢出。
推荐修复:
|
|
项目方回应
cURL开发团队对此报告提出了质疑:
- “如果这是cURL问题,为什么不显示完整的问题堆栈跟踪?”
- “请指出有问题的确切cURL源代码行,以及如何通过运行curl代码触发该问题”
- “我猜你使用AI来’发现’这个?”
- “这个函数在curl源代码中不存在。它是编造的”
- “因此,这个函数也不在这一行。使得崩溃堆栈跟踪也是编造的”
最终,cURL团队将该报告标记为"垃圾信息"并关闭了报告,同时禁止了提交者账户。