【问题标题】:Fatal error "unsafe repository ('/home/repon' is owned by someone else)"致命错误“不安全的存储库('/home/repon' 由其他人拥有)”
【发布时间】:2022-06-13 06:53:37
【问题描述】:

我发现来自 Apache 2 的错误日志是致命的:

不安全的存储库('/home/repon' 归其他人所有)

发生这种情况是因为我在 PHP 代码中有 git rev-parse --symbolic-full-name --abbrev-ref HEAD',看起来 new Git safety change 不再允许 www-data 运行此 Git 命令。

git config --global --add safe.directory /homerepon 不起作用。有没有办法解决这个问题?

Git 版本:2.35.3

PHP 版本:7.4

Apache 2 版本:2.4.41

【问题讨论】:

  • 这与Q1Q2密切相关;在那里查看问题和所有答案。
  • 另外,为了做出明智的决定,请阅读您在问题中引用的 URL,并研究它引用的部分的 git 文档。由于最近引入了不容易陷入安全问题的限制,您只是遇到了配置问题。

标签: git cve-2022-24765


【解决方案1】:

随着 Git 2.35.2 安全更新的发布开始出现,该更新修复了 here 中描述的漏洞。致谢@Juan-Kabbali

这里有四种可能的解决方案:

  • 信任 Git 目录(如果您知道目录内容是安全的,就这样做)
git config --global --add safe.directory /home/repon

这会将safe 组添加到文件~/.gitconfig,如下例所示:

[safe]
    directory = /home/repon
  • 以正确的用户身份运行命令,例如:
sudo -u ubuntu -- git status

注意:这需要用户 www-data 以用户 ubuntu 的身份执行 Git 命令(假设 ubuntu 是存储库所有者)。为此,您需要在 /etc/sudoers.d/ 中添加一个新文件,其内容如下:

www-data ALL=(ubuntu) NOPASSWD: /usr/bin/git

这可能会涉及安全问题,因此请先咨询您的安全人员。

  • 将 Git 存储库所有者更改为 www-data
sudo chown -R www-data:www-data /home/repon
  • 将 Git 降级为临时解决方案。例如,在 Ubuntu 中:
apt install git-man=1:2.17.0-1ubuntu1 git=1:2.17.0-1ubuntu1

注意:至少在 Windows 上,可弹出驱动器上的所有 Git 存储库似乎都被认为是不安全的,并且更改所有权似乎不起作用。

【讨论】:

  • 我不得不跑sudo git config --global --add safe.directory /home/repon
  • 这是一个非常糟糕的错误消息。我希望它会告诉我,这是谁拥有的,以及 git 认为它应该被谁拥有。现在看来,这完全是一个错误,因为据我所知,该消息是错误的,它归其他人所有。 (窗口)
【解决方案2】:

对于 Windows,我必须执行以下操作:

  1. 右击发生错误的Git仓库文件夹

  2. 选择安全选项卡,然后选择“高级”(左图:按“Erweitert”)

  3. 在新打开的窗口顶部检查所有者属性(右图:“Besitzer”)并进行调整(右图:按“Ändern”)。这必须是您的工作 Windows 帐户

  4. OK并等待权限设置完毕,然后Git错误消息应该是历史记录

如果您之后移动或重命名目录,此解决方案也有效。在我看来,你应该更喜欢这个解决方案

git config --global --add safe.directory <repo-path>

每次更改目录名称时都必须这样做。也可以在

中手动适配.gitconfig文件
C:\Users\<username>\.gitconfig

一旦您添加到安全列表中。

【讨论】:

  • 这个解决方案对我有用,因为存储库文件夹归另一个用户所有。
  • 这修复了我的一些本地存储库。它们归一个用户组所有。我不需要更改任何 git 配置。
  • 这应该是 Windows 上的实际解决方案。
  • 虽然这可行,但这并不理想。对我来说,这些存储库归管理员所有,而不是特定帐户(但它是管理员)。此外,我是这台 PC 上唯一的真正用户。我有将近一百个 repos,手动更改每个都非常繁琐。
  • 在我的案例中,在重新格式化和重新安装 Windows 后于 2021 年恢复的文件夹不再属于我的用户帐户。显然检查所有权是 GIT 2.35.2.windows.1 版本的一项新功能。恢复后创建的项目继续正常工作。收回项目文件夹顶层的所有权并包括“子容器和对象”处理了它。处理它需要一两分钟,但它只是一次。
