都来看看自己受影响没:Git 源代码版本软件存在远程代码执行漏洞

阅读量    55442 | 评论 1

分享到: QQ空间 新浪微博 微信 QQ facebook twitter

Git 开发人员以及多家提供 Git 库托管服务的公司推出补丁,修复了 Git 源代码版本软件中的一个危险漏洞。

这个修复方案在 Git 2.17.1 中推出,它修复了两个安全漏洞 CVE-2018-11233 和 CVE-2018-11235。

Git 缺陷导致任意代码执行

其中 CVE-2018-11235 最危险,因为它可导致恶意人员创建包含特殊构建的 Git 子模块的恶意 Git 库。

每当用户克隆这个库时,由于 Git 客户端处理这个恶意 Git 子模块方式的问题,均可导致攻击者在用户系统上执行代码。

刚刚推出的 Git 2.17.1 应该能够阻止这些命令在用户电脑上执行。

 Git 托管服务提供服务器端修复方案

不过补丁并非仅面向 Git 客户端,也包含Git 服务器端组件的修复方案。后者能让 Git 托管服务发现包含恶意子模块的代码库并阻止用户上传它们。

Git 托管服务如 GitHub 和微软(经由 Visual Studio Team Services)已经部署这些补丁以阻止攻击者滥用服务。

GitHub 的一名员工 Jeff King 指出,修复方案本身并不复杂,但在 Git 推送操作过程中进行检测需要进行大量重构。

King 表示,修复工作需要很多项目的支持,他表示他自己为 Git 本身写补丁,其他人涉及 libgit2、JGit 和 VSTS。

Visual Studio Team Services 的项目管理经理 Edward Thomson 更加详细地解释了 CVE-2018-11235 的技术细节。

他指出,“远程存储库可能包含对子模块的定义,并将该子模块的存储库数据捆绑在一起作为文件夹签入父存储库。当 Git 递归克隆这个存储库时,首先将父存储库签出到工作目录中,然后准备克隆子母扣。随后 git 意识到无需执行克隆,子模块的存储库已经存在于磁盘上;由于它被签入父存储库,因此在签出时被写入工作目录中。因此,git 能够跳过抓取并简单地使用磁盘上的存储库签出子模块。

问题在于,当克隆存储库时,无法从服务器中获得一些重要的配置,包括 .git/config 文件内容、钩子即在 git 工作流的某些点中运行的脚本等。例如,签出后的钩子会在 git 将文件签出到工作目录时运行。

这种配置无法从远程服务器中克隆,因为这么做会触发严重漏洞:远程服务器能够提供在电脑上执行的代码。

遗憾的是,这就是该子模块配置漏洞做的事情。由于子模块的存储库被签入父存储库,因此它从未得到真正的克隆。这个子模块存储库因此能够配置钩子。如果当你递归克隆这个精心构造的恶意父存储库时,它会首先签出父存储库,然后读取子模块的签入存储库以便将子模块写入工作目录中,最后它将执行任意配置在子模块签入存储库中的签出后钩子。”

研究员 Etienne Stalmans 通过 GitHub 的漏洞奖励计划发现并报告了这个漏洞。

Thomson 还在博客上提供了操作指南,供用户测试是否运行易受攻击的 Git 客户端。建议用户更新其 Git 桌面以及/或服务器端。

分享到: QQ空间 新浪微博 微信 QQ facebook twitter
|推荐阅读
|发表评论
|评论列表
加载更多