CVE-2025-64527Envoy是一个高性能的边缘/中间/服务代理。1.33.12、1.34.10、1.35.6、1.36.2及更早版本存在一个拒绝服务漏洞,当JWT认证配置为远程JWKS获取模式且启用allow_missing_or_failed选项时,如果请求头中存在多个JWT令牌且JWKS获取失败,会导致Envoy进程崩溃。该漏洞的根本原因在于JwksFetcherImpl中的重入bug,当第一个令牌的JWKS获取失败时,onJwksError()回调函数会触发第二个令牌的处理流程,而第二个令牌又会在同一个fetcher对象上再次调用fetch()方法。此时原始回调的reset()操作会清除第二个fetch的状态(receiver_和request_),导致异步HTTP响应到达时程序崩溃。此漏洞无需特殊权限即可触发,攻击者可利用此漏洞造成服务中断。
该漏洞发生在Envoy的JWT验证模块中。当配置了remote_jwks(远程JWKS获取)且设置allow_missing_or_failed为true时,系统允许JWKS获取失败时继续处理请求。技术细节如下:1)当请求包含多个JWT令牌时,Envoy会依次处理每个令牌;2)处理第一个令牌时,触发异步HTTP请求获取JWKS;3)如果JWKS获取失败,onJwksError()回调被触发;4)该回调会立即开始处理第二个令牌;5)第二个令牌的验证流程再次调用fetch()方法,形成重入;6)第一个令牌的清理逻辑执行reset(),清空receiver_和request_;7)当第二个令牌的异步HTTP响应返回时,由于状态已被清除,导致空指针引用或野指针访问,最终造成进程崩溃。攻击者只需构造包含多个JWT令牌的HTTP请求,并确保JWKS服务器不可达或返回错误即可触发此漏洞。