文章总结: 本文详述安全工具xygeni-action遭供应链投毒事件。攻击者利用可变标签机制篡改v5标签植入后门窃取CI/CDSecrets,揭示标签缺乏完整性保证的结构性风险。文章分析了攻击与响应失误,建议立即排查轮换凭据,强调应使用不可变提交SHA替代可变标签以从根本上防御此类攻击。
综合评分: 96
文章分类: 供应链安全,漏洞分析,安全建设,应急响应,漏洞预警
当安全工具本身成为武器:一次针对 CI/CD 流水线的隐秘供应链投毒事件
原创
CVE-SEC
CVE-SEC
CVE-SEC
2026年3月13日 10:00
四川
当安全工具本身成为武器:一次针对 CI/CD 流水线的隐秘供应链投毒事件
CVE-2026-31976 | CVSS 9.3 Critical | 披露时间:2026-03-11
一个反常的开始
2026 年 3 月 9 日,一名 GitHub 用户在 xygeni/xygeni-action 仓库提交了一条 Issue,内容只有一句话:
“v5 标签指向了一个恶意提交,所有使用 v5 的人都已经被入侵了。”
这条报告揭开了一起持续了整整 7 天、攻击者全程隐身、受害者毫无感知的供应链投毒事件。
更具讽刺意味的是,xygeni-action 是一款专门用于检测供应链安全风险的工具。
被攻击的目标是谁
Xygeni 是一家专注于软件供应链安全的 SaaS 厂商,其核心产品包括依赖风险分析、泄露密钥扫描、SAST 等安全能力。xygeni-action 是其发布于 GitHub Marketplace 的官方 Action,供用户在 CI/CD 工作流中集成 Xygeni 安全扫描器,使用方式如下:
- uses: xygeni/xygeni-action@v5
with:
token: ${{ secrets.XYGENI_TOKEN }}
根据 GitHub Dependency Graph 统计,全球约 356 个代码仓库依赖该 Action。
攻击是如何发生的
第一步:凭据失守
攻击者通过未知方式(研究人员推测可能为钓鱼攻击或凭据数据库泄露)获取了 Xygeni 仓库维护者 nico-car 的 GitHub 个人访问令牌,以及 Xygeni 官方 GitHub App xygeni-onboarding-app-dev[bot] 的私钥。
第二步:三次试探,全部失败
2026 年 3 月 3 日上午,攻击者在 23 分钟内连续提交了三个 Pull Request(PR #46、#47、#48),每个 PR 都在 action.yml 中插入了伪装成”扫描器遥测”步骤的恶意 Shell 代码。
Xygeni 的分支保护规则发挥了作用,三个 PR 均未被合并至主分支。
到这里,这本应是一次被拦截的入侵尝试。但攻击者随即切换了攻击路径。
第三步:标签投毒,无声渗透
攻击者意识到合并 PR 的路径被堵死,转而利用一个更隐蔽的机制——GitHub 的可变标签(mutable tag)。
GitHub 允许拥有仓库写权限的人将任意标签强制移动至任意提交。这个操作不需要代码审查,不需要 PR,不留下任何仓库活动日志记录,也不会向任何下游用户发送通知。
攻击者利用被盗的 GitHub App 私钥,在约 10:49 UTC,将 v5 标签从合法的 v5.38.1 发布版本强制移动至恶意提交 4bf1d4e19ad81a3e8d4063755ae0f482dd3baf12。
主分支代码完好无损,分支保护规则形同虚设,攻击已经完成。
后门在做什么
恶意代码被命名为”Report Scanner Telemetry”,插入在合法扫描安装步骤之后、实际扫描之前。它以 & 操作符在后台静默运行,不影响任何工作流的正常输出。
其通信流程分三个阶段:
注册阶段:向 C2 服务器 91.214.78.178 发送 POST 请求,报告当前 Runner 的主机名、用户名和操作系统信息。通信使用自定义认证头,并通过 nip.io DNS 通配符服务掩盖实际 IP。
轮询阶段:在 180 秒窗口内,每隔 2 至 7 秒向服务器请求一次命令,通过 eval 直接执行返回的任意 Shell 指令。
回传阶段:将命令执行结果经 zlib 压缩、Base64 编码后,POST 回 C2 服务器。
整个过程中,受害 CI Runner 上存储的所有内容均处于可被窃取状态:GITHUB_TOKEN、所有 GitHub Secrets(云服务密钥、API Token、代码签名证书)、当前工作区的源代码,以及 GITHUB_TOKEN 可访问的上下游仓库。
攻击者可以在不留任何痕迹的情况下静默退出,受害方的工作流日志显示一切正常。
第一次应急响应的失误
2026 年 3 月 9 日,社区报告触发后,Xygeni 在数小时内关闭了三个恶意 PR,并从主分支删除了相关工作流文件。
然而攻击并未因此中止。
关闭 PR 和清理主分支代码,对被投毒的 v5 标签没有任何影响。只要 v5 标签还指向恶意提交,所有使用 @v5 的工作流就会继续执行后门程序。
直到次日(3 月 10 日),Xygeni 才删除并重建了 v5 标签,完成实质性修复。这意味着攻击在社区公开报告后又额外持续了约 24 小时。
这一判断失误暴露出一个关键认知盲区:在 GitHub Actions 供应链投毒事件中,标签本身才是攻击载体,而不是代码。
这不是一次孤立的事件
CVE-2026-31976 并非偶然。在过去一年中,GitHub Actions 供应链攻击正在形成明显的规律性浪潮:
- 2025 年,tj-actions/changed-files(CVE-2025-30066)遭到相同手法的标签投毒,影响超过 23,000 个仓库,大量项目的 Secrets 在 CI 日志中被明文暴露。
- 2025 年,reviewdog/action-setup@v1(CVE-2025-30154)同样经历类似入侵。
- 2026 年,xygeni-action 事件再次证明:即使是安全工具厂商自身,也无法天然免疫这类攻击。
可变标签是 GitHub Actions 供应链攻击的核心载体,这一判断已被多起真实事件反复验证。
如何判断自己是否受到影响
如果你的仓库工作流在 2026 年 3 月 3 日至 3 月 10 日期间运行过引用 xygeni/xygeni-action@v5 的流水线,需要立即进行排查。
检查 CI 运行日志,搜索以下关键字:
91.214.78.178
security-verify.91.214.78.178.nip.io
Report Scanner Telemetry
X-B:
检查网络流量记录,筛查 Runner 是否存在对 91.214.78.178 的出站连接,重点关注 180 秒内以 2 至 7 秒间隔出现的轮询模式。
检查工作流文件,确认当前是否仍在使用可变标签引用:
grep -r "xygeni/xygeni-action@v5" .github/workflows/
如果确认受影响,需要做什么
第一步,立即更新工作流引用方式,将所有 @v5 替换为固定的提交 SHA:
# 修改前
uses: xygeni/xygeni-action@v5
# 修改后
uses: xygeni/xygeni-action@13c6ed2797df7d85749864e2cbcf09c893f43b23 # v6.4.0
第二步,立即轮换所有在暴露期间 Runner 可访问的凭据,包括但不限于 GitHub Secrets 中存储的云服务密钥(AWS Access Key、GCP Service Account、Azure Service Principal)、API Token 和代码签名证书。
第三步,对暴露期间生成的构建产物(二进制文件、容器镜像、发布包)进行完整性核查,评估是否需要重新构建和发布。
这件事的根本教训
此次事件揭示的核心问题不是某一款工具的安全缺陷,而是 GitHub Actions 生态的一个结构性信任缺口:
可变标签没有完整性保证。
@v5、@main、@latest 这类引用方式,在任何时刻都可能被拥有仓库写权限的人静默替换,GitHub 不记录这一操作,不通知下游用户,不提供任何告警机制。下游工作流文件本身看起来完全没有变化,但它实际执行的代码可能已经被替换为任意内容。
在这种机制下,对第三方 Action 的信任,本质上等于对该 Action 仓库所有具有写权限的账号及其凭据安全性的无条件信任。这个信任链的任何一个环节失效,就会引发此类事件。
目前已知的唯一可靠防御手段,是将所有 Action 引用固定至不可变的完整提交 SHA,并以此作为组织内部的强制性安全规范。
给 Action 维护者的建议
如果你维护的 GitHub Action 被其他项目引用,以下措施能够显著降低你的仓库成为攻击跳板的风险:
- 为所有版本标签启用标签保护规则,限制可执行强制推送的账号
- 强制要求所有标签指向的提交包含签名验证
- 遵循最小权限原则,GitHub App 私钥仅授予必要的最低权限
- 对贡献者账号定期审计,发现异常立即轮换凭据
- 推行发布不可变性策略,防止历史版本标签被移动
参考来源
- GitHub 官方安全公告(GHSA-f8q5-h5qh-33mh):https://github.com/xygeni/xygeni-action/security/advisories/GHSA-f8q5-h5qh-33mh
- 漏洞披露 Issue:https://github.com/xygeni/xygeni-action/issues/54
- NVD 收录:https://nvd.nist.gov/vuln/detail/CVE-2026-31976
- StepSecurity 技术分析:https://www.stepsecurity.io/blog/xygeni-action-compromised-c2-reverse-shell-backdoor-injected-via-tag-poisoning
- Dark Reading 报道:https://www.darkreading.com/application-security/xygeni-github-action-compromised-via-tag-poison
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:CVE-SEC CVE-SEC
CVE-SEC《当安全工具本身成为武器:一次针对 CI/CD 流水线的隐秘供应链投毒事件》