SAML轮盘赌:黑客总能获胜 | PortSwigger安全研究

本文详细分析了如何通过链式往返攻击和命名空间混淆漏洞,利用ruby-saml库实现GitLab企业版的未授权管理员访问,揭示了SAML协议实现中的深层次安全隐患。

引言

本文将展示如何通过链式往返攻击和命名空间混淆漏洞,利用ruby-saml库实现GitLab企业版的未授权管理员访问。在研究中,GitHub独立发现并修补了相关漏洞,但其披露遗漏了关键技术细节,包括特定变异方式及非认证状态下的利用方法。

往返攻击基础

SAML库通常先解析XML文档并存储为字符串,后续使用时重新解析。Ruby-SAML采用两种不同解析器:REXML用于初始解析和签名验证,Nokogiri用于属性访问。若此过程发生变异,文档二次解析时可能产生不一致性。

Ruby SAML/REXML往返攻击

我们开发了专用测试平台来识别往返漏洞。研究发现,在SYSTEM标识符中引入变异可导致XML语法改变:单引号系统标识符被转换为双引号,但内部包含的双引号会改变XML注释处理逻辑,最终生成完全不同的节点。

GitLab权限提升

漏洞原理

GitLab依赖Ruby-SAML进行SAML认证。在往返攻击发生时,库会先验证SAMLResponse中的证书哈希值,但在签名验证阶段却基于内存中的XML格式转换。这使得攻击者可在不破坏签名验证的前提下任意修改验证字段。

突破XML模式限制

通过"命名空间混淆攻击",我们实现了对Ruby-SAML应用的未授权访问。该攻击利用两个XML解析器的命名空间处理差异:

  • REXML读取Signature元素
  • Nokogiri读取DigestValue

漏洞组合利用

在Ruby 3.4.2之前版本中,REXML对DOCTYPE声明中!ATTLIST字符串的截断处理存在缺陷。通过结合WS-Federation协议获取的签名XML文档,攻击者可完全绕过GitLab的SAML认证。

结论与缓解措施

该攻击揭示了XML解析差异导致的严重安全隐患。建议:

  1. 使用相同库进行XML解析和验证
  2. 避免对不可信数据进行序列化/反序列化操作 GitLab已在17.9.2/17.8.5/17.7.7版本中修复相关漏洞。
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计