Trail of Bits 判 SAML 死刑:被规范化诅咒的二十年

Trail of Bits 判 SAML 死刑:被规范化诅咒的二十年

安全SSOSAMLOIDC

数据源:Trail of Bits + HN

2026 年 9 月 21 日,顶级安全机构 Trail of Bits 发文直指 SAML 协议已死,主张全行业废弃这个支撑了 SSO 产业二十年的底层标准,全面转向 OIDC。这个在 Web 2.0 早期催生了数十亿美元生意的功臣,如今成了一个漏洞频发的黑洞。安全专家 Thomas Ptacek 曾留下一个务实的工程判断:「如果我要给新东西加 SAML 支持,我会在标准校验之外,额外拒收任何形状与 Okta、Onelogin、Google、Shib 生成的不一致的报文。」

XML 解析器成了安全防线单点

SAML 起源于 2002 年,由 OASIS 委员会强行拼凑四家公司的私有方案而成。当时 JSON 尚未进入主流视野,XML 成了唯一选项。这种脱离场景的超前设计,让整个协议的安全防线被迫锚定在 XML 解析器上。任何 SAML 库在开始处理业务断言前,必须先用大量代码清理掉 XXE、实体扩展(billion laughs)以及 DTD 拉取(SSRF)等老旧漏洞。

基于 XML 构建协议,让防守方一开始就处于劣势。2012 年 USENIX 论文《On Breaking SAML》给出了自动化检测 XML 签名包装(XSW)漏洞的方法。到了 2025 年,PortSwigger 披露的解析器差分绕过、以及针对 GitHub Enterprise 的 libxml2 特性滥用,依然沿用了同一套攻击思路。基础数据结构存在脆弱性,决定了上层业务加再多校验也无法堵住解析层的机制漏洞。

On Breaking SAML 论文记录对比 图:「On Breaking SAML」论文里 simpleSAMLphp 的安全记录对比图。来源:Trail of Bits 博客(转载自 2012 年 USENIX 论文)

规范化直接催生解析差分漏洞

SAML 签名的核心机制,要求服务提供方与身份提供方对同一段 XML 得到完全一致的字节结果,这个过程被称为规范化(C14N)。在现实工程中,不同语言环境和基础组件对空白符、注释、命名空间的处理存在固有差别。这种由解析器主导的规范化歧义,直接导致两端对同一份认证数据的理解产生严重分歧。

2018 年 Kelby Ludwig 发现的 XML 注释绕过漏洞,利用的正是规范化机制的缺陷。攻击者通过在关键断言字段插入 XML 注释,使得验证签名时数据完好无损,而进入业务流程后却加载了被篡改的身份。只要认证协议强制依赖 C14N 来对齐字节,解析器差分漏洞就会换个马甲反复复活,防御方只能疲于奔命地去填坑。

XML 规范化攻击路径 图:XML 规范化示意的攻击路径图。来源:Trail of Bits 博客(转载自 Kelby Ludwig《Identity Theft》)

包裹签名等同于边改数据边验证

在结构设计上,SAML 将 Signature 元素直接嵌入被签名的 Assertion 内部,业界称之为包裹签名(enveloped signature)。系统在校验时,必须先抽取内部结构,一边修改节点一边计算外层数据的哈希。这种自我缠绕的验证逻辑违背了单一职责原则,针对节点边界的微小扰动,都能轻易击穿原本就晦涩的校验链条。

与此形成强烈反差的是现代 JWT 采用的分离式(detached)签名设计。JWT 使用简单的句点将签名片段与 JSON 载荷物理隔离,验证逻辑直接且纯粹。底层结构上减少了噪音,让 JWT 的解析逻辑只需寥寥数行,而 SAML 却要包着庞杂的 libxmlsec 库才能跑通核心链路。

JWT 与 SAML 签名结构对照 图:JWT 与 SAML 签名结构对照。来源:Trail of Bits 博客(转载自 jwt.io 与 samltool.io)

委员会造车敌不过真实场景迭代

SAML 规范本身是一个包罗万象的大杂烩。它假定 IdP 与 SP 之间可能无法直连,于是把所有认证判断所需信息都塞进前端重定向携带的断言里;规范里还塞入了大量现实中用不到的绑定类型(SOAP、artifact 绑定)。今天线上跑的任意一次 SAML 认证只用到规范的一成,但所有接入方却要为剩下九成的废弃逻辑买单,平添了高昂的安全审计成本。

反观 OIDC 的发展,是一部从实际需求出发的演进史。从 2014 年发布 1.0 版本开始,OIDC 默认依赖 HTTP 直连,把敏感身份数据放回后端信道交互。后续通过 RFC 7636 补齐 PKCE 授权码拦截防护,用 RFC 8252 覆盖原生应用、RFC 8628 覆盖 IoT 设备、RFC 9449 引入 DPoP 持有证明,每一步都在回应一个具体的工程缺口。脱离业务场景的顶层设计,最终输给了直面具体问题的持续演进。

存量合规包袱拖累产业换代

面对千疮百孔的协议底座,部分服务提供方的逃生路线十分果决。Fly.io 与 Tailscale 已经率先在产品中全线放弃 SAML,仅支持 OIDC 接入。对于提供身份管理的厂商而言,由于大量存量企业客户的采购清单依然绑定 SAML 资质,他们只能被困在这个不断漏水的战车上继续修补。

保留 SAML 的一方指出 OIDC 现有生态的实现质量仍有瑕疵,且企业侧整体迁移成本高昂。但这无法掩盖一个残酷的工程事实:当协议的安全防线建立在 XML 规范化这种充满歧义的机制上时,每一次热修复只是在挪动攻击面。系统性缺陷深植于协议基因之中,停止为新系统接入 SAML 并倒排下线日期,是全行业及时止损的唯一正解。

参考链接:

  • Trail of Bits: SAML A fractal of bad design
  • Hacker News 讨论