通过 SOCKS5 代理访问时,curl 和 libcurl 中出现缓冲区溢出

在并行开发的用于通过curl网络和libcurl库接收和发送数据的实用程序中发现了一个漏洞(CVE-2023-38545),该漏洞可能导致缓冲区溢出并可能在网络上执行攻击者代码。使用curl实用程序或使用libcurl的应用程序访问客户端时,将其发送到攻击者控制的HTTPS服务器。 仅当在curl 中启用了通过SOCKS5 代理进行访问时,才会出现此问题。 无需代理直接访问时,不会出现该漏洞。 该漏洞已在curl 8.4.0版本中修复。 作为 Hackerone 互联网漏洞赏金计划的一部分,发现该漏洞的安全研究人员获得了 4660 美元的奖励。

该漏洞是由于访问 SOCKS5 代理之前的主机名解析代码错误造成的。 如果主机名最长为 256 个字符,curl 会立即将名称传递给 SOCKS5 代理进行解析,如果名称超过 255 个字符,则切换到本地解析器并将已定义的地址传递给 SOCKS5 。 由于代码中的错误,在通过 SOCKS5 进行连接的缓慢协商期间,指示需要本地解析的标志可能被设置为错误的值,这导致在按期望分配的缓冲区中记录了长主机名存储 IP 地址或名称,不超过 255 个字符。

通过 SOCKS5 代理通过curl访问的站点的所有者可以通过返回请求重定向代码(HTTP 30x)并将“Location:”标头设置为主机名在16以上范围内的URL来触发客户端缓冲区溢出到 64 KB(16 KB 是溢出分配的缓冲区所需的最小大小,65 KB 是 URL 中允许的最大主机名长度)。 如果在 libcurl 设置中启用了请求重定向,并且使用的 SOCKS5 代理足够慢,那么长主机名将被写入一个小缓冲区,显然尺寸较小。

该漏洞主要影响基于libcurl的应用程序,仅当使用值小于65541的“--limit-rate”选项时才会出现在curl实用程序中 - libcurl默认分配大小为16 KB的缓冲区,并且在curl实用程序中它是 100 KB,但大小会根据“-limit-rate”参数的值而变化。

该项目的作者 Daniel Stenberg 提到,该漏洞已经有 1315 天没有被发现了。 它还表示,如果curl是用内存安全的语言编写的,那么之前发现的curl中41%的漏洞可能是可以避免的,但在可预见的将来没有计划将curl重写为另一种语言。 作为提高代码库安全性的措施,建议扩展用于测试代码的工具,并更积极地使用用编程语言编写的依赖项,以确保内存的安全操作。 它还正在考虑用安全语言编写的变体逐步替换部分curl的可能性,例如用Rust实现的实验性Hyper HTTP后端。

来源: opennet.ru

添加评论