freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

curl堆溢出漏洞分析 CVE-2023-48545
洞源实验室 2023-10-17 17:45:28 67478

0x00 漏洞背景

curl是一个跨平台的命令行工具和库,用于进行各种网络数据传输操作,包括文件下载、上传、HTTP请求和支持多种网络协议,同时也提供了丰富的自定义选项,使其成为系统管理员、开发者和测试人员在终端上进行网络操作的强大工具。

这个漏洞导致curl在SOCKS5代理握手过程中产生了堆溢出。

当要求curl将主机名传递给SOCKS5代理以允许其解析地址,而不是由curl自己完成时,主机名的最大长度为255字节。

如果检测到主机名超过255字节,curl会切换到本地名称解析,然后仅将已解析的地址传递给代理。由于一个错误,表示“让主机解析名称”的本地变量可能在SOCKS5握手过程中获取错误的值,与本意相反,将太长的主机名复制到目标缓冲区,而不仅仅是复制已解析的地址。

0x01 漏洞信息

2023年9月30日,Hackerone上的用户raysatiro创建了关于curl堆溢出漏洞的报告。2023年10月4日,curl的维护者bagder宣告了10月11日将随着curl8.4.0版本的发布报告curl前版本严重的安全问题。2023年10月11日,curl发布修复版本8.4.0。

0x02 漏洞影响

该漏洞影响版本为:libcurl 7.69.0 ~ 8.3.0

0x03 环境搭建

笔者选择8.3.0的curl版本进行构建。首先从Github获取curl源码。随后autoconf生成./configure文件,如果未成功,报错configure.ac: error: possibly undefined macro,使用sudo apt install automake libtool m4 autoconf安装依赖。再然后./configure CFLAGS="-fsanitize=address -g" LDFLAGS="-fsanitize=address" --without-ssl  --prefix=/path/to/install配置Makefile(这里用ASAN帮忙辅助分析)。最后make,make install生成可执行文件。

0x04 漏洞复现

1.配置socks5代理

$ git clone https://github.com/MisterDaneel/pysoxy

$ cd pysoxy

$ python3 pysoxy.py

2.配置域名解析

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

3.PoC

curl--limit-rate 1025 -vvv -x socks5h://localhost:[port of socks5] $(python3 -c "print(('A'*10000), end='')")

0x05 漏洞分析

分析ASAN错误信息,发现是一个heap-buffer-overflow,

GDB分析。

首先产生的原因在于hostname_len>255的时候,会将socks5_resolve_local设置为TRUE,代表本地解析。这里hostname_len为10000。

Curl_preconnect()函数通常在网络连接开始前被调用,它的目的是在实际建立连接之前执行一些准备工作。通常在执行 HTTP 请求时,需要进行多次网络连接,例如在处理重定向时。这里动态分配的内存由state.buffer指向,state结构是struct UrlState state是用于状态信息和其他动态目的的字段的结构。buffer结构是用于下载数据的缓冲区。

最后在socks.c:907的do_SOCKS5函数中会将sx->hostname写入上述Curl_preconnect函数malloc的1026大小的内存中。

0x06 补丁分析

对于hostname过长的情况不进行本地解析,直接返回错误。

0x07 总结

漏洞流程总体如下:

01

首先初始化socks5_resolve_local变量

02

随后第一次do_SOCKS由于hostname_len=10000>255设置socks5_resolve_local=TRUE。

03

在后续的do_SOCKS调用中,socks5_resolve_local会被重置,为FALSE。其在socks服务器回复有效的情况下会进入CONNECT_RESOLVE_REMOTE。

04

最后此处socks5_resolve_local依旧为FALSE,hostname被memcpy到堆socksreq中,造成堆溢出。

05

最后此处socks5_resolve_local依旧为FALSE,hostname被memcpy到堆socksreq中,造成堆溢出。

# 网络安全 # 网络安全技术
本文为 洞源实验室 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
洞源实验室 LV.6
洞察漏洞之源/Insight Bugs
  • 75 文章数
  • 44 关注者
从何同学视频看开源协议的重要性
2024-11-26
从何同学视频看开源协议的重要性
2024-11-26
大语言模型安全,到底是什么的安全
2024-11-11
文章目录