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

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

该漏洞是由主机名解析代码中的一个错误引起的,该错误发生在联系 SOCKS5 代理之前。如果主机名长度不超过 256 个字符,curl 会立即将主机名传递给 SOCKS5 代理进行本地解析。如果主机名长度超过 255 个字符,curl 会切换到本地解析器,并将预定义的地址传递给 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

为具有 DDoS 保护、VPS VDS 服务器的站点购买可靠的主机 🔥 购买具备 DDoS 防护的可靠网站托管服务,包括 VPS 和 VDS 服务器 | ProHoster