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认证流程

  1. 用户请求登录SP
  2. SP生成SAML请求,通过浏览器重定向发送给IdP
  3. IdP解析SAML请求并将用户重定向到认证页面
  4. 用户在认证页面完成登录
  5. IdP生成SAML Response,通过对浏览器重定向发送给SP,其中包含SAML Assertion用于确定用户身份
  6. SP对SAML Response的内容进行检验
  7. 检验通过后根据认证信息成功登录

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后会进行两次验证:

  1. 签名验证:

    • SP使用IdP的公钥验证SignedInfo块上的签名
    • 对SignedInfo进行hash计算,并与公钥解密SignatureValue后的值进行对比
    • 如果签名有效,则确认IdP已签署该消息,并且该消息未被修改
  2. 摘要验证:

    • SP计算Assertion(删除Signature节点)的值,与DigestValue进行比较
    • 如果相同则断言没有被篡改

4. 漏洞原理分析

4.1 XPath节点选择问题

GitLab使用Ruby-SAML库解析SAML Response时,通过//ds:DigestValue表达式获取DigestValue值。

XPath有三种节点选择方式:

  1. /ds:DigestValue: 从根节点开始选择,直接指向第一个ds:DigestValue元素
  2. ./ds:DigestValue: 从当前节点开始查找ds:DigestValue元素
  3. //ds:DigestValue: 从文档中的任何位置选择节点,包括所有嵌套节点中查找

4.2 漏洞利用方法

攻击者可以在SAML Response的最前面插入一个伪造的DigestValue节点:

  1. 修改Assertion部分(如NameID等)的内容
  2. 计算修改后的Assertion的哈希值作为新的DigestValue
  3. 将新的DigestValue插入到Response的最前面
  4. 保持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. 防御建议

  1. 及时更新GitLab和Ruby-SAML库到最新版本
  2. 实施严格的SAML配置审查
  3. 监控异常登录行为
  4. 考虑实施多因素认证作为额外保护层
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 标签是身份验证的核心: 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值嵌入其中: 5. 漏洞利用工具 可以使用Nuclei模板进行漏洞利用: 6. 修复方案 Ruby SAML在后续版本中将 //ds:DigestValue 改为 ./ds:DigestValue ,修复了此漏洞。 修复提交参考: 7. 防御建议 及时更新GitLab和Ruby-SAML库到最新版本 实施严格的SAML配置审查 监控异常登录行为 考虑实施多因素认证作为额外保护层