如何出于安全原因禁用GIT挂钩?

时间:2016-03-14 20:39:19

标签: git security githooks

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

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

作为一个例子,我关注的是像这个比赛中的文件:

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

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

回答这个具体问题

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

可以只指定本地路径作为git clone的源存储库,这是开始处理给您的代码库的一种方法,例如作为一个拉链回购而不担心其钩子,鉴于(至少截至2018年6月),没有钩子在"遥控器上执行#34;存储库在被克隆时。

但即便如此,你必须小心不要在你的克隆仓库中意外地运行git push,因为它会触发原始仓库中的"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工作流程(例如通过闪存驱动器上交换的文件),您还可以准备仅包含repo历史部分的包。

答案 2 :(得分:1)

如果您不需要挂钩,可以将其删除:

rm -rf .git/hooks

如果你想保留它们但不执行它们,你可以暂时改变可执行位:

chmod -x .git/hooks

但是你可能还需要这样做以防止警告:

git config advice.ignoredHook false

确保@pmos评论使用.git/hooks或使用空路径的路径:

git config core.hooksPath .git/hooks