引言
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验证器:
|
|
YAML解析器差异利用
通过YAML解析器在Ruby和Go实现中的差异实现验证绕过:
- Ruby的YAML库会处理
!binary标签并进行base64解码 - Go的yaml.v3库会直接忽略
!binary标签
|
|
任意文件写入
在devfile二进制文件的解压函数中发现路径遍历漏洞:
|
|
filepath.Clean无法阻止相对路径的路径遍历:
|
|
漏洞利用链
- 部署恶意devfile注册表,包含利用路径遍历的.tar文件
- 制作特殊.devfile.yaml,利用YAML解析差异指向恶意注册表
- 触发Workspace创建,执行任意文件写入
环境配置
- GitLab 16.8.0及以下版本
- 正确配置Workspaces功能
- 开发者权限访问GitLab
利用步骤
-
构建恶意注册表:
- 在
stacks/nodejs/2.2.1/archive.tar位置放置恶意tar文件 - 使用evilarc.py创建包含路径遍历的存档
- 在
-
制作恶意.devfile.yaml:
|
|
- 权限提升:
- 覆盖
/var/opt/gitlab/.ssh/authorized_keys文件 - 添加无限制SSH密钥
- 通过GitLab Rails控制台重置root用户密码
- 覆盖
结论
CVE-2024-0402展示了复杂的漏洞链利用,从YAML解析差异到路径遍历最终实现任意文件写入。尽管配置环境存在挑战,但成功构建了完整的PoC证明漏洞的可利用性。
资源
- Devfile安全技术笔记
- 自定义devfile注册表构建指南