前沿资讯
前沿资讯 真实、准确的物联网、互联网行业新闻

通过 GitHub Actions 下载不安全的工件

你的位置: 网站首页 新闻动态 行业资讯

通过 GitHub Actions 下载不安全的工件

2022-12-05 20:52:14 阅读: 发布人:纵横智控

GitHub Actions 平台存储构建工件的方式可能使攻击者能够将恶意代码注入到具有 CI/CD(持续集成和持续交付)工作流的软件项目中,这些工作流在下载工件时未执行足够的过滤。网络安全研究人员已经确定了数以千计易受此问题影响的存储库使用的几种流行的工件下载脚本。

“我们发现,在不同工作流程之间传输工件时,存在工件中毒的主要风险——攻击者用一种经过修改的恶意工件替换合法工件的内容,从而发起供应链攻击的技术,”来自供应商的研究人员链安全公司 Legit Security 在分析该问题时表示。

要攻击一个易受攻击的项目的 CI/CD 管道,该管道下载和使用其他工作流生成的工件,攻击者只需要分叉包含这些工作流的存储库,在本地副本中修改它们,以便它们生成流氓工件,然后将拉取请求返回到原始无需接受这些请求的存储库。

工件存储 API 中的逻辑缺陷

GitHub Actions 是一个 CI/CD 平台,用于自动构建和测试软件代码。该服务对公共存储库免费,包括免费的工作人员运行时间和私有存储库的存储空间。它被使用 GitHub 托管和管理其源代码存储库的项目广泛采用。


RTU/DTU/边缘网关/物联网平台

1 second of 27 seconds音量0%

GitHub Actions 工作流程是使用 YAML 语法在 .yml 文件中定义的自动化流程,在某些触发器或事件发生时执行,例如当新代码提交到存储库时。构建工件是编译的二进制文件、日志和其他文件,这些文件是执行工作流及其各个作业所产生的。这些工件保存在存储桶中,每个工作流运行都被分配一个特定的桶,它可以上传文件并稍后从中下载文件。

GitHub 提供的用于下载工件的参考“操作”(脚本)不支持跨工作流工件下载,但重复使用不同工作流生成的工件作为后续构建步骤的输入是软件项目的常见用例。这就是为什么开发人员创建了自己的自定义脚本,这些脚本依赖于 GitHub Actions API 来使用更复杂的过滤来下载工件,例如由特定工作流文件、特定用户、特定分支等创建的工件。

Legit Security 发现的问题是API不区分分叉存储库和基本存储库上传的工件,因此如果下载脚本从特定存储库过滤特定工作流文件生成的工件,API 将提供最新版本的该文件生成的工件,但这可能是通过来自存储库的分叉版本的拉取请求操作自动生成的恶意版本。

“简单地说:在一个易受攻击的工作流程中,任何 GitHub 用户都可以创建一个构建工件的分支,”研究人员说。“然后将此工件注入原始存储库构建过程并修改其输出。这是另一种形式的软件供应链攻击,其中构建输出被攻击者修改。

研究人员发现了社区开发的四个自定义操作,用于下载所有易受攻击的工件。其中之一被列为超过 12,000 个存储库的依赖项。

生锈的例子

在其工作流程之一中使用此类自定义脚本的存储库之一是Rust 编程语言的官方存储库。名为 ci.yml 的易受攻击的工作流负责构建和测试存储库的代码,并使用自定义操作下载名为 libgccjit.so 的工件(一个 Linux 库文件),该文件由第三方存储库中的工作流生成。

攻击者所要做的就是分叉第三方存储库,修改该存储库的工作流以生成库的恶意版本,并向原始存储库发出拉取请求以生成工件。如果 Rust 的工作流随后引入了库的中毒版本,那么攻击者将能够使用工作流的权限在 Rust 存储库中执行恶意代码。

研究人员说:“一旦利用,攻击者可以修改存储库分支、拉取请求、问题、发布以及所有可用于工作流令牌权限的实体。”

用户需要对工件下载实施更严格的过滤

GitHub 通过向 API 添加更多过滤功能来回应 Legit 的报告,开发人员可以使用这些功能更好地识别由工作流的特定运行实例(工作流运行 ID)创建的工件。但是,在不破坏工作流程的情况下,不能将此更改强加到现有实施中,因此用户需要使用更严格的过滤来更新他们的工作流程以便受到保护。

另一种缓解措施是通过生成它们的提交的哈希值过滤下载的工件,或者完全使用 exclude_pull_requests 选项排除由拉取请求创建的工件。Legit Security 还联系了他们发现的易受攻击的自定义工件下载脚本的作者。

“在供应链安全方面,重点一直是防止人们贡献恶意代码,所以每次你在存储库中进行更改、创建拉取请求或进行更改请求时,GitHub 都有很多内置的验证控制, ” Legit Security 的首席技术官 Liav Caspi 告诉 CSO。“必须有人批准你的代码,必须有人合并它,所以有人参与。我们一直在努力寻找的是利用逻辑问题的技术,任何人都可以在没有审查的情况下影响它,我认为这就是其中之一。如果有人知道这件事,他们可能会在没有任何批准的情况下注入神器。”

Caspi 说,通常情况下,CI 管道的工作流会在拉取请求时自动运行,以在手动审查代码之前测试代码,如果拉取请求包含任何需要构建的工件,工作流将构建它。他说,一个老练的攻击者可以创建拉取请求来构建工件,然后通过关闭提交来删除该请求,而今天源代码存储库中存在的所有活动噪音很可能不会引起注意,它会被忽视。


友情链接