GitHub Actions令牌泄露与供应链攻击风险详解
本文综合分析了多个与GitHub Actions安全相关的公开资料,核心聚焦于一个具体的漏洞(CVE-2025-31479)及其背后揭示的更大范围的供应链攻击风险。
CVE-2025-31479:令牌信息泄露漏洞
漏洞概述:
canonical/get-workflow-version-action 是一个GitHub复合操作(composite action),用于获取调用可重用工作流(reusable workflow)时所用的提交SHA。在1.0.1版本之前,如果该操作步骤执行失败,其异常输出中可能包含GITHUB_TOKEN。
关键风险点:
- 部分令牌泄露:虽然GitHub会自动从日志中屏蔽(redact)完整的密钥,但如果令牌在输出时被截断,则其部分内容会以明文形式显示在GitHub Actions的日志中。
- 日志可访问性:任何对仓库有读取权限的人都可以查看Actions日志。对于公开仓库,任何人都可以查看这些日志。
- 有限的攻击窗口:
GITHUB_TOKEN会在作业(job)完成后自动撤销。然而,在令牌显示在日志中到作业完成之间,存在一个攻击机会窗口。虽然通常时间极短(可能不足一秒),但如果在该步骤中使用了continue-on-error,或同一作业的后续步骤使用了状态检查功能,这个窗口期可能会延长。
影响与修复:
- 受影响版本:< 1.0.1
- 已修复版本:1.0.1
- 受影响用户:使用了
github-token输入参数的用户。 - 补救措施:
- 更新到v1.0.1或更高版本。
- 在漏洞存在期间可能已部分泄露的
GITHUB_TOKEN通常无需特别处理,因为它们已在作业完成后自动撤销。 - 重要提醒:如果有用户在此输入中使用了长期有效的密钥(如个人访问令牌),应立即撤销该密钥。
漏洞评分:
- CVSS 3.1 评分:8.2(高危)
- 向量:AV:N/AC:H/PR:L/UI:N/S:C/C:N/I:H/A:H
- 相关弱点:CWE-532 - 将敏感信息插入日志文件
从令牌泄露到供应链攻击:一个真实的案例
CVE-2025-31479中提到,短暂的令牌暴露窗口可能被利用。相关研究文章《CodeQLEAKED》详细描述了一个与此逻辑相似的、已证实的潜在攻击路径。
攻击链条:
- 秘密泄露:研究人员通过扫描公开的GitHub Actions工作流构件(artifacts),在一个
github/codeql-action仓库的构件中发现了具有完全写入权限的GITHUB_TOKEN。该令牌被记录在运行器的环境变量文件中。 - 关键条件:
- 写入权限:令牌拥有对仓库内容、Actions和软件包的写入权限。
- 可及时访问:相关构件使用了允许在作业完成前下载构件的API版本(v4)。
- 时间窗口:分析日志发现,从“完成构件上传”到作业“清理孤儿进程”结束,存在约1.022秒的时间窗口。攻击者需要在此窗口内完成下载、提取令牌并利用它。
- 概念验证(PoC)与影响:研究人员编写了名为
artifact_racer.py的脚本进行自动化攻击测试。该脚本成功监控到目标工作流运行,在短暂窗口内获取令牌,并利用该令牌在目标仓库中创建了新分支、推送了文件并创建了新标签。
攻击升级:供应链攻击潜力 如果攻击者不仅仅满足于污染单个仓库,可以利用此能力发起供应链攻击:
- 代码注入:将恶意代码添加到任何未受保护的分支,尤其是等待合并的功能分支,静候代码被合并到主分支。
- 标签劫持:创建指向特定提交的标签(例如
v3)。任何在工作流中引用@v3的用户都会执行恶意代码。 - 扩大影响:大多数用户并非手动添加CodeQL Actions,而是通过在仓库设置中“启用CodeQL”来使用。如果攻击者能通过污染
github/codeql-action仓库来影响这些自动注入的工作流,其影响范围将急剧扩大。
高级攻击工具:Cacheract与缓存投毒
另一份资料介绍了一个名为Cacheract的概念验证工具,它展示了如何利用GitHub Actions缓存机制实现持久化和攻击。
核心原理:Cacheract是一种针对GitHub Actions构建流水线的工具,其核心思想是,被投毒的GitHub Actions缓存为在受害流水线内实现任意代码执行和文件修改提供了直接路径。
工作模式:
- 初始感染:通过任意代码执行(例如,受污染的依赖包、漏洞利用)在默认分支的工作流中部署Cacheract。
- 缓存投毒与持久化:
- 如果运行时拥有的
GITHUB_TOKEN具有actions: write权限,它会下载原始缓存条目,添加恶意负载,删除旧条目,并重新上传新的、被投毒的缓存条目。 - 为了持久化,它会检查所有非默认分支中存在的唯一缓存键和版本,并为它们在默认分支中设置条目,从而在原始缓存键更改后仍然存在。
- 如果运行时拥有的
- 文件覆写:Cacheract支持“替换”功能,可以将目标文件(如
package.json或源代码文件)替换为后门版本。当后续工作流命中该缓存时,这些文件将被覆盖,从而在构建过程中引入恶意行为。 - 信息收集:每次运行时,它都会将流水线信息报告给外部Webhook。在特定条件下,它还能从内存中静默提取流水线的所有秘密并发送出去。
防御建议:
- 切勿从不信任的来源使用缓存。
- 严格控制
GITHUB_TOKEN的权限,遵循最小权限原则。 - 定期清理缓存条目。
- 审查工作流日志中是否存在异常活动。
总结与安全建议
CVE-2025-31479揭示了一个看似微小(部分令牌泄露)却可能在某些条件下被串联利用的安全风险。结合相关研究,我们可以得到以下启示:
- 秘密管理至关重要:即使像
GITHUB_TOKEN这样的短期凭证,在泄露时也可能造成严重危害。必须严防任何形式的秘密泄露,包括日志、构件和错误信息。 - 最小权限原则:始终为
GITHUB_TOKEN和工作流分配完成任务所需的最小权限。避免授予不必要的“写入”权限。 - 警惕供应链风险:广泛使用的平台和工具(如GitHub Actions、CodeQL)是高级供应链攻击的高价值目标。维护者需要极高的安全标准,而使用者应关注官方公告,及时更新依赖。
- 理解并监控缓存:Actions缓存是提升速度的功能,但也可能成为攻击载体。需要对缓存的使用保持警觉,尤其是来自上游或公共源的缓存。
- 及时更新与修补:对于使用的Actions、可重用工作流等依赖,及时应用安全更新是阻断已知漏洞利用的最有效方法。
安全是一个持续的过程,在享受CI/CD带来的自动化便利的同时,必须对其潜在的安全风险保持清醒的认识并采取积极的防护措施。