在git归档文件中扩展%(describe)会带来拒绝服务(DOS)风险吗?

9gm1akwq  于 2023-01-07  发布在  Git
关注(0)|答案(2)|浏览(121)

gitattributes man page表示:

创建归档文件

export-subst
如果为文件设置了属性export-subst,那么Git在将该文件添加到归档时会展开几个占位符。[...]这些占位符与git-log(1)的选项--pretty=format:的占位符相同,只是它们需要如下 Package :$Format:PLACEHOLDERS$。例如,字符串$Format:%H$将替换为提交哈希。但是,每个存档只扩展一个%(describe)占位符 * 以避免拒绝服务攻击*。
git log man page表示:

漂亮的格式

[...]

  • format:<format-string>

[...]
占位符包括:
[...]

  • 扩展到从提交中提取的信息的占位符:

[...]
%(describe[:options])
人类可读名称,如git-describe(1);无法描述的提交的空字符串。描述字符串后面可以跟一个冒号和零个或多个逗号分隔的选项。同时添加或删除标记时,描述可能不一致。
如果我忘记标记最近的提交,git describe不得不扫描数万亿个过去的提交来找到最近的标记...我可以用^C来终止git archive。那么在这个所谓的"* denial-of-service *"中,谁的服务被拒绝了呢?

ppcbkaq5

ppcbkaq51#

至少GitHub使用git archive来生成归档文件,GitLab、cgit和其他类似的环境也可能是这样。虽然GitHub会缓存归档文件一段时间,但使用非常昂贵的操作和大量的进程是不可取的,因为这会使存储数据的文件服务器过载。
GitHub确实对昂贵的操作进行了速率限制,但是如果归档非常昂贵,那么这意味着同一个仓库在归档、克隆和获取时会有更长的延迟时间,因此仓库的伸缩性会较差。(例如,由于容器限制),这也意味着类似的问题可能会影响像kernel.org这样的站点。
两到三次扩张可能不是问题,但大量扩张可能是问题,目前的限制是一次,正如torek的评论中提到的。

wfveoks0

wfveoks02#

    • 它 * 不是 * 拒绝服务风险。**证据:

| 问题|解决方案|
| - ------| - ------|
| 成千上万的%(describe)会减慢未受保护的进程|限制每个人在每个存储库中只能使用一个%(describe)|
| 大文件上传导致设计不良的Web服务器崩溃|Web浏览器将所有文件上载限制为1kB/天/主机|
大量的%(describe)和大文件上载都可以在服务器端阻止(需要时),因此它们本身并不代表拒绝服务攻击。
我不明白这个严厉的"解决方案"怎么会是由两个本应独立的人提出来的。因为少数用户的不良行为和/或为了商业利益而严格限制所有用户的心态开创了一个危险的先例。正如我在上文所展示的,这个问题有有效的、有针对性的技术解决方案。
真正需要学习的是,git不应该因为这个目的而膨胀代码,因为任何需要它的人都可以用makesed实现他们自己的无git解决方案。现在%(describe)除了最有限的情况外,在所有情况下都是无用的,它真的只是代码膨胀。我建议不要使用它。

相关问题