cURL LDAP缓冲区溢出漏洞分析

本文详细分析了cURL在OS/400平台上的LDAP错误处理函数中存在的栈缓冲区溢出漏洞,包括漏洞机制、复现步骤和修复建议,涉及strcpy函数的不安全使用和ASan检测技术。

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行,每行都包含以下结构:

1
strcpy(cp, cp2);

漏洞机制: 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

1
2
3
4
5
6
cd ~/curl
export CFLAGS="-fsanitize=address -fno-omit-frame-pointer -O1 -g"
export LDFLAGS="-fsanitize=address"
autoreconf -fi
./configure --with-ldap --with-openssl
make

步骤2:启动恶意LDAP服务器

1
python3 rogue_ldap.py

步骤3:执行易受攻击的客户端

1
2
cd ~/curl
./src/curl ldap://127.0.0.1:389/

预期结果: ASAN运行时将立即检测到由strcpy操作导致的缓冲区溢出,并终止进程,生成清晰的诊断报告。

修复建议

用边界检查的替代方案替换不安全的strcpy()函数,以防止缓冲区溢出。

推荐修复:

1
2
3
/* 确保size_cp是'cp'缓冲区的已知大小 */
strncpy(cp, cp2, size_cp - 1);
cp[size_cp - 1] = '\0';

项目方回应

cURL开发团队对此报告提出了质疑:

  • “如果这是cURL问题,为什么不显示完整的问题堆栈跟踪?”
  • “请指出有问题的确切cURL源代码行,以及如何通过运行curl代码触发该问题”
  • “我猜你使用AI来’发现’这个?”
  • “这个函数在curl源代码中不存在。它是编造的”
  • “因此,这个函数也不在这一行。使得崩溃堆栈跟踪也是编造的”

最终,cURL团队将该报告标记为"垃圾信息"并关闭了报告,同时禁止了提交者账户。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计