Go ReverseProxy 漏洞 CVE-2026-39825 泄露查询参数
CVE-2026-39825 在 Go 的 ReverseProxy 中允许将 Rewrite 函数不可见的查询参数转发,绕过 net/http 中的清理。

执行摘要
Go 的 net/http 包中存在一个漏洞,跟踪编号为 CVE-2026-39825,允许 ReverseProxy 处理器转发包含查询参数的 HTTP 请求,这些参数对 Rewrite 函数或自定义 Director 函数不可见。这可能导致敏感数据的意外泄露或绕过依赖于参数清理的安全逻辑。这个缺陷源于 ReverseProxy 与 url.ParseQuery 的交互方式以及通过 GODEBUG 环境变量控制的查询参数总数的可配置限制。Go 团队已在上游仓库发布了补丁,建议所有使用 Go 标准库 ReverseProxy 的用户进行更新。
技术分析
Go 的 net/http 包中的 ReverseProxy 处理器旨在将传入的 HTTP 请求转发到后端服务器,并通过 Rewrite 或 Director 函数可选地修改请求。根据 Go 源代码仓库中的提交消息(CL 770541),代理会清理转发的请求以移除 url.ParseQuery 未解析的查询参数。然而,ParseQuery 内置了一个它将解析的查询参数总数的限制,可以使用 GODEBUG 环境变量(特别是 GODEBUG=u)进行调整。
当超出此限制时,ParseQuery 会静默忽略额外的参数。在修复之前的 ReverseProxy 实现会将这些未解析的参数转发到后端,绕过 Rewrite 或 Director 函数可能执行的任何清理或检查。这意味着一个精心构造的请求,包含过多数量的查询参数,可能会绕过依赖于 Rewrite 过滤或修改参数的安全检查,从而走私数据。
在 ReverseProxy 用作网关或 API 网关的环境中,这个漏洞尤其危险,这些环境中使用 Rewrite 函数在转发到内部服务之前剥离敏感参数(例如,API 密钥、会话令牌)。攻击者可以添加超出 ParseQuery 限制的额外参数,导致代理转发原始敏感参数 —— 这些参数可能本意是要被移除的 —— 到后端。
截至本文撰写时,尚未官方发布 CVE-2026-39825 的 CVSS 评分。Go 团队没有披露具体的严重性等级,但这个缺陷的性质 —— 绕过安全关键的重写逻辑 —— 需要对依赖于 Rewrite 进行参数清理的部署进行高严重性分类。
缓解措施与建议
使用 Go 的 net/http ReverseProxy 的组织应采取以下步骤:
-
更新 Go 到修补过的版本。 修复程序包含在 Go 仓库的提交 770541 中。预计 Go 团队将在下一个稳定版本中包含此修复。监控官方 Go 发布说明以获取具体版本号。
-
审计现有的
ReverseProxy配置。 审查任何解析或清理查询参数的Rewrite或Director函数。确定它们是否依赖于url.ParseQuery行为以及参数限制是否可以被利用。 -
为
u设置明确的GODEBUG值 到一个低数字,如果您的应用程序不需要高参数计数,减少攻击面。但请注意,这可能会破坏具有许多参数的合法请求。 -
考虑替代的代理解决方案 对于参数清理至关重要的高安全环境。Go 标准库的
ReverseProxy并非设计为安全边界;建议在应用层进行额外验证。
订阅更新
将最新的网络安全资讯直接发送到您的邮箱。
