CVE-2025-61729CVE-2025-61729是Go语言标准库中crypto/x509包存在的一个高危安全漏洞。该漏洞位于HostnameError.Error()方法中,当构造错误字符串时,没有对打印的主机名数量进行限制。此外,错误字符串是通过重复的字符串连接方式构建的,这导致了二次时间复杂度的运行时开销。攻击者可以通过向目标系统提供包含大量无效主机名的恶意TLS证书来触发此漏洞。当目标系统尝试验证该证书时,HostnameError.Error()方法会被调用,由于缺乏长度限制和低效的字符串拼接方式,系统将消耗过多的CPU和内存资源,最终可能导致拒绝服务条件。此漏洞影响所有使用Go语言crypto/x509包进行证书验证的应用程序,攻击者无需任何认证即可利用此漏洞。
漏洞根源在于Go标准库crypto/x509包中的HostnameError.Error()方法实现。在验证X.509证书时,如果证书中包含的主机名与预期不匹配,系统会创建HostnameError结构体并调用其Error()方法返回错误信息。该方法的实现存在两个关键问题:首先,错误字符串的构造没有对主机名数量设置上限,当证书包含大量主机名时,所有主机名都会被包含在错误消息中;其次,错误字符串是通过循环中的字符串拼接(+操作符)构建的,在Go语言中字符串是不可变的,每次拼接都会创建新的字符串对象并复制已有内容,导致时间复杂度为O(n²)。攻击者可以构造一个包含数百甚至数千个主机名的恶意证书,当受害者应用程序尝试验证该证书时,Error()方法会被触发,在解析和处理这些主机名时消耗大量系统资源。对于处理大量连接的服务(如TLS服务器、代理服务器、API网关等),这种资源消耗可能迅速导致服务不可用。