如何安全地允许 Github 操作来检查 PR 和 post 结果评论

How to securely allow Github Actions to check PR and post results in comment

我正在尝试了解 Github 操作 (GHA) 中的安全模型。假设我对 public 回购有以下要求:

  1. 允许打开分叉回购的拉取请求
  2. GHA 应该 运行 对拉取请求进行单元测试
  3. GHA 应该 post 单元测试结果作为 PR 评论

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

现在,如果写入令牌被发送到分叉 PR 中的工作流,如何防止黑客更改 PR 中的工作流并将其用于任意数量的恶意目的(在原始回购中创建恶意版本或泄露回购秘密)?我知道你可以 limit the permissions of the token,但这是在工作流程中完成的;黑客可以像 PR 的一部分一样轻松地删除限制。

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

本题的must-read是:Keeping your GitHub Actions and workflows secure Part 1: Preventing pwn requests

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

建议的解决方案是:

  1. 有一个由“pull_request”事件触发的工作流。这 运行 与 read-only GITHUB_TOKEN。您可以在这里 运行 进行单元测试。在此工作流结束时,单元测试结果作为构建工件上传。

  2. 有另一个工作流程,由事件“workflow_run”触发。 PR-workflow 完成后 运行s。第二个工作流 运行 在基础存储库的上下文中使用 write-access GITHUB_TOKEN 和所有其他配置的秘密。它可以从第一个工作流程下载工件 运行 并使用此构建结果创建对 PR 的评论。

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

When used in a safe manner, like reading PR numbers or reading a code coverage text to comment on the PR, it is safe to use such untrusted data in the privileged workflow context.

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

注意:您关于“Fork pull request workflows”配置的屏幕截图已同时重命名为“Fork pull request workflows in private repositories”: 使用私有存储库,您可以控制与谁共享您的代码。所以你可能决定默认信任。 但是有了 public 存储库,任何人都可以 fork 存储库。

更新:github 动作博客 post 系列的所有链接: