GitLab身份验证绕过 | CVE-2024-45409
字数 1653 2025-08-29 08:30:24
GitLab SAML身份验证绕过漏洞分析(CVE-2024-45409)
1. 漏洞概述
GitLab是一个广泛使用的开源仓库管理系统,支持SAML认证功能。该漏洞存在于Ruby-SAML库中,允许攻击者绕过SAML身份验证机制进行未经授权的访问。漏洞编号为CVE-2024-45409,影响GitLab的登录功能。
2. SAML认证基础
2.1 SAML简介
SAML(Security Assertion Markup Language)是一种基于XML的开放标准,用于在身份提供者(IdP)和服务提供商(SP)之间交换身份验证和授权数据。
2.2 SAML涉及实体
- Principal(主体): 通常代表用户/浏览器终端
- IdP(身份提供商): 负责进行身份认证,并将用户的认证信息和授权信息传递给SP
- SP(服务提供商): 验证用户的认证信息,并授权用户访问指定的资源信息
2.3 SAML认证流程
- 用户请求登录SP
- SP生成SAML请求,通过浏览器重定向发送给IdP
- IdP解析SAML请求并将用户重定向到认证页面
- 用户在认证页面完成登录
- IdP生成SAML Response,通过对浏览器重定向发送给SP,其中包含SAML Assertion用于确定用户身份
- SP对SAML Response的内容进行检验
- 检验通过后根据认证信息成功登录
3. SAML Response结构分析
3.1 关键组件
SAML Response中包含SAML Assertion,其中Signature标签是身份验证的核心:
<ds:Signature>
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="..."/>
<ds:SignatureMethod Algorithm="..."/>
<ds:Reference URI="#...">
<ds:Transforms>
<ds:Transform Algorithm="..."/>
</ds:Transforms>
<ds:DigestMethod Algorithm="..."/>
<ds:DigestValue>...</ds:DigestValue> <!-- 重要部分 -->
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>...</ds:SignatureValue> <!-- 重要部分 -->
</ds:Signature>
3.2 验证机制
SP接收到SAML Response后会进行两次验证:
-
签名验证:
- SP使用IdP的公钥验证SignedInfo块上的签名
- 对SignedInfo进行hash计算,并与公钥解密SignatureValue后的值进行对比
- 如果签名有效,则确认IdP已签署该消息,并且该消息未被修改
-
摘要验证:
- SP计算Assertion(删除Signature节点)的值,与DigestValue进行比较
- 如果相同则断言没有被篡改
4. 漏洞原理分析
4.1 XPath节点选择问题
GitLab使用Ruby-SAML库解析SAML Response时,通过//ds:DigestValue表达式获取DigestValue值。
XPath有三种节点选择方式:
/ds:DigestValue: 从根节点开始选择,直接指向第一个ds:DigestValue元素./ds:DigestValue: 从当前节点开始查找ds:DigestValue元素//ds:DigestValue: 从文档中的任何位置选择节点,包括所有嵌套节点中查找
4.2 漏洞利用方法
攻击者可以在SAML Response的最前面插入一个伪造的DigestValue节点:
- 修改Assertion部分(如NameID等)的内容
- 计算修改后的Assertion的哈希值作为新的DigestValue
- 将新的DigestValue插入到Response的最前面
- 保持Signature部分不变
当SP验证时:
- 签名验证:由于Signature未被修改,验证通过
- 摘要验证:SP通过
//ds:DigestValue获取到伪造的DigestValue,与修改后的Assertion哈希值匹配,验证通过
4.3 实际攻击示例
在原始数据中加入samlp:Extensions并将新的DigestValue值嵌入其中:
<samlp:Response>
<samlp:Extensions>
<ds:DigestValue>伪造的哈希值</ds:DigestValue>
</samlp:Extensions>
<!-- 原始Response内容 -->
</samlp:Response>
5. 漏洞利用工具
可以使用Nuclei模板进行漏洞利用:
https://cloud.projectdiscovery.io/?template=CVE-2024-45409&ref=blog.projectdiscovery.io
6. 修复方案
Ruby SAML在后续版本中将//ds:DigestValue改为./ds:DigestValue,修复了此漏洞。
修复提交参考:
https://github.com/SAML-Toolkits/ruby-saml/commit/1ec5392
7. 防御建议
- 及时更新GitLab和Ruby-SAML库到最新版本
- 实施严格的SAML配置审查
- 监控异常登录行为
- 考虑实施多因素认证作为额外保护层