Gitlab CVE-2024-32002 命令执行漏洞分析与复现指南
一、漏洞概述
CVE-2024-32002 是 Git 子模块中的一个远程代码执行 (RCE) 漏洞,通过 Git 存储库的递归克隆可以触发恶意负载执行。该漏洞利用了 Git 子模块处理机制中的缺陷,结合符号链接和不区分大小写的文件系统特性实现攻击。
1.1 受影响的版本
以下 Git 版本存在此漏洞:
- 2.45.1 之前版本
- 2.44.1 之前版本
- 2.43.4 之前版本
- 2.42.2 之前版本
- 2.41.1 之前版本
- 2.40.2 之前版本
- 2.39.4 之前版本
1.2 漏洞利用要求
- 目标系统必须配置为支持符号链接
- 操作系统必须不区分大小写(如 macOS 或 Windows)
- 攻击者能够诱导受害者克隆恶意仓库
二、漏洞原理分析
2.1 Git 仓库结构
当使用 git init 或 git clone 命令创建或克隆 Git 仓库时,会在工作树的根目录下生成一个 .git 目录,其初始结构包含 hooks 目录。
2.2 Git 钩子机制
Git 钩子是可执行脚本,位于以下目录:
.git/hooks.git/modules/module_type/module_name/hooks
当 hooks 目录中的文件没有 .sample 后缀时,该文件中的命令将在特定 Git 操作(如 pre-commit、post-commit 和 post-checkout)之前或之后自动执行。
2.3 Git 子模块
Git 子模块是 Git 仓库内的一个记录,它引用外部仓库中的特定提交。当向仓库添加子模块时,会在 .gitmodules 文件中创建子模块的 URL 与本地目录之间的映射元数据。
2.4 符号链接机制
符号链接(symlink)是一个通过指定路径指向另一个文件或目录的特殊文件。Git 将符号链接视为存储其所引用文件或目录路径的特殊文件。当克隆或检出包含符号链接的仓库时,Git 会在本地文件系统中重新创建这些符号链接。
2.5 漏洞触发流程
- 攻击者创建一个包含恶意 post-checkout 钩子的仓库
- 创建另一个包含子模块的仓库,子模块路径中包含符号链接
- 符号链接指向
.git文件夹 - 当受害者使用
--recursive选项克隆恶意仓库时:- Git 首先下载主仓库文件和目录
- 利用符号链接在本地文件系统中重新创建符号链接
- 由于文件系统不区分大小写,符号链接被误解析
- 恶意 post-checkout 钩子被写入
.git/modules/目录 - 递归克隆子模块时触发钩子执行
三、漏洞复现
3.1 环境准备
需要准备以下仓库:
hulk.git- 主仓库submod.git- 子模块仓库smash.git- 包含恶意钩子的仓库
3.2 使用脚本复现
-
创建用户和必要的仓库:
git init --bare hulk.git git init --bare submod.git git init --bare smash.git -
修改 PoC 脚本中的仓库路径为上述远程仓库地址
-
执行 PoC 脚本,设置恶意负载(默认为打开 macOS 计算器)
-
受害者执行:
git clone --recursive <恶意仓库URL>
3.3 手动攻击步骤
-
创建两个仓库:
git init --bare hook.git git init --bare captain.git -
在 hook 仓库中创建符号链接:
ln -s .git a -
设置恶意 post-checkout 钩子(如 PowerShell 反弹 shell 命令)
-
将修改推送到远程仓库:
git add . git commit -m "malicious commit" git push -
当受害者克隆仓库时触发漏洞
四、漏洞修复方案
4.1 主要修复措施
将 Git 软件更新至以下修复版本之一:
- 2.45.1
- 2.44.1
- 2.43.4
- 2.42.2
- 2.41.1
- 2.40.2
- 2.39.4
4.2 临时缓解措施
通过禁用 Git 的符号链接支持来缓解此漏洞:
git config --global core.symlinks false
4.3 关键补丁分析
补丁主要修改了 submodule--helper.c 文件,添加了以下安全措施:
- 添加
dir_contains_only_dotgit函数,确保子模块目录不包含任何.git文件或目录 - 修改
clone_submodule()函数,添加检查子模块目录是否存在且为空的条件,若非空则中止克隆过程
五、防御建议
- 及时更新 Git 到最新安全版本
- 谨慎克隆来源不明的 Git 仓库,特别是使用
--recursive选项时 - 在安全要求高的环境中禁用符号链接支持
- 定期审计 Git 钩子脚本
- 使用区分大小写的文件系统可降低此类攻击风险
六、参考资源
- Git 官方安全公告
- CVE-2024-32002 漏洞详情
- Git 源代码补丁分析
通过深入理解此漏洞的原理和利用方式,安全人员可以更好地防御类似攻击,同时开发人员也能意识到在代码中正确处理符号链接和子模块的重要性。