极具影响SAML漏洞—由Duo团队发现
字数 1652 2025-08-29 08:31:48

SAML XML注入漏洞分析与防御指南

漏洞概述

本文详细分析了一种影响SAML单点登录(SSO)系统的新型XML注入漏洞,该漏洞由Duo Labs团队发现并报告。此漏洞允许经过身份验证的攻击者在不获取受害者用户密码的情况下,通过精心构造的SAML响应伪造用户身份进行登录。

受影响产品

多个知名SAML实现受到此漏洞影响,包括:

  • OneLogin - python-saml (CVE-2017-11427)
  • OneLogin - ruby-saml (CVE-2017-11428)
  • Clever - saml2-js (CVE-2017-11429)
  • OmniAuth-SAML (CVE-2017-11430)
  • Shibboleth (CVE-2018-0489)
  • Duo Network Gateway (CVE-2018-7340)

SAML响应基础

SAML(安全断言标记语言)是单点登录系统中广泛使用的标准协议。关键处理流程:

  1. 用户向身份提供者(IdP)进行身份验证,生成已签名的SAML响应
  2. 浏览器将响应转发给服务提供者(SP)
  3. SP验证SAML响应签名
  4. 如果签名有效,SAML响应中的NameID标识符用于确定用户身份

简化的SAML响应结构:

<SAMLResponse>
  <Issuer>https://idp.com/</Issuer>
  <Assertion ID="_id1234">
    <Subject>
      <NameID>user@user.com</NameID>
    </Subject>
  </Assertion>
  <Signature>
    <SignedInfo>
      <CanonicalizationMethod Algorithm="xml-c14n11"/>
      <Reference URI="#_id1234"/>
    </SignedInfo>
    <SignatureValue>签名数据</SignatureValue>
  </Signature>
</SAMLResponse>

漏洞技术原理

XML规范化问题

XML签名前会进行规范化处理,使逻辑上等效的XML文档具有相同的字节表示。常见的规范化算法:

  • http://www.w3.org/2001/10/xml-exc-c14n# (exc-c14n)
  • http://www.w3.org/2001/10/xml-exc-c14n#WithComments (保留注释的变体)

规范化会忽略某些不影响语义的差异,如属性顺序、注释等。

XML API文本提取不一致性

不同XML库处理包含注释的文本节点时行为不一致:

  1. lxml/REXML等库:仅返回第一个文本节点内容

    <NameID>klud<!-- comment -->wig</NameID>
    

    提取结果为"klud"

  2. ElementTree等库:拼接所有文本节点
    相同示例提取结果为"kludwig"

漏洞利用方式

攻击者可以构造如下恶意SAML响应:

<NameID>user@user.com<!---->.evil.com</NameID>
  1. 签名验证时,规范化处理会移除注释,验证通过
  2. 某些XML库提取文本时只获取"user@user.com"
  3. 攻击者使用"user@user.com.evil.com"账户,实际登录为"user@user.com"

影响范围

漏洞影响程度取决于:

  1. SP实现

    • 使用宽松文本提取的库更易受攻击
    • 对用户标识符有额外验证(如域名白名单)的SP受影响较小
  2. IdP配置

    • 允许自由注册的IdP风险更高
    • 严格用户供应流程的IdP风险较低

防御措施

对于服务提供商(SP)

  1. 更新SAML处理库

    • 确保使用正确处理XML注释的版本
    • 测试NameID提取时包含注释的用例
  2. 规范化算法选择

    • 使用WithComments变体保留注释(需IdP支持)
    • 确保规范化算法标识符不被篡改
  3. 多因素认证

    • 实施第二因素认证可降低风险
    • 注意:如果IdP处理所有因素,漏洞可能绕过全部认证

对于SAML库开发者

  1. 正确文本提取

    • 确保提取XML元素全部文本内容
    • 添加包含注释的测试用例
  2. 规范化后处理

    • 在签名验证后使用规范化文档进行文本提取
    • 防止规范化引入的其他漏洞

对于XML库开发者

  1. API行为改进

    • 考虑修改文本提取API默认行为
    • 提供明确的方法说明文档
  2. 标准完善

    • 推动XML处理标准更加明确

对于Duo用户

升级Duo Network Gateway至1.2.10或更高版本。

