【问题标题】:How to prevent GitHub Actions workflow being triggered by a forked repository events?如何防止分叉存储库事件触发 GitHub Actions 工作流程?
【发布时间】:2021-02-09 16:34:37
【问题描述】:

我最近突然想到,如果你有一个公共存储库,那么任何人都可以触发 GitHub 操作的 on pull_request 事件。

即:

  1. 有人克隆了我的存储库
  2. 他们将something.yml 文件添加到.github/workflows,该文件在pull_request 事件上运行
  3. 他们创建了一个拉取请求

然后运行他们在拉取请求中指定的操作。如果您有一个自托管运行器,那么地球上的任何人都可以在自托管运行器用户的上下文中在您的服务器上运行 shell 命令。

如果这如我认为的那样有效,那么地球上的任何人都可以通过拉取请求在您的服务器上运行任意代码。这个我试过了,好像是这样的。

如何将可以在存储库上触发操作的挂钩列入白名单?否则,我如何安全地使用带有公共存储库和自托管运行器的 Github Actions。我已经看到了警告......我只是假设我必须小心不要接受来自未知来源的拉取请求。

【问题讨论】:

  • pull_request_target 不起作用。我无法强制使用新工作流程的拉取请求指定 pull_request_target 而不是 pull_request
  • 你说得对,我弄混了一些东西

标签: github-actions


【解决方案1】:

据我所知,你不能。这就是跑步者和 GitHub Actions 的设计方式。如果您有一个公共存储库,那么拥有一个自托管运行器确实不是一个好主意。甚至§Self-hosted runner security with public repositories 部分中的文档也提到:

我们建议您不要在公共存储库中使用自托管运行器。

您的公共存储库的分支可能会在您的自托管运行器机器上运行危险代码,方法是创建一个在工作流中执行代码的拉取请求。

这不是 GitHub 托管的运行程序的问题,因为每个 GitHub 托管的运行程序始终是一个干净的隔离虚拟机,并且在作业执行结束时被销毁。

考虑到这一点,您有两个选择:

  1. 除非您确实需要,否则不要使用自托管运行器。如果您需要,请将您的仓库设为私有。

  2. 切换到 GitHub 托管的运行器。

【讨论】:

  • 使用自托管运行器的一个很好的理由是组织的网络不允许 ssh 连接到该网络中的服务器。令人难以置信的是,GitHub Actions 默认情况下如此不安全。
  • 特别是考虑到这将是多么容易防止 - 即只允许禁用事件触发器。
【解决方案2】:

据我所知:

  • 无法在公共存储库(免费层)上禁用此功能
  • 在私有存储库上,默认情况下无法对拉取请求运行操作
  • 如果您有 GitHub Enterprise,则可以从分叉启用工作流

【讨论】:

  • 如果您当前的工作流程没有on: pull_request 触发器怎么办?比任何 PR 都不会触发 CI 运行
  • 您可以添加带有该触发器的工作流作为拉取请求。 (我认为这就是问题所在)
  • 但如果恶意贡献者添加了带有pull_request 触发器的工作流,它将不会被执行(操作将不会运行,因为该操作不会触发现有触发器)这是我的理解跨度>
  • 我认为这是合乎逻辑的。但在撰写此问题时,情况并非如此。这正是安全问题。我花了一段时间才真正相信它,但我记得测试过它确实发生了
  • 换句话说。公共 git 存储库中没有自托管运行器
猜你喜欢
  • 2022-11-02
  • 2023-01-11
  • 2020-02-01
  • 2020-06-20
  • 2022-07-04
  • 1970-01-01
  • 2021-08-28
  • 2021-01-12
  • 2022-12-23
相关资源
最近更新 更多