2018 年 5 月 Git 安全漏洞
发布于 作者: Eric L. Barnes
CVE 2018-11235 是 Git 中一个新的行业范围的安全漏洞,当用户在恶意存储库中操作时,会导致任意代码执行。 在公告中,Edward Thomson 描述了该漏洞
远程存储库可能包含一个子模块的定义,以及该子模块的存储库数据,作为文件夹检入到父存储库中。 递归克隆此存储库时,git 将首先将父存储库检出到工作目录,然后准备克隆子模块。 然后,它会意识到它不需要进行克隆 - 子模块的存储库已经在磁盘上存在; 因为它被检入到父级,所以它在检出时被写入工作目录。 因此,git 可以跳过获取步骤,而直接使用磁盘上的存储库检出子模块。
问题在于,当您
git clone
存储库时,您无法从服务器获得一些重要的配置。 这包括.git/config
文件的内容,以及钩子等内容,这些钩子是将在 git 工作流程中的特定点运行的脚本。 例如,post-checkout
钩子将在 git 将文件检出到工作目录中的任何时候运行。此配置不会从远程服务器克隆,因为这会导致一个危险的漏洞:远程服务器可以为您提供您将在计算机上执行的代码。
不幸的是,对于这种子模块配置漏洞来说,情况正是如此。 由于子模块的存储库已检入到父存储库中,因此它实际上从未被克隆过。 因此,子模块存储库实际上可能已经配置了钩子。 如果您在递归克隆时(并且这个存储库必须使用
--recursive
克隆才能使此漏洞显现出来)使用了这种精心制作的恶意父存储库,它将首先检出父级,然后读取子模块的检入存储库以将子模块写入工作目录,最后它将执行在子模块的检入存储库中配置的任何post-checkout
钩子。
建议每个人都升级他们的 Git 版本,Git 2.17.1 已经发布来解决这个问题,以及 Git for Windows 2.17.1 (2)。
感谢 SSXIO 的提示。