CVE-2024-32002--git_rce
漏洞简介
下面是cve 平台上的简介
git 是一个版本控制系统。在版本 2.45.1、2.44.1、2.43.4、2.42.2、2.41.1、2.40.2 和 2.39.4 之前,带有子模块的存储库可以利用 Git 中的错误来构建,从而可以欺骗它不将文件写入子模块的工作树,而是写入“.git/”目录。这允许编写一个钩子,该钩子将在克隆操作仍在运行时执行,使用户没有机会检查正在执行的代码。此问题已在版本 2.45.1、2.44.1、2.43.4、2.42.2、2.41.1、2.40.2 和 2.39.4 中修复。如果在 Git 中禁用了符号链接支持(例如通过“git config –global core.symlinks false”),则所述攻击将不起作用。与往常一样,最好避免从不受信任的来源克隆存储库。
总结的来说
子模块准备了一个hook(钩子),利用符号链接,将这个hook 存放到了主项目下的
.git
目录中,然后在克隆的时候被执行
利用条件
版本需要在
v2.45.0
v2.44.0
<=v2.43.3
≤=V2.42.1
v2.41.0
<=V2需要管理员git clone
需要参数
--recursive
漏洞提要
.git 目录
该目录是git 自己在维护,并且使用push 操作的时候.git 并不会被上传到远程仓库,clone 的时候也是只有项目原本的内容
所以当clone 一个项目的时候一般情况下把并不会被执行恶意的脚本
git-hook
git 拥有两组hook:client-side 和server-side
client-side 的钩子当使用committing 和 merging 的时候被触发
server-side 的钩子在使用网络操作的时候被触发,比如push
git hook 所在的位置:
hook 脚本都是一个shell script,里面会有一些perl 并且如果要自己实现一个hook 你可以使用任何语言,比如(ruby 或者python ),这些示例都是 使用.sample
作为结尾
如果需要启动启动一个hook
可以将使用的hook 放入到hooks/文件目录下,并且是一个可以执行的无后缀的文件名
常见可客户端钩子
pre-commit:在提交之前运行。可以用来检查代码格式、运行单元测试等。
prepare-commit-.msg:在提交信息编辑器打开之前运行。可以用来自动生成提交消息模板。
commit-msg:在提交信息编辑器关闭之后运行。可以用来验证提交消息的格式。
post-commit:在提交完成之后运行。可l以用来发送通知或执行其他后续任务。
pre-rebase:在变基操作之前运行。可以用来检查变基前的状态。
post-checkout:在git checkout命令执行之后运行。可以用来设置特定文件的状态
post-merge:在合并操作完成之后运行。可以用来重新编译项目或执行其他合并后的任务。
子模块
通俗点说,可以理解为第三方库或者是父项目的库
一般引入第三方库的方式有,直接将源代码clone 下来放入到自己的项目中,但是该方式,如果上游修改了库,我们就不能及时的获取到最新的提交。这个时候就可以使用子模块的方式,将引入的第三方库作为子项目,并且该项目支持独立的提交
使用子模块:
1 |
|
制作一个父项目作为子模块
创建一个文件
使用vscode 推到远程仓库
创建一个子模块
现在可以尝试看看文件目录
对比一下最开始的
可以发现子模块的所有的东西都在modules 中,并且子模块里面也拥有hooks 模块
当添加了一个子模块的时候,原本的项目就会添加一个新的文件.gitmodules
其中path 指定了子模块存放的位置,url 指定了 子模块的仓库地址
当我们使用--recursive
的时候,就会主动拉取子模块
并不仅仅原项目拥有一个.git 子模块他也会有,git 不过该.git是一个文件,而不是一个目录
该文件里面记录了真正的.git 所在的地方
符号链接
可以理解为就是一个快捷方式
漏洞成因
一般情况下.git 目录中是git 自己在管理,里面没有项目内容,所以一般情况下是不会执行恶意的hook 脚本
但是该漏洞就是利用了weindows/mac 大小写不敏感,利用符号链接,将子模块中的hooks 放到了.git 目录中
这个hooks 是恶意伪造的项目结构