curl SOCKS5堆缓冲区溢出漏洞分析
漏洞概述
在curl的SOCKS5代理握手实现中存在一个基于堆的缓冲区溢出漏洞,当处理包含超过255个字符主机名的HTTP重引导时会发生此问题。当curl配置为使用带主机名解析的SOCKS5代理(socks5h://方案)并跟随重引导到包含超长主机名的URL时,整个主机名会通过memcpy()复制到固定大小的堆缓冲区中,导致堆内存损坏。
受影响版本
curl 8.3.0 (x86_64-pc-linux-gnu) libcurl/8.3.0 OpenSSL/3.0.2 zlib/1.2.11 brotli/1.0.9 发布日期:2023-09-13
复现步骤
1. 设置SOCKS5代理服务器
|
|
2. 创建恶意HTTP服务器返回包含超长主机名的重引导
|
|
3. 使用SOCKS5代理和速率限制执行易受攻击的curl
|
|
4. 观察堆损坏
|
|
支持材料/参考
- 堆损坏证据:错误信息"free(): invalid next size (normal)“确认了堆元数据损坏
- 易受攻击的代码路径:lib/socks.c - 非阻塞状态机中的SOCKS5主机名解析逻辑
- 触发条件:需要–limit-rate < 65541字节/秒来将缓冲区大小减小到主机名长度以下
- 受影响的缓冲区:基于堆的下载缓冲区(CURLOPT_BUFFERSIZE)
攻击场景
- 攻击者控制恶意HTTP服务器或执行中间人攻击
- 受害者使用带SOCKS5代理的curl(常见于企业/注重隐私的环境)
- 恶意重引导包含超过255个字符的主机名
- 在SOCKS5握手期间发生堆溢出
影响
严重性:高
此漏洞允许攻击者破坏堆内存,可能导致:
1. 远程代码执行(RCE)
通过适当的堆整理和漏洞利用开发,攻击者可以:
- 控制溢出内容以覆盖关键堆结构
- 覆盖函数指针或vtable条目
- 重定向程序执行到攻击者控制的代码
- 在易受攻击的应用程序上下文中实现任意代码执行
2. 拒绝服务(DoS)
堆损坏导致:
- 立即的应用程序崩溃(在测试中已确认)
- 依赖curl的应用程序服务中断
- 由于内存损坏导致的系统不稳定
3. 信息泄露
取决于堆布局:
- 可能从相邻堆块泄漏敏感数据
- 通过损坏的指针暴露内存内容
攻击前提条件
- 受害者必须使用带SOCKS5代理的curl(socks5h://方案)
- 攻击者必须控制HTTP服务器或执行中间人攻击
- 应用程序必须具有缓冲区大小 < 65,541字节(通过–limit-rate选项轻松实现)
实际影响
- 影响全球数百万使用curl/libcurl的系统
- 常见于自动化系统、CI/CD流水线、网络爬虫、API客户端
- 企业环境经常使用SOCKS5代理
- 注重隐私的用户(Tor、VPN用户)风险更高
漏洞利用证明
成功触发堆损坏,错误信息:“free(): invalid next size (normal)” 这确认了该漏洞是可利用的,不仅仅是理论上的。
额外建议
严重性评估
CVSS v3.1基础分数:7.5(高) 攻击向量:网络 攻击复杂度:低 所需权限:无 用户交互:需要(受害者必须发出HTTP请求) 范围:未改变 机密性影响:无(但存在RCE可能性) 完整性影响:高 可用性影响:高
应包含的附件
- 显示堆损坏的完整漏洞利用输出日志
- 概念验证脚本(exploit_cve_2023_38545.sh)
- “free(): invalid next size"错误的截图
- curl版本输出(curl -V)
项目响应
bagder(curl工作人员)在9天前发表评论: “感谢您的报告!我们将花时间调查您的报告,并尽快向您提供详细信息和可能的后续问题!很可能在接下来的24小时内。”
bagder在9天前发表评论: “这不是https://curl.se/docs/CVE-2023-38545.html问题吗?”
abdullah-107在9天前发表评论: “哦是的,抱歉”
bagder在9天前发表评论: “给未来的建议:尝试使用最新版本复现,而不是两年前的版本…”
bagder在8天前关闭报告并将状态更改为"不适用”
bagder在8天前请求披露此报告: “根据项目透明度政策,我们希望所有报告都被披露并公开。”
bagder在7天前披露了此报告。