大家好,我是程序员牛肉。
就在两个月前,git被爆严重漏洞,编号为CVE-2024-32002。这个漏洞使得恶意用户可以在目标用户使用git克隆项目的时候执行恶意代码,是一个较为严重的RCE漏洞。
[RCE漏洞通常指的是远程命令执行(Remote Command Execution)或远程代码执行(Remote Code Execution)漏洞的简称。这类漏洞允许攻击者在目标服务器上执行任意命令或代码,从而可能获取服务器的控制权,造成数据泄露、服务中断等安全问题。]
在Github上有人复现出了这个漏洞,项目地址为:
https://github.com/amalmurali47/git_rce?tab=readme-ov-file
在这个复现漏洞的项目中,如果我们以管理员身份尝试克隆这个项目,在复制项目的过程中,我们的计算器就会被自动打开。
git clone --recursive git@github.com:amalmurali47/git_rce.git
并且无论是Windows还是Mac都纷纷中招。
基于这个漏洞,它可以很轻易的打开你的计算器。那如果是一些恶意行为,比如启动一个流氓软件或者清空你的电脑文件呢?
光知道这个漏洞或许不够,让我们来深入了解一下造成这个漏洞的原因。
在git的内部有一个Hook机制,相当于是一些自动执行的脚本,这个机制的存在使得Git可以自动化的执行一些脚本,使得git更加的高效化。以我们常用的客户端Git举例,常用的Hook就有:
我们可以在自己本地git管理的项目下.git/hooks 目录下找到这些脚本:
而在正常的情况下,这些Hook由于比较敏感,都是交由本地的git自己去维护的。如果我们有特殊的需求,也需要自己编写hook脚本之后手动放到这个目录下。
当我们尝试拉取一个远端项目的时候,我们并不会拉取这个远端项目中.git目录下的hook脚本,而是由我们本地的git自己生成hook脚本,以此防止恶意hook的执行。
可是本次的漏洞发现者却发现了一种方式将恶意hook脚本写到.git的hooks目录下,使得其被自动执行。我们继续往下看。
项目与项目之间可以嵌套,比如A项目下可以包含一个B项目。使用git尝试拉取这种嵌套项目的时候,主项目下会有一个叫做.gitmodules的文件去记录这个主项目包含的其他子项目的信息。
在这个父项目中,子项目会被存放到A/modules/x下。而子项目也是有自己的.git文件的,子项目的.git一般都会存放在主项目的.git/modules文件夹下面。
前置知识说完了,我们接下来可以正式的解析这个漏洞的成因了。先看看这两个仓库:
这是父项目:
这是子项目:
已经初见端倪了:这个子项目中有一个Hook脚本是打开计算器。
现在的重点就在于:作者是如何把这个hook写到主项目的.git目录下的,不是说.git文件是git客户端自己管理的吗?
在父项目中,有一个符号链接文件,文件名是 a ,指向的是 .git 。
还记得我们之前说的:子项目会被放到A/modules/x下吗?而Windows和Mac对大小写是不敏感的,这就导致在父项目拉取子项目的时候 a 被当作了 A 。而 a又是一个符号链接文件,指向了.git。
这就导致我们的子项目实际上是被存放到.git/modules/x下了。而不幸的是.git/modules恰恰是父项目存储子项目hook脚本的位置。通过这种方式,我们就把一个自定义脚本写入了.git文件中。
让我们回顾一下本次的模拟攻击是如何进行的:
总结下来,这次Git被爆出的REC漏洞主要有两个成因:
而受到本次REC漏洞波及的git版本还是比较多的,git官方在github上也宣布了受到相关影响的版本:
快看看你的git版本在本次受影响的版本当中吗?如果有的话就尽快升级吧!
如果因为一些原因暂时不可以升级自身的git版本的话,我们也可以尝试在git客户端中禁用符号链接。
除此之外,最近搜狗输入法也被爆出了一个漏洞:可以搞近源攻击,在window锁屏状态下调用cmd窗口修改密码强制进入系统。感兴趣的话可以评论区留言,我来介绍介绍这个漏洞。