Palo Alto Networks 的 Unit 42 团队的研究人员发现了一种可能危害 GitHub 存储库的新攻击媒介。该漏洞利用了CI/CD 工作流期间生成的GitHub Actions工件,可能会授予对云环境的高级访问权限。
研究人员发现,配置错误和安全漏洞的组合可能会导致工件泄露令牌,包括第三方云服务和 GitHub 本身的令牌。任何具有存储库读取权限的人都可以访问这些令牌,从而使恶意行为者有可能破坏这些机密授予访问权限的服务。
在发现的大多数易受攻击的项目中,最常见的泄漏是 GitHub 令牌。这可能使攻击者能够对触发漏洞的 GitHub 存储库采取行动,可能推送可能通过 CI/CD 管道流向生产的恶意代码,或访问存储在 GitHub 存储库和组织中的机密。
虽然这项研究既适用于私人 GitHub 存储库,也适用于公共 GitHub 存储库,但该团队专注于发现易受攻击的公共存储库。他们发现了一些全球最大公司旗下备受瞩目的开源项目,这些项目在采取缓解措施之前可能会影响数百万消费者。
所有披露的案例均已报告给这些项目的维护者,研究人员得到了所有团队的大力支持。随后开展合作,以快速有效地缓解所有发现。
研究人员探索了工作流工件,这是 GitHub Actions 中的一项功能,允许在同一工作流中跨作业持久保存和共享数据。这些工件可以包括构建过程中生成的任何文件,例如编译的代码、测试报告或部署包。
该团队在 GitHub 上编制了一份热门开源项目列表,并自动下载了这些项目的成果并扫描其中的机密信息。事实证明他们的直觉是正确的,因为他们找到了适用于各种云服务(包括音乐流媒体和云基础设施)的令牌。
更有趣的是,他们发现了各种 GitHub 令牌。两种类型的令牌不断出现:GITHUB_TOKEN(带有 ghs_ 前缀)和 ACTIONS_RUNTIME_TOKEN(JWT 令牌)。
研究人员发现,这些令牌不是存储库代码的一部分,而只存在于存储库生成的工件中。他们发现,广泛使用的 GitHub 操作的默认行为是保留凭据,将 GITHUB_TOKEN 写入本地 git 目录。
许多用户在不知情的情况下将整个签出目录作为工件上传,包括包含持久化 GITHUB_TOKEN 的隐藏 .git 文件夹。这会导致包含 GITHUB_TOKEN 的工件可公开访问。
另一个问题源于使用 super-linter(一种流行的开源代码 linter)。当其 CREATE_LOG_FILE 属性设置为“True”时,它会创建一个包含环境变量的日志文件,这可能会暴露敏感令牌。
研究人员开发了一种滥用泄露的 GitHub 令牌的方法,特别是 ACTIONS_RUNTIME_TOKEN,该令牌的有效期约为 6 小时。他们自动执行了一个下载工件、提取令牌并使用该令牌将工件替换为恶意工件的过程。
GitHub 宣布推出的工件功能第 4 版允许在工作流程运行过程中下载工件。这造成了潜在的竞争条件,使得泄露的 GITHUB_TOKEN 可以在作业完成且令牌过期之前被下载、提取和使用。
研究人员成功利用了多个开源项目中的此漏洞,其中包括由谷歌、微软、红帽和 Canonical 等主要组织维护的项目。
所有受影响的开源项目在被问及该问题时都迅速合作,修补了代码。有些项目甚至提供奖金和商品以感谢披露该问题。
为了解决这些问题,研究人员开发了一个名为upload-secure-artifact 的概念验证自定义操作。此操作通过审核源目录中的机密并在存在意外机密泄露风险时阻止工件上传来增加一个关键的安全层。
强烈建议使用工件机制的组织重新评估其使用情况,尤其是考虑到 GitHub 已弃用 Artifacts v3。