1. Anyone can access deleted and private repository data on GitHub (trufflesecurity.com)
GitHub 存在永久可访问的已删除和私有仓库数据问题
核心问题: GitHub 的仓库网络设计导致已删除的仓库、分支以及私有仓库的特定数据可被永久访问,这是一个被称为 “跨仓库对象引用”(Cross Fork Object Reference, CFOR) 的重大安全漏洞。
关键发现与场景
访问已删除的 Fork 数据
- 用户在公共仓库的 Fork 中提交代码后删除该 Fork,这些提交数据仍然存在且可被访问。
- 示例:对一个流行AI公司的三个公共仓库进行调查,轻易地从已删除的 Fork 中发现了40个有效的API密钥。用户模式通常是:Fork仓库、硬编码密钥、工作、删除Fork。
- 即使原始上游仓库被删除,只要存在一个下游 Fork,整个仓库网络(包括原始提交)的数据依然可访问。
访问已删除的仓库数据
- 如果一个公共仓库被Fork后,原始仓库提交了新代码(未同步到Fork),然后删除原始仓库,这些新提交的数据仍能通过Fork访问。
- 实际案例:某大型科技公司意外提交了拥有重要权限的员工GitHub账户私钥。尽管公司立即删除了仓库,但由于已有Fork存在,报告者仍能通过Fork访问包含敏感数据的提交。
- 结论:任何提交到公共仓库的代码,只要存在至少一个Fork,就可能永久可访问。
访问私有仓库数据
- 这是一种常见的开源工作流程风险:创建私有仓库 -> Fork出一个私有内部版本并提交特有代码 -> 将上游仓库转为公开。
- 在此流程中,从创建内部Fork到上游仓库转为公开期间提交到私有Fork的代码,会通过公开的上游仓库变得可访问。公开后新提交到私有Fork的代码则不受影响(因为仓库网络分离)。
- 这导致组织的机密信息和密钥可能在无意中通过其公共GitHub仓库暴露。
如何访问这些“已删除”的数据?
- 通过提交哈希直接访问:知道某个提交的完整或短SHA-1哈希值,即可直接通过URL(
https://github.com/<user>/<repo>/commit/<commit_hash>)访问,即使该提交不属于任何可见分支。 - 哈希值可被发现:
- 暴力破解:Git协议允许使用短SHA-1值(最少4字符),键空间较小(65,536种可能),易于暴力破解。
- 事件API:GitHub的公共事件API及第三方存档可能记录了这些提交哈希,即使在仓库删除后。
GitHub 的立场与政策
- GitHub的官方文档明确说明了仓库在删除或更改可见性后Fork的行为,这是其架构的设计方式。
- 然而,这种设计与用户的安全认知存在巨大差距:
- 用户普遍认为私有仓库与公共仓库之间存在安全边界。
- 用户认为“删除”操作会销毁数据,但实际上提交数据在网络中持续存在。
影响与建议
- 数据永久性:只要一个Fork存在,对该仓库网络的任何提交(上游或下游)将永久存在。
- 密钥泄露的唯一安全修复是轮换:一旦在公共GitHub仓库上泄露密钥,唯一彻底的补救措施是立即轮换该密钥。
- 秘密扫描的挑战:需要扫描整个仓库网络(包括已删除的分支和Fork)的所有提交,这可能涉及非自身拥有的密钥,增加了分类处理的复杂性。
- 用户认知差距:GitHub仓库网络的底层工作原理不为大多数用户理解,这直接导致了安全隐患。
- 普遍性:虽然研究聚焦于GitHub,但其他版本控制系统产品也可能存在类似问题。
总结:GitHub的CFOR漏洞源于其仓库网络架构的固有设计,使得“删除”操作并非真正的数据销毁。组织和个人必须认识到,在公共仓库上提交的任何代码(包括通过Fork和私有仓库间接关联的数据)都可能永久存在且可被访问,必须采取密钥轮换和全面的秘密扫描等严格的安全措施。