如果你克隆一个git存储库,我认为出于安全原因不会克隆这些钩子。但是,如果我通过ZIP文件等其他方式获取存储库呢?当我在一个我不完全信任的存储库上运行GIT命令时,如何确保没有执行钩子?
我能想到的是删除.git / hook目录中所有文件的可执行标志。但是根据文档,钩子通常只存储在这个目录中,所以可能还有其他地方要先清理。 (顺便说一下如何改变钩子目录?)
作为一个例子,我关注的是像这个比赛中的文件:
http://hackyeaster.hacking-lab.com/hackyeaster/challenge12.html
答案 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