CVE-2023-38545(漏洞分析与检测方法)

2024-03-06 09:54:29·  来源:ACSRC  
 

 curl:curl是一个用于传输数据的命令行工具和库,支持多种网络协议,如HTTP、FTP、SMTP等。它是一个广泛用于编程和自动化数据传输的工具。


    libcurl:libcurl是curl的C语言库,允许开发人员在他们的应用程序中使用curl的功能。它是curl的核心组件。


    curl团队于2023年10月11日发布curl的8.4.0版本。同时,他们还公开两个漏洞:CVE-2023-38545和CVE-2023-38546


什么是CVE-2023-38545? 


该漏洞主要成因是在使用SOCKS5代理链接过程中造成的堆溢出。当Curl使用SOCKS5代理以便它解析地址时,主机名的最大长度为255字节。如果检测到主机名超过255字节,Curl将切换到本地主机解析地址,并将解析后的地址传递给代理。然而,由于程序bug,在建立延迟较高的 SOCKS5 链接过程中,此时主机解析地址可能会获取错误的值,此时会把过长的主机名也复制到缓冲区中。


主机名来自于提供给Curl解析的url。目标缓冲区是libcurl 中基于堆的下载缓冲区,缓冲区的默认大小为16kB,但可以由应用程序设置为不同的大小。Curl 工具默认将其设置为102400字节,但如果 --limit-rate 设置低于102400字节/秒,则会将缓冲区大小设置为较小的值。libcurl提供了CURLOPT_BUFFERSIZE选项来更改下载缓冲区的大小。libcurl 在 URL 中接受最多达65535字节的主机名。


要发生溢出,需要一个足够慢的SOCKS5连接来触发局部变量bug,并且客户端使用的主机名长于下载缓冲区。通过恶意的 HTTPS 服务器进行重定向到一个特别设计的 URL。某些较老的服务器延迟可能足以触发此漏洞。堆溢出仅可能在未设置 CURLOPT_BUFFERSIZE 或将其设置为小于 65541的情况下发生。


 在libcurl中,导致使用远程主机名的SOCKS5的选项为:将CURLOPT_PROXYTYPE设置为CURLPROXY_SOCKS5_HOSTNAME类型,或者将CURLOPT_PROXY或 CURLOPT_PRE_PROXY 设置为使用socks5h://方案。其中一个代理配置环境变量可以设置为使用socks5h://方式,例如http_proxy、HTTPS_PROXY或 ALL_PROXY。在Curl工具中,导致使用远程主机名的SOCKS5的选项为:--socks5-hostname,或者将--proxy或--preproxy设置为使用socks5h:// 方式。


看了下源码,罪魁祸首在这里:



hostname 来自命令行的输入,想弄多长都行。


socksreq是预分配的空间,承受不住任意长度的输入。


漏洞利用


 执行如下命令




修复建议


Linux / MacOS




Windows



修复建议 


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


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


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


分享到:
 
反对 0 举报 0 收藏 0 评论 0
沪ICP备11026620号