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%环境变量中的目录。

漏洞原理

原始问题

  1. 当Git克隆带有子模块的代码库时:

    • 首先克隆代码库的顶层(根目录)
    • 然后递归克隆子模块
    • 此过程会从顶级目录启动新的Git进程
  2. 攻击者可利用此行为:

    • 在代码库根目录放置名为git.exe的恶意程序
    • 当Git凭证管理器核心尝试读取配置信息时,会调用此恶意二进制文件而非真正的git可执行文件
    • 克隆过程看似正常,无任何异常迹象

安全补丁与绕过

  1. 初始修复:

    • GitHub在gh v1.2.1中引入safeexec.LookPath函数
    • 旨在阻止通过滥用Windows路径搜索顺序实现的远程代码执行
  2. 绕过方法:

    • 在fork私有存储库时,克隆命令执行后不会通过safeexec.LookPath调用"git.exe config credential.namespace"
    • Windows会回退到默认搜索顺序,在当前克隆存储库中查找git.exe

关键代码分析

  1. 漏洞位置:

    // src/shared/Microsoft.Git.CredentialManager/CommandContext.cs
    var gitProcess = new GitProcess(
        Environment,
        workingDirectory,
        Environment.LocateExecutable("git.exe"),  // 漏洞点
        args);
    
  2. LocateExecutable函数:

    // src/shared/Microsoft.Git.CredentialManager/EnvironmentBase.cs
    public string LocateExecutable(string program)
    {
        if (TryLocateExecutable(program, out string path))
        {
            return path;
        }
        throw new Exception(...);
    }
    
  3. 问题根源:

    • 使用Windows的where.exe工具查找可执行文件
    • where.exe会返回所有匹配项,包括当前目录中的文件

漏洞利用步骤

  1. 准备阶段:

    • 创建新代码库或向现有代码库添加文件
    • 上传Windows可执行文件(如calc.exe)并将其重命名为git.exe
  2. 攻击执行:

    • 等待目标用户fork此代码库
    • 目标用户执行: gh repo fork REPOSITORY_NAME --clone
    • 恶意git.exe被执行,实现远程代码执行
  3. 实际效果:

    • 示例中将calc.exe重命名为git.exe
    • fork并克隆后,目标设备会弹出计算器程序
    • 攻击者可替换为任意恶意代码

防护措施

  1. 官方修复:

    • 升级Git Credential Manager Core至v2.0.300或更高版本
    • 升级GitHub CLI工具(gh)至最新版本
  2. 临时缓解:

    • 避免fork和克隆不受信任的代码库
    • 在克隆前检查代码库根目录是否包含可疑的git.exe文件
    • 确保系统PATH环境变量中Git路径优先级高于当前目录
  3. 系统配置:

    • 修改Windows安全策略,限制从当前目录执行程序
    • 确保Git安装目录在PATH环境变量中具有较高优先级

参考资源

  1. GitHub安全公告
  2. GitHub Desktop远程代码执行分析
  3. Windows可执行文件搜索顺序:

总结

CVE-2020-26233漏洞揭示了软件开发工具链中潜在的安全风险,特别是在Windows平台下。开发人员应及时更新相关工具,并提高对供应链攻击的警惕性,避免从不可信来源克隆代码库。

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 关键代码分析 漏洞位置 : LocateExecutable函数 : 问题根源 : 使用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可执行文件搜索顺序: Superuser讨论 Stack Overflow讨论 总结 CVE-2020-26233漏洞揭示了软件开发工具链中潜在的安全风险,特别是在Windows平台下。开发人员应及时更新相关工具,并提高对供应链攻击的警惕性,避免从不可信来源克隆代码库。