GitHub Actions供应链攻击:reviewdog/action-setup恶意代码漏洞深度解析

本文详细披露了reviewdog/action-setup@v1 GitHub Action遭供应链攻击的事件。攻击者在代码中植入恶意载荷,导致使用该Action的CI/CD流水线秘密凭证泄露至公共日志。文章分析了攻击链、技术细节、影响范围,并提供了应急响应与长期防护建议。

GitHub Action供应链攻击:reviewdog/action-setup恶意代码漏洞深度解析

事件概述

2025年3月11日18:42至20:31 UTC期间,流行的GitHub Action reviewdog/action-setup@v1 遭到供应链攻击。攻击者在其中植入了恶意代码,能够将CI/CD工作流中暴露的秘密凭证(secrets)转储到GitHub Actions的工作流日志中。

此次攻击是更广泛供应链攻击链的一环,并被认为可能是导致 tj-actions/changed-files 等其他知名Action后续被入侵的根源。Wiz Research的研究显示,此次攻击最终可能指向一个特定的高价值目标——Coinbase的coinbase/agentkit仓库,但Coinbase已确认此次入侵尝试未成功。

技术细节:攻击手法与载荷

入侵方式

与近期其他GitHub Action攻击事件不同,此次入侵并非通过“邀请工作流”(Invite workflow)恶意添加协作者账户所致。调查确认,一个关联账户本身遭到入侵,导致了action-setup的泄露。该Action的v1标签在此期间被指向了一个恶意提交(commit hash: f0d342d),随后又被强制推送(force-pushed)回旧的提交以掩盖入侵痕迹,表明攻击者目标明确且试图保持隐秘。

恶意载荷分析

恶意代码被直接注入到工作流使用的install.sh文件中。其技术特点包括:

  • 无外联渗透:与tj-actions/changed-files攻击中使用curl获取外部载荷不同,此次攻击的恶意代码是经过Base64编码后直接嵌入在脚本中的。
  • 内存转储:恶意代码会转储CI运行器的内存,其中包含工作流运行时加载的所有秘密。
  • 双重编码:被窃取的秘密在日志中会显示为双重Base64编码的字符串,以此进行混淆。在公共仓库中,这些包含秘密的日志将对所有人可见。

影响范围与关联攻击

直接影响

  • 核心受影响组件:只有reviewdog/action-setup Action的v1标签在特定时间窗口内受影响。使用哈希锁定(hash-pinned)版本或其他标签的用户不受影响。
  • 间接影响组件:由于reviewdog/action-setup被作为基础依赖,以下一系列其他reviewdog Action也受到影响,无论用户使用的是这些Action的哪个版本
    • reviewdog/action-shellcheck
    • reviewdog/action-composite-template
    • reviewdog/action-staticcheck
    • reviewdog/action-ast-grep
    • reviewdog/action-typos

供应链攻击链

证据表明,reviewdog/action-setup的入侵可能是tj-actions/changed-files被入侵的根源。因为tj-actions/eslint-changed-files Action使用了reviewdog/action-setup@v1,而tj-actions/changed-files仓库在运行该Action时使用了一个个人访问令牌(PAT)。两个事件的入侵时间窗口高度重合。

应急响应与补救措施

如何检测是否受影响

  1. 查询使用情况:使用GitHub查询在组织内的仓库中搜索对受影响Action的引用。
  2. 检查工作流日志:定位在受影响时间段(2025年3月11日)内运行的工作流任务。
  3. 识别恶意执行:展开“Run reviewdog/action-setup@v1”步骤。如果看到名为“🐶 Preparing environment …”的行,则表明恶意代码已运行。检查其中是否存在双重Base64编码的字符串。

针对性行动清单

如果确认受影响,请立即执行以下步骤:

  1. 立即停用:停止使用所有受影响的Action。
  2. 全面清理:从所有代码分支(不仅是主分支)中移除对这些Action的引用。
  3. 轮换密钥:尽快轮换所有已泄露的秘密凭证。
    • 注意:如果泄露的仅是前缀为ghs_的GitHub令牌,由于它们会在24小时或工作流完成后自动过期,风险相对有限。
    • 如果工作流未显式引用自定义秘密(如${{ secrets.MYSECRET }}),则敏感信息被泄露的风险较低。
  4. 处理日志:在删除工作流以清除日志前,建议先下载受影响时间段内的日志用于取证。

长期防护与最佳实践建议

为防止此类供应链攻击再次发生,建议采取以下措施:

  1. 使用哈希锁定:遵循GitHub建议,将所有GitHub Action的引用从版本标签(如@v1)改为完整的提交哈希值(SHA)。这是最有效的防御措施。
  2. 启用允许列表:使用GitHub的允许列表功能,阻止未经授权的GitHub Action运行。
  3. 审计历史日志:定期审计过去的工作流运行记录,查找可疑活动(如异常的出站网络请求)。优先审查CI运行器日志公开可访问的仓库。
  4. 保持警惕:关注安全公告,如本漏洞(CVE-2025-30154)已被列入CISA(美国网络安全与基础设施安全局)的“已知被利用漏洞目录”,并要求在2025年4月14日前完成缓解。

官方参考与资源

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计