任意人访问Github已删除和私有仓库数据

文摘   2024-08-20 09:24   北京  

此漏洞是由JOE LEON发表的名为Cross Fork Object Reference(https://trufflesecurity.com/blog/anyone-can-access-deleted-and-private-repo-data-github),可以在Github上访问已删除的forks、已删除的仓库甚至私有仓库中的数据。而且漏洞暂时可用并且看来会持续有效很久。GitHub其实是为了设计和用户体验,有意以这种方式进行设计的,具体见最后部分官方回应。

对于所有使用 GitHub 的使用者来说,这是一个巨大的攻击媒介,原作者也引入了一个新术语:Cross Fork Object Reference (CFOR)。当一个仓库分叉可以访问另一个分叉的敏感数据(包括来自私有和已删除分叉的数据)时,就会发生 CFOR 漏洞。与不安全的直接对象引用类似,在 CFOR 中,用户提供提交哈希以直接访问他们看不到的提交数据。
如下看几个实战例子:
一.访问已删除的 fork 数据

GitHub 上的以下常见工作流:

  1. 你分叉了一个公共仓库
  2. 将代码提交到分支中

  3. 你删除你的分叉

提交到分叉的代码是否仍然可以访问,而且它永远都可以访问。远超出你使用感受的控制范围。
在下面的视频中,将看到我们分叉一个仓库,向其提交数据,删除分叉,然后通过原始仓库访问“已删除”的提交数据。

虽然通过哈希访问会有一点保护,但哈希是可发现的。稍后会详细介绍。

我们测试调查了一家大型 AI 公司的3个常见分叉的公共仓库,并轻松地从已删除的分叉中找到了 40 个有效的 API 密钥,原用户流程是这样的:

  1. 分叉存储库

  2. 将 API 密钥硬编码到示例文件中

  3. <Do Work>

  4. 删除分叉

二.访问已删除的存储库数据

 这个例子中的情况如下:
  1. 在 GitHub 上有一个公共仓库。

  2. 用户分叉仓库。

  3. 在他们分叉数据后提交数据(从不将他们的分叉与更新同步)。

  4. 删除整个存储库。

GitHub 将仓库和分支一起存储在仓库网络中,原始的“上游”仓库充当根节点。当已分叉的公共“上游”仓库被“删除”时,GitHub 会将根节点角色重新分配给下游分叉之一。但是,来自“上游”存储库的所有提交仍然存在,并且可以通过任何分支访问。

在下面的视频中,我们创建一个仓库,对其进行分叉,然后展示在删除原始仓库后,分叉如何仍然可以访问未与分叉同步的数据。


和上面视频类似的问题,我向一家大型科技公司提交了一个 P1 漏洞,显示他们不小心把一名员工的 GitHub 帐户提交了私钥,该帐户对其整个 GitHub 组织具有重要访问权限。虽然他们立即删除了存储库,但由于它已经被分叉了,我仍然可以通过分叉访问包含敏感数据的提交,尽管分叉从未与原始的“上游”存储库同步。

三.访问私有仓库数据

这个例子是以下常见工作流程,用于在 GitHub 上开源新工具:

  1. 创建一个私有仓库,该仓库最终将公开。

  2. 可以创建该仓库的私有内部版本(通过分叉),并为不打算公开的功能提交其他代码。

  3. 你把你的“上游”仓库设为公共,并保持你的分叉是私有的。

私有功能和相关代码(从第 2 步开始)可被查看,从创建工具的内部分支到你开源该工具之间提交的任何代码,都可以在公共仓库中访问这些提交。
在公开“上游”存储库后,对私有分支进行的任何提交都是不可见的。这是因为更改私有“上游”仓库的可见性会导致两个仓库网络 - 一个用于私有版本,另一个用于公共版本。

在下面的视频中,我们演示了组织如何在维护私有内部分叉的同时开源新工具,然后展示某人如何通过公共版本访问私有内部版本的提交数据。


而且重点是这种工作流程是用户和组织开发开源软件时最常见的方法之一。因此,机密数据和机密可能会无意中暴露在组织的公共 GitHub 仓库上。

真实利用:

作者开源一个新的 TruffleHog 模块的 alpha 版本,该模块枚举了 Cross Fork 对象引用(和已删除的 git 历史记录),然后扫描它们以查找机密。该过程很慢,并且受 GitHub 的速率限制的约束,因为它涉及枚举数千个可能的提交哈希。使用方法如下:

trufflehog github-experimental --repo https://github.com/<USER>/<REPO>.git --object-discovery

--object-discovery 要求用户在其环境变量中设置有效的 GitHub 访问令牌 (export GITHUB_TOKEN=ghp_) 或在命令行 (--token ghp_) 上传递它。

利用原理:

如前面3种案例情况下漏洞利用访问方式都是直接访问,但需要哈希值。

通过从标准 GitHub UI 和正常 git 操作中删除提交数据的引用。但是,此数据仍然存在并且可访问(如果知道提交哈希)。这是 CFOR 和 IDOR 漏洞之间的联系 - 如果知道提交哈希,则可以直接访问不适合您的数据。

提交哈希是 SHA-1 值

如果用户知道他们想要查看的特定提交的 SHA-1 提交哈希,他们可以直接导航到端点的该提交:https://github.com///commit/。他们会看到一个黄色横幅,解释说“他的提交不属于此仓库的任何分支,可能属于仓库外的分支。

那么怎么获取这些哈希值呢

可以通过 GitHub 的 UI 暴力破解提交哈希,特别是因为 git 协议允许在引用提交时使用短 SHA-1 值。短 SHA-1 值是避免与另一个提交哈希发生冲突所需的最小字符数,绝对最小值为 4。所有 4 个字符 SHA-1 值的键空间为 65,536 (16^4)。暴力破解所有可能的值可以相对容易地实现。
例如:
TruffleHog 仓库中的以下提交:

要访问此提交,用户通常会访问包含完整 SHA-1 提交哈希的 URL:https://github.com/trufflesecurity/trufflehog/commit/07f01e8337c1073d2c45bb12d688170fcd44c637
但其实不需要知道整个 32 个字符的 SHA-1 值,他们只需要正确猜测 Short SHA-1 值,在本例中为 07f01e。

https://github.com/trufflesecurity/trufflehog/commit/07f01e
但更有趣的是GitHub 公开了一个公共事件 API 端点。还可以在由第三方管理的事件存档中查询提交哈希,并将过去十年的所有 GitHub 事件保存在 GitHub 之外,即使在存储库被删除后也是如此。

GitHub 的回应:

漏洞已经提交了,但Github回应是无影响,如下:

在查看了这个文档之后,发现这明显 GitHub 设计的仓库就是这样工作的,有些只是使用方式错误。

军机故阁
最新的安全情报与技术
 最新文章