GitHub在2022年9月9日发布了一个新功能,允许用户向开源项目维护者报告安全问题。

这个功能称为安全公告,它让维护者可以创建一个公共咨询信息,描述报告的漏洞,并开始处理补丁。

这个功能创建了一个特殊的私有分支,与普通的分支有一些不同之处,例如禁用了问题、项目和讨论。

这是为了确保安全和访问控制。维护者可以在修复漏洞后打开私有PR,并合并到主分支中。

安全公告如何工作?

安全公告功能允许维护者起草有关所报告漏洞的公共咨询信息。创建后,维护者可以通过创建存储库的私有分支来开始处理补丁。

由安全公告创建的私有分叉与常规复刻/存储库略有不同。例如,默认情况下,安全公告的私有分支禁用问题、项目和讨论。

advisory.build_workspace_repository(attributes.merge({
      name: name,
      private: true,
      owner: owner,
      parent: nil,
      network: nil,
      created_by_user_id: actor.id,
      has_issues: false,
      has_wiki: false,
      has_downloads: false,
      has_projects: false,
      repository_license: repository.repository_license&.dup,
    }))

这表明默认情况下,在这种类型的分支中实现了一些额外的访问控制,因为它们是敏感的。修复漏洞后,维护者可以针对漏洞存储库打开私有 PR 以供稍后合并。

安全公告中有哪些新增功能?

在 11 月版本中,安全通报允许组织允许外部用户向其公共存储库报告漏洞。权限模型没有随着新功能而发生重大变化:

在组织公开披露之前,安全公告是私有的 只有所有者/维护者才能合并补丁

但是,有些事情发生了变化:

1.外部报告者将作为协作者添加到漏洞报告中。外部协作者获得的许可有限:

2.对咨询的评论。

3.接受咨询信用。

4.创建私有分叉后,外部报告者会自动作为协作者添加到存储库中。然后,外部报告者可以帮助修补漏洞并打开 PR 供维护者接受。

私有分叉、协作者+代码空间=漏洞利用

通过安全公告报告漏洞的外部用户将作为协作者添加到修补程序存储库中。

进一步调查,补丁存储库与易受攻击的存储库位于同一组织中。

最初,这影响不大,因为单个存储库的外部协作者没有太多访问权限。

特别是在这种情况下,问题、项目、下载和操作等功能被禁用。

但是,为这些存储库启用了代码空间。

什么是 GitHub Codespace?

GitHub Codespace 是一个基于云的开发环境,允许开发人员快速贡献和测试他们的代码。

此环境具有所有开发功能,因为它在所有用户的独立虚拟机中运行。此外,为了让开发人员更安全、更易于与组织协作,GitHub 引入了 Codespace Secrets。Codespaces 机密允许用户和组织安全地存储敏感字符串,例如 API 密钥、SSH 密钥对、密码等。

代码空间机密存在于三个资源中:组织、存储库和个人。

个人机密由用户自己创建,可在用户创建的所有代码空间中使用。(对用户自己来说几乎是私人的)
存储库机密链接到特定存储库,并且只能由这些存储库访问。
组织机密链接到组织,可以进一步链接到特定仓库(同时链接到多个仓库)或所有公共/私有仓库。

由于组织机密可以设置为由所有私有仓库访问,因此我们决定测试并检查外部用户是否可以访问这些机密。从理论上讲,这就是我们设想漏洞利用的工作方式:

1.外部用户创建漏洞报告

2.外部用户将自动作为协作者添加到漏洞报告中。

3.外部报告者在未经管理员批准的情况下为安全修补程序创建私有分支。

4.创建的私有分叉位于受影响的组织中。

5.外部报告器将代码空间用于私有分叉并访问组织级别的机密。

确认漏洞

我们在其中一个公共存储库中启用了漏洞报告来测试这一点。然后,我们使用外部帐户提交测试安全问题。使用外部帐户,我们为关联的分叉创建了一个私有分叉和一个代码空间。

由于代码空间是在易受攻击的组织上下文中创建的,因此 env 命令打印出代码空间的环境变量。这包括纯文本格式的机密。为了确认我们的漏洞,我们为组织中的所有私有仓库提供了一个“标志”机密。

漏洞挖掘 — 访问 GitHub 的内部存储库

对于使用新测试版功能的任何组织来说,访问组织机密已经是一个有问题的安全问题,但是,我们希望进一步升级。

尝试这样做的一种方法是利用它来对付GitHub(https://github.com/github)组织本身。

在浏览了一些公共 GitHub 存储库后,我们发现 Github Enterprise Importer (https://github.com/github/gh-gei) 已启用该功能。

我们为其创建了一个测试安全问题和一个私有分支。

然后,我们为私有分叉创建了一个代码空间。这使我们能够访问 GitHub 组织的组织机密。

通过访问,我们能够读取和提取 GitHub 的组织机密,例如 GOPROXY_TOKEN 。

披露的令牌是gh-containers-bot的GitHub用户令牌。

进一步探索 API,我们调用了 https://api.github.com/user/repos,它列出了用户所有可访问的存储库。

这使我们能够访问具有读写权限的 GitHub 的多个内部存储库。确认令牌有效性和访问权限后,我们向 GitHub 报告了安全问题。

漏洞时间线

2022年9月30日 — 通过安全程序向 GitHub 报告漏洞。

2022年9月30日 — GitHub 确认他们收到了该报告并开始审核 [报告]。

2022年11月31日 — Github在内部确认该漏洞已修补。

2023年2月2日 — 漏洞确认并奖励 17875 美元

2023年3月7日 — GitHub 得出结论,其全面调查和报告已解决。