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

3
我正在尝试理解Github Actions(GHA)中的安全模型。 假设我对公共存储库有以下要求:
  1. 允许来自分叉存储库的拉取请求被打开
  2. GHA应在拉取请求上运行单元测试
  3. GHA应将单元测试结果作为PR评论发布
为了使第三个要求起作用,拉取请求需要访问具有仓库写入权限的GITHUB_TOKEN。 这将需要以下两个权限:
  • 从分叉拉取请求运行工作流程。
  • 向来自分叉拉取请求的工作流程发送写入令牌

First, Run workflows from fork pull requests.  Second, Send write tokens to workflows from fork pull requests

现在,如果将写入令牌发送到分支PR中的工作流程,有什么可以防止黑客更改PR中的工作流程并将其用于任意数量的恶意目的(在原始存储库中创建恶意版本或窃取存储库机密)?我知道您可以限制令牌的权限,但这是在工作流程内完成的;黑客可以轻松地在PR的一部分中删除限制。是否有任何方法可以在不出现此安全漏洞的情况下实现三个要求?

我认为如果能够在原始仓库中配置GITHUB_TOKEN权限,则部分问题可以得到解决;如果只允许没有更改.github/workflows/*的PR运行工作流,则问题完全可以得到解决。 - jschmitter
1个回答

7
这个问题的必读资料是:保护您的GitHub Actions和工作流程第1部分:防止pwn请求 GH Action提供了事件类型“pull_request_target”,它具有写权限,并可以评论PR。 不要在没有谨慎考虑的情况下使用! PR的代码是不可信的 - 如果构建它,它可能会注入恶意代码并危及您的存储库,并可能窃取您的密码。
建议的解决方案是:
  1. 创建一个由 "pull_request" 事件触发的工作流程。此工作流程使用只读 GITHUB_TOKEN 运行。在这里,您可以运行单元测试。在此工作流程结束时,将单元测试结果作为构建产物上传。

  2. 创建另一个工作流程,由 "workflow_run" 事件触发。它会在 PR 工作流程完成后运行。此第二个工作流程在基础仓库上下文中以具有写入权限的 GITHUB_TOKEN 和所有其他配置的机密运行。它可以下载第一个工作流程运行的产物,并使用此构建结果创建一条评论到 PR 中。

重要提示: 第一个工作流程运行产生的产物数据仍应视为不可信。但是:

如果以安全的方式使用,比如读取 PR 编号或读取代码覆盖率文本以评论 PR,则在特权工作流程上下文中使用此类不可信数据是安全的。

请参阅完整的使用示例,了解有关如何防止 Pwn 请求的信息: https://securitylab.github.com/research/github-actions-preventing-pwn-requests/
注意:有关“分叉拉取请求工作流程”的配置的截图已更名为“私人存储库中的分叉拉取请求工作流程 ”: configuration for forked workflows in private repos 使用私人存储库时,您可以控制与谁共享代码。因此,您可能会默认信任。 但是,对于公共存储库,任何人都可以分叉该存储库。
更新:所有链接到 github 行动博客文章系列:

这是一个很棒的、简洁的总结,概括了更长的 Github 文章。 - jschmitter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接