CVE-2025-64702quic-go是一个用Go语言实现的QUIC协议库,广泛应用于HTTP/3客户端和服务器实现。该漏洞影响quic-go 0.56.0及以下版本,源于HTTP/3实现中对QPACK编码的HEADERS帧处理不当。攻击者可以通过发送精心构造的QPACK编码HEADERS帧来触发该漏洞,这些帧解码后会生成大量的唯一header名称和/或极大的header值。系统在构建http.Header时,仅对QPACK压缩后的HEADERS帧大小进行检查,而未对解码后的header大小设置限制,导致攻击者可以耗尽服务器内存资源,造成拒绝服务攻击。由于该漏洞可通过网络远程利用,且无需认证和用户交互,因此具有较高的实际威胁性。任何使用quic-go库进行HTTP/3通信的应用都可能受到影响。
该漏洞的根本原因在于quic-go的QPACK解码器缺少对解码后header字段大小的限制机制。当接收QPACK编码的HEADERS帧时,解码器会将其解压缩为标准的HTTP header字段。攻击者构造的恶意HEADERS帧在压缩状态下可能很小(满足大小限制),但解码后会膨胀到非常大的尺寸(包含数千个唯一header名称或极大的value)。系统直接将这些解码后的数据存储在http.Header结构中,而Go的http.Header内部使用map存储header名称和值,每个header条目都会占用独立的内存空间。攻击者可以通过发送多个这样的恶意HEADERS帧来持续消耗服务器内存,最终导致内存耗尽和应用程序崩溃。攻击者还可以利用HTTP/3的流复用特性,在单个连接上快速发送大量恶意请求,加速内存消耗过程。