漏洞披露时间线

Duo团队与CERT/CC合作协调披露:

  1. 漏洞发现与验证
  2. 联系受影响厂商
  3. CVE分配与补丁开发
  4. 公开披露

总结

此SAML漏洞揭示了XML处理中的深层次问题,特别是规范化与文本提取的不一致性。防御需要多方协作,包括库开发者更新实现、服务提供商加强验证、以及标准组织的规范完善。通过全面理解漏洞原理,组织可以更好地保护其SAML实现免受此类攻击。

SAML XML注入漏洞分析与防御指南 漏洞概述 本文详细分析了一种影响SAML单点登录(SSO)系统的新型XML注入漏洞,该漏洞由Duo Labs团队发现并报告。此漏洞允许经过身份验证的攻击者在不获取受害者用户密码的情况下,通过精心构造的SAML响应伪造用户身份进行登录。 受影响产品 多个知名SAML实现受到此漏洞影响,包括: OneLogin - python-saml (CVE-2017-11427) OneLogin - ruby-saml (CVE-2017-11428) Clever - saml2-js (CVE-2017-11429) OmniAuth-SAML (CVE-2017-11430) Shibboleth (CVE-2018-0489) Duo Network Gateway (CVE-2018-7340) SAML响应基础 SAML(安全断言标记语言)是单点登录系统中广泛使用的标准协议。关键处理流程: 用户向身份提供者(IdP)进行身份验证,生成已签名的SAML响应 浏览器将响应转发给服务提供者(SP) SP验证SAML响应签名 如果签名有效,SAML响应中的NameID标识符用于确定用户身份 简化的SAML响应结构: 漏洞技术原理 XML规范化问题 XML签名前会进行规范化处理,使逻辑上等效的XML文档具有相同的字节表示。常见的规范化算法: http://www.w3.org/2001/10/xml-exc-c14n# (exc-c14n) http://www.w3.org/2001/10/xml-exc-c14n#WithComments (保留注释的变体) 规范化会忽略某些不影响语义的差异,如属性顺序、注释等。 XML API文本提取不一致性 不同XML库处理包含注释的文本节点时行为不一致: lxml/REXML等库 :仅返回第一个文本节点内容 提取结果为"klud" ElementTree等库 :拼接所有文本节点 相同示例提取结果为"kludwig" 漏洞利用方式 攻击者可以构造如下恶意SAML响应: 签名验证时,规范化处理会移除注释,验证通过 某些XML库提取文本时只获取"user@user.com" 攻击者使用"user@user.com.evil.com"账户,实际登录为"user@user.com" 影响范围 漏洞影响程度取决于: SP实现 : 使用宽松文本提取的库更易受攻击 对用户标识符有额外验证(如域名白名单)的SP受影响较小 IdP配置 : 允许自由注册的IdP风险更高 严格用户供应流程的IdP风险较低 防御措施 对于服务提供商(SP) 更新SAML处理库 : 确保使用正确处理XML注释的版本 测试NameID提取时包含注释的用例 规范化算法选择 : 使用 WithComments 变体保留注释(需IdP支持) 确保规范化算法标识符不被篡改 多因素认证 : 实施第二因素认证可降低风险 注意:如果IdP处理所有因素,漏洞可能绕过全部认证 对于SAML库开发者 正确文本提取 : 确保提取XML元素全部文本内容 添加包含注释的测试用例 规范化后处理 : 在签名验证后使用规范化文档进行文本提取 防止规范化引入的其他漏洞 对于XML库开发者 API行为改进 : 考虑修改文本提取API默认行为 提供明确的方法说明文档 标准完善 : 推动XML处理标准更加明确 对于Duo用户 升级Duo Network Gateway至1.2.10或更高版本。 漏洞披露时间线 Duo团队与CERT/CC合作协调披露: 漏洞发现与验证 联系受影响厂商 CVE分配与补丁开发 公开披露 总结 此SAML漏洞揭示了XML处理中的深层次问题,特别是规范化与文本提取的不一致性。防御需要多方协作,包括库开发者更新实现、服务提供商加强验证、以及标准组织的规范完善。通过全面理解漏洞原理,组织可以更好地保护其SAML实现免受此类攻击。