漏洞名称
:
Git符号链接代码执行漏洞
组件名称
: Git
威胁等级
:
高
危
影响范围
:
2.14.2<=Git<=2.14.6,
2.15.0<=Git<=2.15.4,
2.16.0<=Git<=2.16.6,
2.17.0<=Git<2.17.6,
2.18.0<=Git<2.18.5,
2.19.0<=Git<2.19.6,
2.20.0<=Git<2.20.5,
2.21.0<=Git<2.21.4,
2.22.0<=Git<2.22.5,
2.23.0<=Git<2.23.4,
2.24.0<=Git<2.24.4,
2.25.0<=Git<2.25.5,
2.26.0<=Git<2.26.3,
2.27.0<=Git<2.27.1,
2.28.0<=Git<2.28.1,
2.29.0<=Git<2.29.3,
2.30.0<=Git<2.30.2。
漏洞类型
:
远程代码执行
利用条件
: 1、用户认证:不需要用户认证
2、前置条件:用户执行git clone操作
3、触发方式:远程
造成后果
: 受影响版本的Git仓库中如果包含符号链接文件,可能会导致在不区分大小写的文件系统克隆时执行刚刚切换分支的脚本。攻击者利用此漏洞可以执行任意代码。
Git 是一个开源的分布式版本控制系统。是 Linus Torvalds 开发的一个开放源码的版本控制软件,采用了分布式版本库的方式。可以有效、高速地处理从很小到非常大的项目。
2021年3月10日,深信服安全团队监测到一则Git组件存在代码执行漏洞的信息,漏洞编号:CVE-2021-21300,漏洞危害:高危。该漏洞是由于Git对符号链接文件的处理不严密,攻击者可利用该漏洞在未授权的情况下,创建恶意git仓库对克隆此仓库的用户进行远程代码执行攻击。
在区分大小写的文件系统中,创建的仓库可以同时存在两个仅大小写不同的目录或文件,如:
此状态可以被正常的保存在区分大小写的系统中,但是当一个基于不区分大小写的文件系统的客户端试图克隆此存储库时,由于需要获取区分大小写的文件,会在磁盘上更改文件类型,使缓存处于无效状态。一般来说,如果以索引顺序checkout不会产生问题。
但是在Git使用Git LFS帮助处理大文件时,出于存储效率的需要开启status=delayed选项以推迟某些项目的checkout行为,从而导致修改了checkout 的顺序。
这时仓库中同时存在目录和符号链接,当目录被符号链接替换时,会根据符号链接的指向将文件指向错误的位置,甚至可能是仓库以外的路径,从而可以导致代码执行。
补丁检测了Git在--always-delay模式下工作的情况。处理命令时,若存在路径则将变量requested和count置为1,一旦存在删除目录就会重置lmdir缓存,避免软连接文件在随后被checkout到非法位置而执行。
搭建Git组件2.26.1版本环境,复现该漏洞,效果如下:
该结果表明网上的PoC有效且存在造成RCE的可能。
Git可以运行在几乎所有计算机平台上,由于其分布式,跨平台和开源的特点被广泛使用,成为最流行的版本控制工具之一。有多种代码托管平台基于Git开发。可能受漏洞影响的资产广泛分布于世界各地。此漏洞涉及的版本多,用户量大,但是需要用户主动克隆被精心构造的仓库,因此漏洞影响力总体较大。
目前受影响的Git版本:
2.14.2<=Git<=2.14.6,
2.15.0<=Git<=2.15.4,
2.16.0<=Git<=2.16.6,
2.17.0<=Git<2.17.6,
2.18.0<=Git<2.18.5,
2.19.0<=Git<2.19.6,
2.20.0<=Git<2.20.5,
2.21.0<=Git<2.21.4,
2.22.0<=Git<2.22.5,
2.23.0<=Git<2.23.4,
2.24.0<=Git<2.24.4,
2.25.0<=Git<2.25.5,
2.26.0<=Git<2.26.3,
2.27.0<=Git<2.27.1,
2.28.0<=Git<2.28.1,
2.29.0<=Git<2.29.3,
2.30.0<=Git<2.30.2。
使用Git Bash 执行:
git version
回显内容即为Git的版本,若属于受影响版本则存在漏洞。
当前官方已发布最新版本,建议受影响的用户及时更新升级到最新版本。链接如下:
https://mirrors.edge.kernel.org/pub/software/scm/git/
详细更新版本方法:
Windows平台:
Git Bash输入
git update-git-for-windows
或使用控制面板->添加删除程序进行卸载后,访问https://git-scm.com/downloads下载最新版本。
Linux平台:
使用以下命令完成git的源码安装(以2.30.2版本为例)
sudo apt-get purge git
sudo apt-get install curl curl-devel zlib-devel openssl-devel perl cpio expat-devel gettex-devel autoconf
git clone https://github.com/git/git.git
(若此步因网络原因报错,可尝试从
https://mirrors.edge.kernel.org/pub/software/scm/git/ 下载所需的安全版本。)
tar -zxvf git-2.30.2.tar.gz
cd git-2.30.2
autoconf
./configure
make
make install
最后执行git --version查看版本。