引言
本文将展示如何通过链式往返攻击和命名空间混淆漏洞,利用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解析差异导致的严重安全隐患。建议:
- 使用相同库进行XML解析和验证
- 避免对不可信数据进行序列化/反序列化操作 GitLab已在17.9.2/17.8.5/17.7.7版本中修复相关漏洞。