【解决方案3】:

这是因为 Git 安全更新。

要让 Git 信任任何目录,您可以在 PowerShell 中运行它:

git config --global --add safe.directory *

Bash 中,您应该转义* 以避免扩展:

git config --global --add safe.directory '*'

仅在 Git 2.36 中添加了对 * 的支持,如 Highlights from Git 2.36genonymous in the comments 所述。

如果你只信任一个目录,你可以运行这个命令

git config --global --add safe.directory your-directory

【讨论】:

  • 因为CVE-2022-24765安全漏洞
  • 这是有道理的,因为这是 git 本身所说的,但运行命令会出错:error: wrong number of arguments, should be 2
  • @StevenGann 确保在最后提供目录参数。
  • @StevenGann 另外,Git 2.36 支持 *,因此您可能需要更新它。
  • 在 bash 中你可能想用 '*' 转义 * 否则它只会扩展到当前目录中的文件?
【解决方案4】:

以前的答案中没有一个解决方案对我有用,但更改存储库的所有权确实有效。我正在运行Ubuntu 20.04.4 (Focal Fossa) LTS,我运行了以下命令:

sudo chown -R username:group directory

【讨论】:

    【解决方案5】:

    我遇到了类似的问题 - 使用 Git 的 Web 应用程序无法访问存储库。

    运行建议的命令 (git config --global --add safe.directory /repo/path) 也不起作用,因为我以“我”而不是“www-data”用户的身份运行它。

    解决方案实际上非常简单 - 我在 /var/www 目录(在我的情况下是 www-data 用户的主页)中创建了 .gitconfig 文件并放入

    [safe]
            directory = /repo/path
    

    那里。

    【讨论】:

    • 这应该是在 ubuntu 上运行 nginx 的人的明确答案。请注意,您还应该通过执行 sudo chown www-data .gitconfig 确保 /var/www/.gitconfig 的所有权是 www-data
    【解决方案6】:

    我可能说的很明显,但我认为值得一提的是,运行git config --global --add safe.directory /home/repon 需要为 www-data 用户完成。

    问题1:www-data的HOME目录是/var/www,所以有一个.gitconfig文件可能会有安全风险(泄露服务器路径和配置)。

    问题 2:使用 Apache/Ubuntu 20.04 (Focal Fossa),默认情况下未定义 HOME 环境变量(/etc/apache2/envvars 取消设置它),因此配置没有被拾取(git config --global 失败,致命: $HOME 未设置)。

    我设法通过将存储库添加到 Git 的系统配置来解决问题,即git config --system --add safe.directory /home/repon

    【讨论】:

      【解决方案7】:

      作为自动化的一部分,我们的场景涉及多次调用一个脚本,而我们事先并不知道工作区。

      因此,在我们的例子中,git config --global --add safe.directory *~/.gitconfig 中创建了多个条目。

      git config --global --replace-all safe.directory '*' 帮助我们确保没有重复条目。

      【讨论】:

        【解决方案8】:

        除了用于 Windows 的 Huber Thomas's answer 外,我还必须使用 PowerShellCMD,因为我在源代码控制管理文件夹中有一堆文件,我从一个位置移动到另一个位置。 TAKEOWN 命令处理得很好(如果有点慢)。

        1. 以自己的身份打开 CMD(您无需成为管理员)
        2. 导航到存储库文件夹(如果有多个,则导航到父文件夹)
        3. 运行takeown /f . /r /d Y

        这将递归处理您当前文件夹中的所有文件夹,并将所有权设置为登录用户(可能是您)。

        【讨论】:

        • 是的,TAKEOWN,不是 TAKEDOWN...
        • 呃,感谢您抓住并修复了 Peter。
        【解决方案9】:

        除了接受的答案之外,对于那些在 Windows 下得到 "error: wrong number of arguments, should be 2" 的人,在提供目录参数时使用双引号而不是单引号.

        例如:

        git config --global --add safe.directory "D:/Source/Repos/SampleProject"
        

        【讨论】:

          【解决方案10】:

          我遇到了类似的问题,Phabricator 无法显示我的存储库的内容(git log 失败,原因与您的相同)。

          我无法确定哪个用户正在运行git 命令,因此我无法找到合适的解决方案,直到我意识到我可以为所有用户编辑/创建一个全局 Git 配置文件。

          我创建了文件:

          sudo vi /etc/gitconfig`
          

          把这个放进去:

          [safe]
                  directory = /home/opt/phabricator_repo/1
                  directory = /home/opt/phabricator_repo/4
                  directory = /home/opt/phabricator_repo/5
          

          操作系统:Ubuntu 20.04(Focal Fossa)

          【讨论】:

            【解决方案11】:

            如果您拥有该目录的其他用户,则会发生这种情况。例如,您的 Git 存储库位于 www-data 拥有的 /var/www 中。现在,当您登录/使用非 sudo 用户帐户并转到 /var/www 执行 Git 操作,例如

            git branch
            

            您将收到此错误,因此请确保您具有适当的目录权限。您可以通过运行chown 更改目录所有权或将当前用户添加到目录所有者所属的组中。

            【讨论】:

              【解决方案12】:

              如果您在 Linux 上并且更喜欢明确的允许列表,您可以通过编辑 Git 配置手动实现它(例如,使用 nanoVim)。只需将文件夹许可列表放入配置文件的[safe] 部分即可:

              nano ~/.gitconfig

              这是一个准备允许列表的 Python 脚本:

              from glob import glob
              
              def println(my_list):
                  print("\n".join(map(str, my_list)))
              
              git_folders_list = sorted(glob("~/git/*", recursive=True))
              
              println(["directory = " + d for d in git_folders_list])
              

              【讨论】:

                【解决方案13】:

                我在 Windows 上使用 Sublime Text Merge 时遇到了这个问题。我试图应用这里提到的一些解决方案,但它们没有奏效,所以我说:

                如果问题出在文件夹我必须创建一个新文件夹,所以复制并粘贴项目文件夹,删除旧文件夹,用旧名称重命名副本,就是这样!

                我想这也应该在 Linux 上工作,并且在制作项目文件夹的副本时,它是由正确的所有者创建的。

                【讨论】:

                  【解决方案14】:

                  更改顶级目录的所有者修复了它。

                  在本地 Ubuntu LAMP 堆栈上运行 Laravel,我的设置包括命令:

                  sudo chown -R www-data /var/www/dirname

                  但是由于 www-data 拥有 dirname,Git 给出了上述错误。要修复它,我只需要更改顶级 dirname 的所有者和 .git 目录:

                  sudo chown myUserName /var/www/dirname

                  sudo chown -R myUserName /var/www/dirname/.git

                  【讨论】:

                    【解决方案15】:
                    sudo chown -R [username]:[group directory]
                    

                    这真的对我有用 (MacBook Air M1)。

                    【讨论】:

                      【解决方案16】:

                      这真是令人沮丧。

                      添加到 gitconfig 是可行的,但谁愿意看似对每个目录都这样做?!疯了!

                      对我来说,答案是:→ 不要使用 sudo!

                      在许多情况下,使用 sudo 并没有什么坏处,如果您在用户可以触摸的事物和需要更多访问权限的事物之间移动,这可能是一种习惯。

                      如果我的用户创建了一个存储库,然后我使用了“sudo git...”,我得到了错误。我还有一个别名中的“sudo git ...”部分,所以我什至不明显地使用它。

                      【讨论】:

                        【解决方案17】:

                        就 Windows 中的 sourcetree 使用 this answer,我不得不从命令行以管理员身份运行 takeown。

                        我还需要使用 DIR /Q 检查我的 repo 文件夹中所有文件和文件夹的所有权,以确保我将所有权更改为正确的用户。

                        我通过克隆远程存储库并检查该存储库的所有权和权限与我从即将死去的 PC 复制的其他存储库进行检查,虽然 Windows 资源管理器中的安全选项卡似乎显示一切匹配,但 DIR / Q 告诉我,我无法打开的存储库与我克隆并可以访问的存储库拥有不同的所有权。

                        【讨论】:

                        • 我假设您的意思也是takeown,而不是takedown? :)
                        • 该死。是的,我愿意。
                        猜你喜欢
                        • 2022-06-30
                        • 1970-01-01
                        • 1970-01-01
                        • 2021-11-06
                        • 2010-10-13
                        • 1970-01-01
                        • 2017-07-15
                        • 2017-03-18
                        • 2014-03-01
                        相关资源
                        最近更新 更多