赞
踩
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 |
$ git clone https://github.com/MisterDaneel/pysoxy
$ cd pysoxy
$ python3 pysoxy.py
将 127.0.0.1 「一万个 A」解析加入到/etc/hosts 中,用于传递 hostname 到代理解析时返回结果。
执行命令 curl --limit-rate 1025 -vvv -x socks5h://localhost:7890 $(python3 -c “print((‘A’*10000), end=‘’)”)
默认 curl 是 100kB 的缓冲区,需要使用–limit-rate 1025 限制为 1025 后,1 万个字符的可导致堆溢出。
该漏洞利用条件较高,预估能实际造成严重危害的场景相对有限。
Curl 从 1998 年维护至今,已经成为 HTTP 请求命令行工具的事实标准,具有丰富的 Api 和 Abi(应用程序二进制接口),因此被广泛应用于需要网络传输的产品或设备中,如手机/平板、操作系统、服务器、医疗和物联网设备等。
curl/libcurl 相关不同语言的开源代码仓库占比
从引入依赖的方式来看,通常应用中会通过系统命令直接调用 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
可以分别从进程和系统环境中排查:
在 libcurl 中也存在相同的特征:
CLIENT libcurl 7.44.0-DEV
libcurl/7.44.0-DEV
libcurl 通常以动态链接库的形式存在,如libcurl.so.4.8.0,应用依赖的 libcurl,可能存在于系统 lib 目录,如/usr/lib/,也可能被应用直接打包进应用目录。
因此排查需要考虑:
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。