GitHub 项目安全隐患:开启秘钥泄露的后门
关键要点
Palo Alto Networks 的 Unit 42 研究发现,许多开源 GitHub 项目存在安全隐患,可能导致秘钥泄露,并允许攻击者注入恶意代码到 GitHub Actions 工作流中。GitHub Actions 工作流常用的秘钥如云服务和 GitHub 令牌可能在公开可用的工件文件中暴露。攻击者可以利用泄露的令牌来执行非授权的操作,比如替换工件,进行远程代码执行。项目维护者应定期审查工件创建以及权限设置,以防止敏感信息的自动发布。Palo Alto Networks 的高级研究员 Yaron Avital 在一篇 博客文章 中指出,GitHub Actions 工作流会自动生成和存储工件文件。这些工件文件保存了测试报告和编译代码等数据,以供后续分析或部署,许多用户可能不知道这些档案可能会暴露其秘钥。
Avital 提到,他出于直觉开始关注这些常被忽视的工件,并很快发现其中确实存在敏感数据公开可用的开源仓库中的工件,包含了许多知名公司如 Google、Microsoft 和 Red Hat的项目中,频繁出现外部云服务的有效令牌,以及两种类型的 GitHub 令牌:GITHUBTOKEN 和 ACTIONSRUNTIMETOKEN。

这些工件由 GitHub Actions 工作流自动生成,并可保留长达 90 天,而项目维护者可能并未意识到这些工件的存在、公开可用或含有秘钥。
攻击者如何利用工件危害 GitHub 项目
Avital 发现的两种 GitHub 令牌中,ACTIONSRUNTIMETOKEN 更容易被利用。这些 JSON Web 令牌用于多个 GitHub 操作以管理缓存和工件,创建后大约六小时过期。
研究人员创建了一个自动化流程,跟踪含有 ACTIONSRUNTIMETOKEN 的工件的生成,下载工件,提取令牌并在六小时内替换原始工件。
攻击者可以使用类似的流程,将工件替换为含有恶意代码的文件,如果该工件被用于其他作业,则可能造成远程代码执行 (RCE) 的风险。
另一方面,Avital 起初无法利用 GITHUBTOKEN,因为该令牌在作业结束时便会过期,而所包含的工件尚未生成。然而,随着 2 月版本 4 的工件特性发布,用户可以在工作流仍在运行时下载工件,这意味着 GITHUBTOKEN 可能会在过期前泄露。
虽然在 GITHUBTOKEN 过期前提取的时间窗口通常较小,但使用自动化流程,Avital 发现他仍可以在工件上传与作业结束之间的足够步骤时间内,窃取和利用泄露的令牌。
Avital 通过一种名为 RepoReaper 的优化流程,成功提升了 GITHUBTOKEN 利用的效率。这个流程通过选择性提取压缩工件中的 git 配置文件,利用目标仓库的 REST API 提取并利用令牌。
shadow rocket小火箭下载由于大部分 Avital 检查的工作流在项目仓库上具有写权限,即便这个权限并不是必需的,他通过拥有 GITHUBTOKEN 能够执行任何写操作作为概念验证,他使用 RepoReaper 在开源项目 clair 上创建了一个无害的分支。
攻击者可以使用自己的 RepoReaper 版本扫描工作流中的 GITHUBTOKEN,并自动利用该令牌将其恶意代码推送到目标仓库。
如何保护 GitHub Actions 工件中的令牌
正如前面提到的,开源项目维护者可能并不清楚,含有潜在敏感数据和令牌的工件已经被发布在他们的仓库;此外,他们可能并未意识到在工作流中默认生成的 GITHUBTOKEN,即使在特定作业中不必要。
为了防止泄露这些令牌,进而可能导致项目的风险,项目维护者应定期审查工件的创建与权限设置,确保含有秘钥的工件不会自动发布,并在其工作流中对运行者令牌的权限进行最小化配置,Avital 说道。
Avital 已将泄露的信息报告给数十名被