如何安全地允许 Github Actions 检查 PR 并在评论中发布结果

jsc*_*ter 3 security github github-actions

我正在尝试了解 Github Actions (GHA) 中的安全模型。假设我对公共仓库有以下要求:

  1. 允许打开来自分叉存储库的拉取请求
  2. GHA 应该对拉取请求运行单元测试
  3. GHA 应将单元测试结果作为 PR 评论发布

为了使第三个要求起作用,拉取请求需要访问具有存储库写入权限的 GITHUB_TOKEN。这将需要以下两个权限:

  • 从分支拉取请求运行工作流程。
  • 从分叉拉取请求将写入令牌发送到工作流程

首先,从分支拉取请求运行工作流程。 其次,将写入令牌从分叉拉取请求发送到工作流程

现在,如果将写入令牌发送到分叉 PR 中的工作流程,那么如何防止黑客更改 PR 中的工作流程并将其用于任意数量的恶意目的(在原始存储库中创建恶意版本或窃取存储库机密)?我知道您可以限制令牌的权限,但这是在工作流程内完成的;黑客可以像 PR 的一部分一样轻松地消除限制。

有没有什么方法可以在不存在安全漏洞的情况下完成这三个要求?

ada*_*gel 7

此问题的必读内容是:保持 GitHub 操作和工作流程的安全第 1 部分:防止 pwn 请求

GH Action 提供了事件类型“ pull_request_target ”,具有写权限,可以评论 PR。不小心就不要使用这个!PR 的代码不受信任 - 如果您构建它,它可能会注入恶意代码并危害您的存储库,并可能窃取您的秘密。

建议的解决方案是:

  1. 有一个由“ pull_request ”事件触发的工作流程。它使用只读 GITHUB_TOKEN 运行。在这里您可以运行单元测试。在此工作流程结束时,单元测试结果将作为构建工件上传。

  2. 有另一个工作流程,由事件“ workflow_run ”触发。它在 PR 工作流程完成时运行。第二个工作流程在具有写入访问权限 GITHUB_TOKEN 和所有其他配置的机密的基础存储库的上下文中运行。它可以从第一次工作流程运行中下载工件,并使用此构建结果来创建对 PR 的评论。

重要提示:来自第一次工作流运行的传入工件数据仍必须被视为不可信。但:

当以安全的方式使用时,例如读取 PR 编号或读取代码覆盖文本来评论 PR,在特权工作流上下文中使用此类不受信任的数据是安全的。

有关完整的使用示例,请参阅https://securitylab.github.com/research/github-actions-preventing-pwn-requests/ 。

注意:有关“Fork pull request 工作流程”配置的屏幕截图同时已重命名为“Fork pull request 工作流程在私有存储库中”: 私人存储库中分叉工作流程的配置 通过私有存储库,您可以控制与谁共享代码。因此,您可能会决定默认信任。但通过公共存储库,任何人都可以分叉该存储库。

更新:github actions 博客文章系列的所有链接: