libcurl Socks5 堆缓冲区溢出漏洞(CVE-2023-38545)详细分析

简介

curl 是用于在各种网络协议之间传输数据的命令行工具,libcurl 用于提供处理网络通信和数据传输的 Api 接口。curl 默认下载缓冲区为 102400 字节,但如果设置低于每秒 102400 字节,缓冲区大小会自动设置为更小的值。libcurl 下载缓冲区默认为 16KB,应用程序可通过 CURLOPT_BUFFERSIZE 选项设置其大小。

受影响版本中,libcurl 对于 Socks 代理过程中解析的主机名长度未正确限制,使用 libcurl 的应用程序在未设置 CURLOPT_BUFFERSIZE 或将其设置小于 65541 时会造成堆缓冲区溢出;由于 curl 工具默认将 CURLOPT_BUFFERSIZE 设置为 100KB,因此除非用户将速率通过 --limit-rate 限制设置为每秒小于 65541 字节,默认不受影响。

当用户通过 socks 代理访问攻击者可控的地址时,如果攻击者通过 302 跳转等方式使得用户解析访问大于缓冲区长度的域名,可能造成拒绝服务,针对特定的平台和软件可能造成远程代码执行。

漏洞信息

标题 libcurl Socks5 堆缓冲区溢出漏洞
漏洞类型 基于堆的缓冲区溢出(CWE-122)
评分 7.0
漏洞等级 高危
处置建议 建议修复
利用所需权限 无需权限
利用难度
影响范围 广
POC 已公开
复现时间 2023/10/11

漏洞复现过程

  1. 配置代理,可以使用 https://github.com/MisterDaneel/pysoxy 或者使用 clashx 的代理(7890 端口)

    git clone https://github.com/MisterDaneel/pysoxy cd pysoxy
    $ python3 pysoxy.py

  2. 将 127.0.0.1 「一万个 A」解析加入到/etc/hosts 中,用于传递 hostname 到代理解析时返回结果。

  3. 执行命令 curl --limit-rate 1025 -vvv -x socks5h://localhost:7890 $(python3 -c "print(('A'*10000), end='')")

    默认 curl 是 100kB 的缓冲区,需要使用--limit-rate 1025 限制为 1025 后,1 万个字符的可导致堆溢出。

影响分析

漏洞利用可能性与危害

该漏洞利用条件较高,预估能实际造成严重危害的场景相对有限。

  1. 通过 libcurl 在通过 socks 代理的情况下访问攻击者可控制的地址。(攻击者可能通过 302 跳转诱使解析访问超长的域名)
  2. 从利用结果上看,导致拒绝服务是比较容易的,但要造成远程代码执行,需要根据具体的应用、操作系统平台进行构造,黑盒场景通常难以利用。

curl 的应用范围

Curl 从 1998 年维护至今,已经成为 HTTP 请求命令行工具的事实标准,具有丰富的 Api 和 Abi(应用程序二进制接口),因此被广泛应用于需要网络传输的产品或设备中,如手机/平板、操作系统、服务器、医疗和物联网设备等。

curl/libcurl 还广泛应用于以下方面:

  • GitHub 中有 2.6 万个相关的开源项目,墨菲安全分析发现其中 php、shell、JavaScript、Python、C/C++项目中使用较多,在 Java、Go、Ruby 项目中使用较少:

curl/libcurl 相关不同语言的开源代码仓库占比

  • 具有网络传输功能的客户端应用程序,如办公套件 LibreOffice、火狐浏览器等;
  • 几乎所有的操作系统,如:Linux、Windows、macOS、iOS 和 Android 等。

排查方式

curl

从引入依赖的方式来看,通常应用中会通过系统命令直接调用 curl,例如在 shell 中通过调用 curl 进行 http 请求。

此时需要考虑系统发行版中自带的 curl,以及应用中可以打包包含的 curl 文件。

curl -V命令输出的 banner 信息可作为其特征:

$ curl -V

curl 7.68.0 (x86_64-pc-linux-gnu) libcurl/7.68.0 OpenSSL/1.1.1f zlib/1.2.11 brotli/1.0.7 libidn2/2.3.0 libpsl/0.21.0 (+libidn2/2.2.0) libssh/0.9.3/openssl/zlib nghttp2/1.40.0 librtmp/2.3

Release-Date: 2020-01-08

可以分别从进程和系统环境中排查:

  • 对于系统环境中的 curl,可以通过curl -V | egrep -o '^curl [678]+.[0-9]+.[0-9]+'获取对应的版本
  • 对于进程中的 curl,可以通过对文件进行识别,如strings curl | egrep -o '^curl [678]+.[0-9]+.[0-9]+'

libcurl

在 libcurl 中也存在相同的特征:

CLIENT libcurl 7.44.0-DEV

libcurl/7.44.0-DEV

libcurl 通常以动态链接库的形式存在,如libcurl.so.4.8.0,应用依赖的 libcurl,可能存在于系统 lib 目录,如/usr/lib/,也可能被应用直接打包进应用目录。

因此排查需要考虑:

  • 对系统 lib 目录及应用目录中的文件分析,如strings libcurl.so | egrep -o 'libcurl-/'
  • 运行中的应用可以通过分析进程打开文件来判断,如sudo lsof | egrep -o '/..so. ' | xargs -I {} bash -c "strings {} | egrep -o 'libcurl-/'"

修复方案

升级

  • 升级 curl 和 libcurl 到 8.4.0 或更高版本

缓解措施

参考链接

https://www.oscs1024.com/hd/MPS-cpg0-9qk3

https://curl.se/docs/CVE-2023-38545.htm

https://daniel.haxx.se/blog/2023/10/11/how-i-made-a-heap-overflow-in-curl/

https://gist.github.com/xen0bit/0dccb11605abbeb6021963e2b1a811d3

https://hackerone.com/reports/2187833

相关推荐
用户962377954483 天前
VulnHub DC-3 靶机渗透测试笔记
安全
叶落阁主4 天前
Tailscale 完全指南:从入门到私有 DERP 部署
运维·安全·远程工作
用户962377954486 天前
DVWA 靶场实验报告 (High Level)
安全
数据智能老司机6 天前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机6 天前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
用户962377954486 天前
DVWA 靶场实验报告 (Medium Level)
安全
red1giant_star6 天前
S2-067 漏洞复现:Struts2 S2-067 文件上传路径穿越漏洞
安全
用户962377954487 天前
DVWA Weak Session IDs High 的 Cookie dvwaSession 为什么刷新不出来?
安全
cipher8 天前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
一次旅行11 天前
网络安全总结
安全·web安全