Daniel Stenberg(cURL 项目的作者) 最近宣布 通过博客文章,有关的信息 中检测到的漏洞 通过网络接收和发送数据的实用程序 curl 和 libcurl 库。
提到该漏洞(已编目为 CVE-2023-38545) 是由于主机名解析代码中的错误造成的 在访问 SOCKS5 代理之前。
SOCKS5 是一种代理协议。 这是一个相当简单的协议,用于通过专用“代理”建立网络通信。 例如,该协议通常用于通过 Tor 建立通信,但也用于组织和公司访问互联网。
SOCKS5 有两种不同的主机名解析模式。 客户端在本地解析主机名并将目标作为解析地址传递,或者客户端将完全限定的主机名传递给代理并允许代理远程解析主机。
如此失败 可能导致缓冲区溢出 当通过curl实用程序或使用libcurl的应用程序访问攻击者控制的HTTPS服务器时,可能会执行攻击者的客户端代码。 但问题是 仅当通过 SOCKS5 代理访问时才存在 在curl中启用。 无需代理直接访问时,不会出现该漏洞。
通过 SOCKS5 代理通过 curl 访问的站点的所有者被描述为能够:
通过返回请求重定向代码 (HTTP 30x) 并将“Location:”标头设置为主机名大小范围为 16 到 64 KB(最大大小为 16 KB)的 URL 来触发客户端缓冲区溢出。溢出分配的缓冲区,65 KB 是 URL 中允许的最大主机名长度)。
如果在 libcurl 配置中启用了请求重定向,并且使用的 SOCKS5 代理足够慢,那么长主机名将被写入一个小缓冲区,显然尺寸较小。
在他的博文中, Daniel Stenberg 提到该漏洞在 1315 天的时间里仍未被发现。 它还表示,如果curl是用内存安全的语言编写的,那么之前发现的curl中41%的漏洞可能是可以避免的,但在可预见的将来没有计划用另一种语言重写curl。
该漏洞主要影响基于 libcurl 的应用程序 仅当使用值小于 65541 的“--limit-rate”选项时,才会出现在curl实用程序中,因为libcurl默认分配16 KB缓冲区,而curl中分配100 KB,但该大小根据“ –限制速率”参数。
提到如果主机名最多256个字符,curl立即将名称传递给SOCKS5代理进行解析,如果名称超过255个字符,则切换到本地解析器并将已经定义的地址传递给SOCKS5 。 由于代码中的错误,在通过 SOCKS5 进行连接缓慢协商期间,指示需要本地解析的标志可能会被设置为不正确的值,从而导致长主机名被写入分配用于存储 IP 的缓冲区地址或姓名,不得超过 255 个字符。
最后,提到 该漏洞已在curl版本8.4.0中修复 作为提高代码库安全性的措施,建议扩展用于测试代码的工具,并更积极地使用用编程语言编写的依赖项,以保证内存的安全操作。 它还正在考虑逐步用用安全语言编写的选项替换部分curl,例如用Rust实现的实验性Hyper HTTP后端。
如果你是 有兴趣了解更多,您可以查看详细信息 在下面的链接中。