恶意URL可能会导致Git将存储的凭据提供给错误的服务器

受影响的版本

<= 2.17.3、2.18.2、2.19.3、2.20.2、2.21.1、2.22.2、2.23.1、2.24.1、2.25.2、2.26.0

修补版本

2.17.4、2.18.3、2.19.4、2.20.3、2.21.2、2.22.3、2.23.2、2.24.2、2.25.3、2.26.1

CVE标识符

CVE-2020-5260

影响力

Git使用外部的“凭证帮助程序”来存储和检索操作系统提供的安全存储中的密码或其他凭证。包含编码换行符的特制URL可以将意想不到的值注入到凭据帮助程序协议流中,从而导致凭据帮助程序检索一个服务器(例如good.example.com)的密码,以向另一个服务器(例如evil.example.com)发出HTTP请求,结果将前者发送给后者的凭据。两者之间的关系没有任何限制,这意味着攻击者可以制作一个URL,该URL将向其选择的主机提供任何主机的存储凭据。

可以通过向发送恶意URL来触发此漏洞git clone。但是,受影响的URL看起来可疑。可能的媒介是通过自动克隆用户不可见的URL的系统(例如Git子模块)或围绕Git构建的打包系统。

补丁

该问题已在2020年4月14日发布的版本中修复,可追溯到v2.17.x。希望进一步回退更改的任何人都可以通过应用commit 9a6bbee来做到这一点(完整发行版包括对的额外检查git fsck,但该提交足以保护客户端免受漏洞攻击)。

解决方法

最完整的解决方法是完全禁用凭据助手:

git config --unset credential.helper
git config --global --unset credential.helper
git config --system --unset credential.helper

一种替代方法是避免恶意URL:

  • 检查馈入的URL的主机名和用户名部分git clone是否存在编码的换行符(%0a)或凭据协议注入的证据(例如host=github.com
  • 避免将子模块与不受信任的存储库一起使用(请勿使用clone --recurse-submodulesgit submodule update仅在检查在中找到的URL后使用.gitmodules
  • 避免使用可能git clone在不可信URL上运行的工具

功劳

此漏洞由Google Project Zero的Felix Wilhelm发现,并由GitHub的Jeff King修复。

参考文献

 

*来自:Github