Git归档中展开%(describe)为何存在拒绝服务(DoS)风险?
Git归档中
%(describe)占位符的拒绝服务防护说明 相关手册内容
gitattributes手册
创建归档
export-subst
如果为文件设置了export-subst属性,Git在将该文件添加到归档时会展开多个占位符。这些占位符与git log的--pretty=format:选项所用占位符相同,但在文件中需以$Format:PLACEHOLDERS$的形式包裹。例如,字符串$Format:%H$会被替换为提交哈希。不过,每个归档仅展开一个%(describe)占位符,以避免拒绝服务攻击。
git log手册
美观格式
[...]
format:<format-string>
[...]
占位符包括:
[...]
- 从提交中提取信息的占位符:
[...]%(describe[:options])
人类可读名称,类似git describe;无法描述的提交则为空字符串。描述字符串后可跟冒号及零个或多个逗号分隔的选项。添加或移除标签时,描述可能不一致。
问题解答
这个拒绝服务防护针对的是自动化场景下的服务端或批量处理系统,而非手动执行git archive的普通用户:
- 比如持续集成(CI)系统中,若批量处理大量仓库归档时,某仓库文件包含上百个
%(describe)占位符,每个都要触发全历史扫描找标签,会瞬间耗尽CI节点的CPU、IO资源,导致节点无法处理其他任务,甚至整个集群瘫痪。 - 再比如Git托管平台,当用户请求生成归档时,若仓库里有大量这类占位符,服务端会被大量耗时的
git describe操作占满,无法响应其他用户请求,这就构成了对服务端的拒绝服务。
手动执行时你可以随时按^C终止,但自动化系统没有人工干预的余地,这个限制就是为了防止恶意设置或疏忽导致的资源耗尽问题。
内容的提问来源于stack exchange,提问作者figl
相关产品推荐
相关产品推荐

