【问题标题】:How to disable GIT hooks for security reason?出于安全原因,如何禁用 GIT 挂钩?
【发布时间】:2016-03-14 20:39:19
【问题描述】:

如果你克隆一个 git 存储库,我想出于安全原因不会克隆钩子。但是,如果我通过 ZIP 文件等其他方式获取存储库怎么办?当我在我不完全信任的存储库上运行 GIT 命令时,如何确保没有执行任何钩子?

我能想到的,就是去掉 .git/hook 目录下所有文件的可执行标志。但是根据文档,钩子通常只存储在这个目录中,所以可能还有其他地方需要先清理。 (顺便怎么改钩子目录?)

举个例子,我担心这个比赛中的一个文件:

http://hackyeaster.hacking-lab.com/hackyeaster/challenge12.html

【问题讨论】:

    标签: git security githooks


    【解决方案1】:

    回答这个具体问题

    我自己正在研究这个问题,对有多少警告感到惊讶。

    可以只需指定一个本地路径作为git clone 的源存储库,因此这是开始处理提供给您的代码库的一种方法,例如作为一个压缩存储库而不用担心它的钩子,因为(至少截至 2018 年 6 月)没有钩子在被克隆时在“远程”存储库上执行。

    但即便如此,您也必须小心,以后不要在克隆的 repo 中意外运行 git push,因为它会触发原始 repo 中的 "server-side" hooks,再次允许任意代码执行!为了消除发生这种情况的可能性,最好从克隆的 repo 的遥控器中完全删除对原始 repo 的引用。

    总之,我为此建议的“工作流程”是:

    # instead of cloning normally, we will use --mirror in order to exactly
    # replicate the branches of the original repo; unfortunately, this implies
    # creating a "bare" repo without working tree (think .git directory).
    mkdir -p cloned_repo/.git
    # --no-hardlinks to get a "proper" copy
    git clone --no-hardlinks --mirror /path/to/original_repo cloned_repo/.git
    cd cloned_repo
    # turn this into a proper repo with working tree
    git config core.bare false
    git checkout HEAD
    # check if the database has been tampered with
    git fsck
    # remove remote pointing back to the original repo
    git remote remove origin
    

    但我完全有可能错过了更多问题。

    规避问题

    如果可能,您也可以要求给您回购的人使用git bundle 来准备它(参见How to git bundle a complete repo)。可以像克隆本地存储库一样克隆捆绑包,并且据我所知,它不能包含挂钩。事实上,它们专门设计用于启用“离线”git 工作流程(例如,通过闪存驱动器上交换的文件),您还可以准备仅包含部分回购历史的捆绑包。

    【讨论】:

      【解决方案2】:

      如果您不需要这些挂钩,您可以将其移除:

      rm -rf .git/hooks
      

      如果您想保留它们但不执行它们,您可以临时更改可执行位:

      chmod -x .git/hooks
      

      但您可能还需要这样做以防止出现警告:

      git config advice.ignoredHook false
      

      并确保@pmos 注释的路径使用.git/hooks 或空路径:

      git config core.hooksPath .git/hooks
      

      【讨论】:

      • 按照我的理解,这通常不会摆脱所有钩子,因为钩子路径可以通过 @ 在 repo 的本地 (!) 配置中更改987654326@ 选项。您必须首先获取此选项的值,然后删除指向的路径,但鉴于它可以指向文件系统上的 any 路径(不仅仅是在 repo 中!),这就来了有自己的问题。另一个想法当然是将core.hooksPath 设置为您知道是空的路径。
      • chmod? Windows 用户呢?
      【解决方案3】:

      您是正确的,如果您通过除克隆以外的其他方式收到.git 目录,它可能包含恶意软件,包括挂钩。 (不过,如果你习惯于从其他地方下载任意代码而不检查它,那么你面临的风险不仅仅是 git 钩子。)

      事实证明,旧版本的 git 中存在一个错误,无法禁止名称为 .Git 的文件(树条目)。如果您使用区分大小写的文件系统将此类存储库克隆到 Linux 或 Unix 机器上,则可以,但如果您使用区分大小写的文件系统克隆到 Windows 或 Mac 系统(in或在你的 Linux/Unix 机器上设置这样的文件系统),名称 .Git 与名称 .git 匹配,这些旧版本的 git 将继续写入 .git;所以即使你使用标准的 git 克隆机制,这也是有人可以偷偷进入你的系统的一种方式。

      在 2.9 之前的 Git 版本中,关闭 .git/hooks/* 中的执行位 足以阻止挂钩运行(因为没有替代挂钩位置)。在 Git 2.9 或更高版本中,您(或拥有您的配置文件的任何人)可以配置 core.hooksPath 变量以添加可以运行挂钩的其他位置,因此仅此是不够的。作为一般规则,每当您从其他地方获得未经验证的代码时,您都应该仔细检查它。即使在使用安全证书签名的软件(例如,Apple 的 Mac 软件更新)时,您也可能需要谨慎行事,因为确实会发生错误。

      【讨论】:

      • “没有替代的钩子位置”据我了解是不正确的 - 参见。 nbari's answer.
      • @pmos: 是的,core.hooksPath 是在 2016 年 6 月发布的 Git 2.9 中引入的(在我写完答案之后)。不过我现在会编辑它。
      猜你喜欢
      • 2013-06-30
      • 2016-02-07
      • 2019-11-27
      • 2014-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-05
      • 2023-04-10
      相关资源
      最近更新 更多