Git 源代码版本软件存在远程代码执行漏洞

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

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

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

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

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

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

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

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

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

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

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

您可能还会对下面的文章感兴趣: