Trail of Bits万字长文判SAML死刑:XML签名包装二十年未除,五大致命缺陷全盘点

Trail of Bits万字长文判SAML死刑:XML签名包装二十年未除,五大致命缺陷全盘点

2026年9月21日,安全公司Trail of Bits的研究员Matt Schwager发表长文《SAML: A fractal of bad design》,次日登上Hacker News获得305点关注。文章开宗明义:这个诞生于学术界、成长于企业IT部门的认证协议仍然是这些组织的标配,但它已经被自身的复杂性压垮,是时候弃用并转向OpenID Connect这样的现代替代方案了。

文章回顾了SAML的出身:2002年由OASIS安全服务技术委员会创建,是「基于XML的安全断言标记语言」。SaaS在2000年代后期兴起时,IT部门需要一种让用户登录众多新Web服务的方式,SAML与随之而生的单点登录行业填上了这个需求。作者引用同事Thomas Ptacek在2023年的判断:SAML其实大部分都容易理解,问题在于它建在流沙之上——只要你假设XML签名验证是可靠的。

XML签名包装:2012年就能自动检测,今天仍然存在

XML签名包装攻击是插在SAML脚后跟上的那支箭。签名包装与SAML的安全研究可以追溯到2005、2008与2009年,作者认为真正的奠基之作是2012年的《On Breaking SAML: Be Whoever You Want to Be》,它把理论对上实践并给出了自动化检测XSW的方法。作者在Duo负责第一个本地访问网关产品时正是以这篇论文为北极星来选型simpleSAMLphp,因为当时后者在几乎没人知道XSW是什么的年月就已经抵御这类攻击。

但文章的核心控诉在于:既然2012年就被放在聚光灯下,XSW为什么今天仍然存在?答案要回到SAML的地基。XML自身的安全记录并不光彩:XXE、实体展开造成的「十亿笑声」、DTD检索导致的SSRF、XPath与XInclude及XSLT与CDATA注入,一个SAML库在碰到真正的SAML功能之前必须先把这些漏洞类别全部处理掉。再加上XML相对JSON的复杂度:标签、元素、属性、注释、命名空间、标记与内容的区分、模式、CDATA与DOCTYPE,而JSON基本只有键、值、对象与列表。复杂度通常与安全相互掣肘。

五大致命缺陷:规范化、信封签名、大杂烩设计与僵化

文章盘点了五个致命缺陷。其一是规范化:服务提供方与身份提供方必须对同一份XML取得一致的表示,字节对不上签名就对不上,认证直接失败;规范化漏洞正是2018年Kelby Ludwig发现XML注释绕过的温床,也是现代SAML攻击最常用的解析器差异与往返缺陷的先导——2020年Go标准库的XML往返漏洞、2021年横跨Web的XML实现加固,以及2025年绕过GitHub Enterprise上SAML认证的libxml2特性利用与多篇SAML绕过论文都属此类。

其二是信封签名:JWT把签名与JSON载荷用点号分隔,而SAML把Signature元素插进被签名的Assertion内部,要在修改数据的同时取得逐字节等价的规范化表示极其困难。其三是「大杂烩」设计:今天99%的SAML实现使用极其相似的数据形状与规范子集,任意一次野外的SAML认证可能避开了规范的九成内容。其四是僵化:SAML传输无关而OIDC假定HTTP加TLS,后者把加密与信任交给传输层;OIDC还假定提供方与依赖方可以直接通信,从而减轻认证载荷承载全部决策信息的压力。相比之下OIDC是按需演进的:2014年发布1.0,2015年敲定JOSE整套RFC,PKCE、设备授权、DPoP与面向单页应用的RFC相继在2015到2026年间落地。文章承认企业生态的惯性使SAML短时间内不会消失,但呼吁新的认证协议设计把这些缺陷当作教材。