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

admin 2023年10月13日14:34:13评论19 views字数 3033阅读10分6秒阅读模式

简介


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 堆缓冲区溢出漏洞(CVE-2023-38545)详细分析


漏洞复现过程


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 到代理解析时返回结果。

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


3. 执行命令

curl--limit-rate 1025 -vvv -x socks5h://localhost:7890 $(python3 -c "print(('A'*10000), end='')")
libcurl Socks5 堆缓冲区溢出漏洞(CVE-2023-38545)详细分析

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


影响分析



漏洞利用可能性与危害


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


通过 libcurl 在通过 socks 代理的情况下访问攻击者可控制的地址。(攻击者可能通过 302 跳转诱使解析访问超长的域名)


从利用结果上看,导致拒绝服务是比较容易的,但要造成远程代码执行,需要根据具体的应用、操作系统平台进行构造,黑盒场景通常难以利用。



curl 的应用范围


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


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


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

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

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


  • 具有网络传输功能的客户端应用程序,如办公套件 LibreOffice、火狐浏览器等;


  • 几乎所有的操作系统,如:Linux、Windows、macOS、iOS 和 Android 等。


排查方式



curl 


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

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


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


$ curl -Vcurl 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.3Release-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-DEVlibcurl/7.44.0-DEV


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


因此排查需要考虑:


  • 对系统 lib 目录及应用目录中的文件分析,如strings libcurl.so | egrep -o 'libcurl[ -/]([678]+.[0-9]+.[0-9]+)'


  • 运行中的应用可以通过分析进程打开文件来判断,如sudo lsof | egrep -o '/.*.so.*' | xargs -I {} bash -c "strings {} | egrep -o 'libcurl[ -/]([678]+.[0-9]+.[0-9]+)'"


修复方案



升级


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



缓解措施


  • 避免将 CURLPROXY_SOCKS5_HOSTNAME 代理与 curl 一起使用

  • 避免将代理环境变量设置为 socks5h://



补丁


  • 官方已发布补丁:

    https://github.com/curl/curl/commit/4a4b63daaa


参考链接


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

https://curl.se/docs/CVE-2023-38545.htmhttps://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


排查工具及投毒情报



墨菲安全提供产品可实时拦截针对开源组件的投毒


墨菲安全的私有源网关产品可对npm、pip、maven等中央仓库的投毒事件进行实时的检测和拦截,同时支持对高危漏洞实现基线管理,目前该产品已在蚂蚁、小米、中国电信、中国移动等数十家客户落地应用。



墨菲安全提供实时的开源组件投毒情报预警可订阅


墨菲安全0day漏洞及投毒情报覆盖最新的0day、1day及投毒情报预警,所有情报经过严格的安全专家研判,保障企业获取的第一手的高质量漏洞及投毒情报,更有比CVE漏洞库多25+额外的详细分析字段,目前该产品已在蚂蚁、美团、中国电信等数十家客户落地应用。



以上功能企业可通过以下方式申请试用


一、长按二维码申请:

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


二、访问申请链接:

https://murphysec.feishu.cn/share/base/form/shrcny75AEBuEJpL8myuAKPfsPe


原文始发于微信公众号(墨菲安全实验室):libcurl Socks5 堆缓冲区溢出漏洞(CVE-2023-38545)详细分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年10月13日14:34:13
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   libcurl Socks5 堆缓冲区溢出漏洞(CVE-2023-38545)详细分析http://cn-sec.com/archives/2107680.html

发表评论

匿名网友 填写信息