编程 Traefik ForwardAuth 把 NTLM 身份串给了别人:认证子请求共用连接池,v2.11.60 / v3.7.16 才隔离

2026-10-26 21:04:24

Traefik ForwardAuth 把 NTLM 身份串给了别人:认证子请求共用连接池,v2.11.60 / v3.7.16 才隔离

影响范围

分支受影响版本修复版本
v2(github.com/traefik/traefik/v2)<= v2.11.59v2.11.60
v3(github.com/traefik/traefik/v3)>= v3.0.0, <= v3.7.15v3.7.16

v3.0 到 v3.6 已 EOL,不会在自己的分支上修复,只能升级到 v2.11.60 或 v3.7.16。

触发条件

只有当认证服务器使用连接绑定(connection-bound)的认证方案时才会触发:NTLM,或 SPNEGO/Kerberos 的 Negotiate,典型场景是 IIS 的 Windows 认证。认证端如果只做 Basic、Bearer token 一类与连接状态无关的校验,不涉及这条路径。

漏洞机制

ForwardAuth 发出的认证子请求,走的是该中间件所有客户端共享的同一个连接池。NTLM/Negotiate 的认证状态是绑在 TCP 连接上的:用户 A 完成握手后,那条通往 auth server 的连接就带着 A 的身份。此时 B 从另一条前端连接进来,Traefik 发子请求时复用了这条已认证连接,auth server 直接回 200;Traefik 认为 B 已通过认证,把 authResponseHeaders 中的用户标识转发给后端,后端看到的就是 A。B 全程不需要任何凭据。

v3.7 中 Kubernetes Ingress NGINX provider 的 auth-url 注解所发出的外部认证请求,同样受此影响。

与之前几个 GHSA 的区别

GHSA-53qr-784g-cj35、GHSA-qqjf-53cj-pwvv、GHSA-cw35-4q88-3rmp、GHSA-qm9f-w54v-q2qh 只隔离了 backend 代理路径上的连接绑定认证。这次的缺陷在 auth server 一侧——前面几个补丁打完,只要认证端是 NTLM,身份仍然会串。修复把同样的按前端连接隔离的做法应用到了认证服务器连接上。

CVSS v4 向量:AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:N/SC:H/SI:H/SA:N。

排查

  1. 列出所有 ForwardAuth 中间件和 ingress-nginx auth-url 指向的认证端点。
  2. 直接打认证端点,看它宣告的认证方案:
curl -sv -o /dev/null https://auth.example.com/ 2>&1 | grep -i '^< www-authenticate'

出现 Negotiate 或 NTLM 即满足触发前提;响应中出现 NTLMSSP 标记同样是连接绑定认证的信号。
3. 核对 Traefik 版本是否落在受影响区间,尤其是还在跑 v3.0–v3.6 的集群。

缓解

  • 升级到 v2.11.60 / v3.7.16。这是唯一能保住现有 Windows 域透明登录的方案。
  • 短期无法升级时,把认证端换成不依赖连接状态的方案,例如 Basic(务必走 HTTPS)或 token 校验。代价是丢掉域内免密登录,用户需要重新输入凭据。
  • 在认证端或网络层让 ForwardAuth 的子请求不复用连接:每请求独立连接、关闭 keepalive。代价是每次请求都要重做一遍 NTLM 握手,到 auth server 的延迟和连接开销明显上升,属于降风险而非修复。

v3.7.16 的发布说明里另有一条:Support NTLM and Kerberos in ForwardAuth and ingress-nginx auth-url(#14091、#14084)。

复制全文 生成海报 Traefik 安全 运维 网关

推荐文章

程序员茄子在线接单