git 已知问题 命令行调用 git 时可能存在环境变量投毒问题

核心代码非常简单,我只是使用 git add 命令而已

    var sourceFolder = @"C:\lindexi\Work\Source\";

            var processStartInfo = new ProcessStartInfo("git")
            {
                ArgumentList =
                {
                    "add",
                    "."
                },
                WorkingDirectory = sourceFolder,
            };

            Process.Start(processStartInfo)!.WaitForExit();

在 git 钩子里面调起进程的时候,会额外注入许多环境变量,比如 GIT_INDEX_FILE 和 GIT_DIR 等,这些环境变量是指定的是当前的 git 钩子所在的 git 仓库的

这就导致了我设置了 WorkingDirectory = sourceFolder 无效,直接导致 git add 内容到当前 git 钩子所在的仓库,而不是 sourceFolder 仓库

解决方法是清空环境变量,解决被 git 钩子投毒

            var processStartInfo = new ProcessStartInfo("git")
            {
                ArgumentList =
                {
                    "add",
                    "."
                },
                WorkingDirectory = sourceFolder,
            };
            // 这是在 git 里面调用的,会被注入 git 的环境变量,从而被投毒,如 GIT_INDEX_FILE GIT_DIR 等,导致加入的文件不是在要求的路径
            processStartInfo.Environment.Clear();

            Process.Start(processStartInfo)!.WaitForExit();

以上代码核心是使用 processStartInfo.Environment.Clear(); 清理所有传入到启动进程的环境变量

参考文档:

Git - Git 钩子

posted @ 2025-03-15 07:18  lindexi  阅读(43)  评论(0)    收藏  举报