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 的漏洞奖励计划发现并报告了这个漏洞。