一场由Git引发的漏洞危机,影响到的将是社区上的全体开发者。

这里写图片描述

5月29日,微软Visual Studio Team Services项目经理Edward Thomson在DevOps博客中提到,Git社区最近发现Git存在的漏洞,允许黑客在用户的系统上远程执行任意代码。

这里写图片描述

目前,Git和各种提供Git存储库托管服务的公司开发人员已采取相关措施,以修复在Git源代码版本控制软件中的危险漏洞。

据了解,Git 2.17.1的客户端软件已经发布,该补丁修复了两个安全漏洞CVE-2018-11233和CVE-2018-11235。

Git漏洞产生于何处?

其中,CVE 2018-11235 被认为最危险的漏洞,它的一段代码允许恶意行为创建一个包含特殊Git子模块的格式错误的Git存储库。

这里写图片描述

在Edward Thomson的技术说明中这样阐述:

当用户在恶意代码库中操作时,他们可能会受到任意代码执行攻击。远程代码存储库包含子模块定义和数据,它们作为文件夹捆绑在一起并提交给父代码存储库。当这个代码仓库被来回复制时,Git最初会将父仓库放到工作目录中,然后准备复制子模块。

但是,Git 稍后会发现它不需要复制子模块,因为子模块之前已经提交给父存储库,它也被写入工作目录,这个子模块已经存在于磁盘上。 因此,Git 可以跳过抓取文件的步骤,并直接在磁盘上的工作目录中使用子模块。

正是子模块配置漏洞犯了这个错误,所以 Git 由子模块来设置漏洞。 子模块存储库提交给父存储库,并且从未实际复制过。子模块存储库中可能存在已配置的挂钩。 当用户再次出现时,恶意的父库会被精心设计。将写入工作目录,然后 Git读取子模块,将这些子模块写入工作目录,最后一步执行子模块存储库中的任何 Post-checkout 挂钩。

如何解决这一问题?

起先,发现该漏洞是一位名为Etienne Stalmans的人,他通过GitHub的bug奖励计划进行了报告。

随后,Thomson进行了补充说明,如果用户在他的博客上运行易受攻击的Git客户端便可进行检测。

具体如下:

这一问题的解决方案非常简单有效:现在,Git客户端可以更仔细地检查子模块的文件夹名称。它们必须位于.git存储库文件夹中,而不在实际的存储库工作目录中。

Git将拒绝与包含此类子模块配置的存储库一起运行。 Visual Studio Team Services以及其他多数托管提供商,将主动拒绝推送包含此类子模块配置的存储库,以帮助保护尚未升级的客户端。

GitHub的一名工作人员 Jeff King提到:“漏洞修复本身不难,但在Git推送操作期间的检测需要大量重构。”

他补充道,这其中还涉及很多项目。“我为Git编写了补丁,但其他人还在编写libgit2,JGit和VSTS”。

不过在最后,还是建议用户需更新自己的Git桌面或服务器客户端。

参考链接:

https://blogs.msdn.microsoft.com/devops/2018/05/29/announcing-the-may-2018-git-security-vulnerability/

Logo

20年前,《新程序员》创刊时,我们的心愿是全面关注程序员成长,中国将拥有新一代世界级的程序员。20年后的今天,我们有了新的使命:助力中国IT技术人成长,成就一亿技术人!

更多推荐