CVE-2020-26233:GIT命令行工具远程代码执行漏洞分析
字数 1518 2025-08-15 21:33:28
CVE-2020-26233: Git命令行工具远程代码执行漏洞分析与防护指南
漏洞概述
CVE-2020-26233是一个影响Windows平台下GitHub CLI工具(gh)中Git凭证管理器核心(Git Credential Manager Core, GCM Core)的远程代码执行漏洞。该漏洞影响v2.0.280及之前所有版本,攻击者可利用此漏洞在供应链攻击中危害全球数百万软件开发人员。
受影响组件
- Git Credential Manager Core (GCM Core): Microsoft开发的Git凭证管理工具
- GitHub CLI工具(gh): GitHub官方命令行工具
- 平台: 仅影响Windows系统
漏洞背景
Windows系统的二进制文件搜索顺序存在安全隐患:系统会首先检查当前文件夹中是否存在目标可执行文件,只有在找不到时才会遍历%PATH%环境变量中的目录。
漏洞原理
原始问题
-
当Git克隆带有子模块的代码库时:
- 首先克隆代码库的顶层(根目录)
- 然后递归克隆子模块
- 此过程会从顶级目录启动新的Git进程
-
攻击者可利用此行为:
- 在代码库根目录放置名为git.exe的恶意程序
- 当Git凭证管理器核心尝试读取配置信息时,会调用此恶意二进制文件而非真正的git可执行文件
- 克隆过程看似正常,无任何异常迹象
安全补丁与绕过
-
初始修复:
- GitHub在gh v1.2.1中引入safeexec.LookPath函数
- 旨在阻止通过滥用Windows路径搜索顺序实现的远程代码执行
-
绕过方法:
- 在fork私有存储库时,克隆命令执行后不会通过safeexec.LookPath调用"git.exe config credential.namespace"
- Windows会回退到默认搜索顺序,在当前克隆存储库中查找git.exe
关键代码分析
-
漏洞位置:
// src/shared/Microsoft.Git.CredentialManager/CommandContext.cs var gitProcess = new GitProcess( Environment, workingDirectory, Environment.LocateExecutable("git.exe"), // 漏洞点 args); -
LocateExecutable函数:
// src/shared/Microsoft.Git.CredentialManager/EnvironmentBase.cs public string LocateExecutable(string program) { if (TryLocateExecutable(program, out string path)) { return path; } throw new Exception(...); } -
问题根源:
- 使用Windows的where.exe工具查找可执行文件
- where.exe会返回所有匹配项,包括当前目录中的文件
漏洞利用步骤
-
准备阶段:
- 创建新代码库或向现有代码库添加文件
- 上传Windows可执行文件(如calc.exe)并将其重命名为git.exe
-
攻击执行:
- 等待目标用户fork此代码库
- 目标用户执行:
gh repo fork REPOSITORY_NAME --clone - 恶意git.exe被执行,实现远程代码执行
-
实际效果:
- 示例中将calc.exe重命名为git.exe
- fork并克隆后,目标设备会弹出计算器程序
- 攻击者可替换为任意恶意代码
防护措施
-
官方修复:
- 升级Git Credential Manager Core至v2.0.300或更高版本
- 升级GitHub CLI工具(gh)至最新版本
-
临时缓解:
- 避免fork和克隆不受信任的代码库
- 在克隆前检查代码库根目录是否包含可疑的git.exe文件
- 确保系统PATH环境变量中Git路径优先级高于当前目录
-
系统配置:
- 修改Windows安全策略,限制从当前目录执行程序
- 确保Git安装目录在PATH环境变量中具有较高优先级
参考资源
- GitHub安全公告
- GitHub Desktop远程代码执行分析
- Windows可执行文件搜索顺序:
总结
CVE-2020-26233漏洞揭示了软件开发工具链中潜在的安全风险,特别是在Windows平台下。开发人员应及时更新相关工具,并提高对供应链攻击的警惕性,避免从不可信来源克隆代码库。