在攻克 Hack The Box 平台的 Compiled 靶机过程中,我遇到了一个涉及 Git 和子模块的奇怪行为。深入调查后,我发现了研究员 Amal Murali 撰写的 这篇精彩文章,其中详细介绍了通过 .gitmodules 进行路径注入的技术。在此基础上,我决定研究 CVE-2024-32002 并创建一个能展示该漏洞实际影响的实用 PoC。
CVE-2024-32002 利用了 Git 中与子模块路径解析相关的严重缺陷。Git 允许仓库包含在 .gitmodules 文件中定义的子模块,并指定其路径和 URL。该漏洞出现在路径被操纵以指向 .git 目录内部时,.git 目录存储了仓库的元数据和内部配置。
通过结合以下操作:
.gitmodules 将路径设置为 A/modules/xa → .git…Git 会被欺骗,将 A/modules/x 解析为 .git/modules/x,即 位于内部 .git 目录内。这使得攻击者能够注入任意文件,例如恶意的钩子(hooks),这些钩子可在 checkout、merge 或 clone 等合法操作中执行。
该漏洞代表了一个远程代码执行向量,在 CI/CD 环境、自动化流程或共享仓库中尤为危险。
setup.sh 脚本演示了什么此脚本自动化创建了一个易受攻击的环境,并重现了该缺陷的影响:
hook-repo),其中包含一个 post-checkout 钩子,该钩子向 /tmp/teste.txt 写入内容。main-repo) 并添加该子模块。.gitmodules 文件,将子模块的路径重定向到 A/modules/x。a → .git,使 A/modules/x 被解析为 .git/modules/x。git update-index --index-info 将恶意的 .gitmodules 注入索引。--recursive 克隆该仓库(cloned-repo),初始化子模块。如果成功,钩子将被执行,并且文件 /tmp/teste.txt 将被创建,内容如下:
joao was here
本仓库包含一个 Dockerfile,它:
docker build -t git-cve-poc .
docker run --rm -it git-cve-poc
此漏洞影响早于 2.45.1 的 Git 版本。该缺陷已通过对子模块路径解析实施更严格的验证而得到修复。 使用子模块的仓库应进行审计,自动化环境应立即进行更新。
本项目仅用于教育和研究目的。请勿在生产环境中使用。旨在展示该漏洞的技术影响并推广良好的安全实践。
.git/hooks/ 并执行 git checkout HEAD 以触发漏洞。