本文面向:在 GitHub Actions 等 CI 中运行 Trivy(容器镜像和依赖的漏洞扫描器)、aquasecurity/trivy-action 或 aquasecurity/setup-trivy 的人,以及在工作站或服务器上使用 Trivy 二进制文件或容器镜像的人。
本文依据 Aqua Security 的官方说明和 Trivy 的安全公告撰写,不涉及攻击手法或入侵指标(IoC)的具体值。
CI 用户今天该做什么
检查受影响时间段内是否运行过与 Trivy 相关的工作流
Aqua 请用户检查2026年3月19日至20日的工作流运行日志。公告中的时间段(UTC)如下:
- trivy-action:3月19日约17:43 至3月20日约05:40
- setup-trivy:3月19日约17:43 至约21:44
- Trivy v0.69.4:3月19日18:22 至约21:42
- Docker Hub 镜像 v0.69.5 和 v0.69.6:3月22日15:43 至3月23日约01:40
如果你的组织有很多工作流,搜索引用了 aquasecurity/trivy-action 和 aquasecurity/setup-trivy 的工作流,再按这些时间段筛选运行记录。
不只看版本,还要看引用方式
在公告中,关键在于你是怎样引用这个组件的。
- trivy-action——受影响:0.35.0 以外的任何标签(0.0.1–0.34.2);在时间段内显式设置
version: latest;按 SHA 固定在2025年4月9日之前的提交。不受影响:0.35.0 标签;按 SHA 固定在2025年4月9日之后的安全提交。 - setup-trivy——受影响:任何没有按 SHA 固定的使用方式。不受影响:按 SHA 固定在安全提交上。
- Trivy 本身——受影响:v0.69.4(包括时间段内的
latest;GitHub、deb、rpm、get.trivy.dev、GHCR、ECR Public、Docker Hub),以及 Docker Hub 的 v0.69.5 和 v0.69.6。不受影响:v0.69.3 及更早版本;按摘要引用的镜像;从源码构建;官方 Homebrew 公式。
如果受影响,轮换该作业能读取的所有密钥
Aqua 表示,只要被入侵的版本有可能运行过,受影响流水线能访问的所有密钥都必须视为已暴露:云凭据(AWS、GCP、Azure)、Git 凭据、容器镜像仓库凭据、SSH 密钥、Kubernetes 令牌,以及环境变量和其他自动化密钥。
它要求把 npm 发布令牌视为已被实际攻破,称被盗的令牌正被用来在 npm 上传播恶意软件。对于自托管运行器,Aqua 还列出了保存在运行器上的数据库凭据、TLS 私钥和 VPN 配置。
先让所有旧密钥失效,再统一签发新密钥
这一步来自 Trivy 自身的根本原因。据 Aqua 称,3月1日的轮换没有一次性完成;在持续数天的轮换期间,攻击者可能用一个仍然有效的令牌,连新签发的密钥也拿走了。
列出范围内的密钥之后,先统一让旧密钥失效,再签发新密钥。逐个轮换会留下空隙,让仍然有效的旧密钥读到新密钥。代价是短暂的服务中断,请提前做好安排。
按公告的检查清单,检查你的 GitHub 组织和运行过 Trivy 的机器
Aqua 列出的检查项目包括:如果使用了备用的外传路径,你的 GitHub 组织中可能会被创建一个仓库;以及在 CI 之外(例如开发者工作站)运行过 v0.69.4 的机器上留下的文件。如果你可能受到影响,请按照下方链接中 Aqua 的说明和公告里的检查清单进行检查(本文不转载指标值)。
迁移到已知安全的版本
Aqua 列出的安全版本是 Trivy v0.69.2 和 v0.69.3、trivy-action v0.35.0、setup-trivy v0.2.6。根据公告,旧的 trivy-action 标签(0.0.1–0.34.2)已被删除,不能以相同名称重新创建,因此以加上 v 前缀的形式重新发布(例如 v0.34.0),指向原来的合法提交(少数尚未恢复)。如果你仍然引用旧版本,需要更新引用。
需要检查 CI 配置中的哪些地方
按提交 SHA 固定 Action 的基本规则,在TanStack、Nx Console 与 GitHub 的连锁事件中已有说明。这里重点讲 Trivy 事件带来的新内容。
检查按 SHA 固定的 Action 内部是否按标签调用了其他组件
根据公告,trivy-action 在2025年4月9日合并的一个拉取请求中,把内部组件的引用改为了 SHA 固定。把 trivy-action 固定在更早提交上的人,得到的是一个安全的 trivy-action,但它会按标签调用恶意的 setup-trivy。
如果你使用由其他 Action 组合而成的 Action(复合 Action),请打开你所固定提交中的 action.yml,检查其中的 uses: 行是否按 SHA 固定。如果没有,请换到更新的提交,或者在你自己的工作流中直接按 SHA 固定调用内部组件。
在组织设置中强制 SHA 固定,而不是交给个人自觉
2025年8月,GitHub 在允许使用的 Action 策略中加入了一个选项,要求 Action 必须固定到完整的提交 SHA。它可以在企业、组织或仓库级别设置,使用未固定 Action 的工作流会失败。同一策略还能阻止特定的 Action 或版本,这也让你在类似这次的事件中,可以在整个组织范围内封锁受影响的版本。
不要只依赖“Immutable”标记
根据公告,Trivy v0.69.3 和 trivy-action 0.35.0 之所以幸免,是因为在发布之前就启用了 GitHub 的不可变发布(immutable releases)。但 Aqua 表示,被改写的标签旁边也出现了“Immutable”标记,可靠的保护措施是固定到完整的提交 SHA,而不是这个标记。该标记描述的是发布那一刻的状态。
二进制文件固定版本并验证签名,镜像按摘要引用
在公告中,按摘要(@sha256:…)引用的镜像不受影响。只按 latest 或版本标签拉取的,会在时间段内拿到恶意构建。Trivy 的公告还说明了如何用 Sigstore 签名和签名时间戳来验证二进制文件和镜像。对于 CI 下载的工具,写明版本,并尽可能按摘要或校验和固定。
在不持有部署密钥的作业中运行扫描器
据 Aqua 称,恶意代码在合法扫描之前运行,扫描输出看起来一切正常,因此很难察觉。扫描通常不需要对云或镜像仓库的写权限。把扫描放在一个不接收部署密钥的独立作业中运行,并把 permissions: 设为只读。
据 Aqua 称,备用的外传路径只有在工作流中传入了个人访问令牌(PAT)时才能生效,使用默认的 GITHUB_TOKEN 时会失败。请确认你没有把个人令牌交给扫描步骤。
发生了什么(依据 Aqua Security 的说明)
以下内容均依据 Aqua Security 的说明(3月22日的首次发布及截至4月1日的更新)和 Trivy 的安全公告。时间为 UTC。
2026年2月下旬
Trivy 的 GitHub Actions 环境中的配置错误被利用,一个特权访问令牌被提取。3月1日
Trivy 团队公开了这起事件并轮换凭据。据 Aqua 称,轮换没有一次性完成,攻击者通过仍然有效的凭据保住了访问权限。3月19日 约17:43
trivy-action 的 77个标签中有76个、setup-trivy 的全部7个标签被指向恶意提交。与此同时,一个被入侵的服务账户触发了发布自动化,发布了恶意的 Trivy v0.69.4(制品从18:22起可获取)。3月19日 约20:38
Trivy 团队识别并控制了攻击,从分发渠道中移除了恶意制品。3月20日
发布安全版本、用户指引和入侵指标。3月21日
发布安全公告 GHSA-69fq-xp46-6x23(CVE-2026-33634)。3月22日
恶意镜像 v0.69.5 和 v0.69.6 被推送到 Docker Hub(使用另外被盗的 Docker Hub 凭据)。同一天,Aqua 的内部仓库在未经授权的情况下在 GitHub 上被公开。Aqua 表示,攻击者在最初的控制措施之后重新获得了访问权限。3月23日
Aqua 请外部事件响应公司参与调查。另一款 Aqua 扫描器 KICS 的 GitHub Action 也被发现遭到同期入侵。4月1日
Aqua 表示调查已接近收尾,仍然没有迹象显示其商业产品受到影响。
- 受影响范围
- Trivy v0.69.4(二进制文件、deb/rpm、容器镜像)、Docker Hub 的 v0.69.5 和 v0.69.6、除 0.35.0 以外的所有 trivy-action 标签、所有 setup-trivy 标签
- 代码做了什么
- 从 CI 运行器和机器上收集云、SSH、Kubernetes、Docker、Git 和数据库凭据以及
.env文件,加密后发送出去。它在合法扫描之前运行,所以结果看起来正常 - 原因
- 2月下旬通过 GitHub Actions 配置错误提取了一个特权令牌;由于3月1日的轮换不是原子操作,访问权限被保留了下来
- Aqua 的应对
- 从所有渠道删除恶意制品;删除被改写的标签或将其重新指向经过验证的提交;锁定开源组织中的所有自动化、服务账户和令牌;减少对长期凭据的依赖;引入不可变发布验证和来源证明(provenance attestation)
- 不受影响
- 商业产品,包括 Aqua Platform 中的 Trivy(构建在与 GitHub 分开的基础设施上,不共享密钥或签名系统)
阅读提示:没有公布受害数量
Aqua 表示,由于 Trivy 是开源软件,它没有完整的用户记录,也无法直接通知每一位用户。受影响组织的数量没有公布,本站也不刊登估计数字。
Aqua 的说明中还提到了攻击者以及协助分析的外部公司的名称;按照本站的方针,我们只写出公开这起事件的组织名称。请根据你的工作流是否在受影响时间段内、以受影响的引用方式运行过来判断,而不是根据新闻标题里的数字。
在哪个环节可以阻止
1. 2月下旬 – 3月1日
令牌被提取;轮换花了好几天
↓→
教训(在你的组织中)
先全部停用,再统一重新签发
2. 3月19日:标签被改写
同样的标签名现在指向恶意提交
↓→
可以阻止它的设置
用策略强制 SHA 固定,内部组件也固定
3. 恶意的 v0.69.4 和 latest
通过所有官方渠道分发
↓→
可以阻止它的设置
明确版本、使用摘要、验证签名
4. 你的 CI 作业
扫描运行之前密钥已被收集
↓→
限制损害
扫描作业中不放密钥和个人令牌
受影响的引用方式(依据公告)
trivy-action@0.34.2这类标签引用(0.35.0 以外的任何标签)- 显式的
version: latest(在二进制文件的时间段内) - 按 SHA 固定在2025年4月9日之前的提交(内部按标签调用 setup-trivy)
- 任何没有按 SHA 固定的
setup-trivy引用 latest或0.69.4这类镜像标签
不受影响的引用方式
trivy-action@0.35.0(发布前已启用不可变发布)- 按 SHA 固定在2025年4月9日之后的安全提交
- 按 SHA 固定在安全提交上的
setup-trivy - 按摘要引用的镜像
- Trivy v0.69.3 及更早版本、从源码构建、官方 Homebrew 公式
本站的看法:怀疑被入侵时,一次性替换所有密钥
密钥轮换通常是逐个进行的,从不太重要的开始,不停机。避免停机确实有好处,但 Trivy 事件表明,这种做法无法切断仍然持有访问权限的攻击者。据 Aqua 称,在持续数天的轮换期间,一个仍然有效的令牌可能被用来连新签发的密钥也拿走,进而导致了三周后的恶意发布。
怀疑被入侵时,按以下顺序轮换:(1) 列出所有密钥以及可以从哪里读取它们,(2) 统一让旧密钥失效,(3) 然后才签发新密钥,(4) 确认旧密钥确实已无法使用。请预留短暂的停机时间。新旧密钥并行的常规做法,前提是什么都没有泄露。
还有一点。漏洞扫描器是防御工具,所以它往往比 CI 中几乎任何其他东西运行得更广、权限更大。不要因此放松警惕:让它在读不到你密钥的作业中运行。
信息来源(公开资料)
本文中的事实来自以下公开资料。不涉及攻击手法、IoC 值和识别攻击者的信息。
- Aqua Security,“Trivy Supply Chain Attack: What You Need to Know”(2026年3月22日首次发布,4月1日更新)— aquasec.com
- Trivy 安全公告,“Trivy ecosystem supply chain temporarily compromised”,GHSA-69fq-xp46-6x23(CVE-2026-33634;3月21日发布,3月30日更新)— github.com
- Trivy,“Trivy Security incident 2026-03-19”(GitHub Discussions,Trivy 团队的状态更新)— github.com
- GitHub Changelog,“GitHub Actions policy now supports blocking and SHA pinning actions”(2025年8月15日)— github.blog
- GitHub Docs,“Secure use reference”(使用第三方 Action)— docs.github.com
更新记录
2026-09-30:初版,依据 Aqua Security 的说明(4月1日更新)和 Trivy 的安全公告(3月30日修订版)。
延伸阅读
- SHA 固定,以及为什么不应让一个人就能发布:TanStack、Nx Console 与 GitHub 的连锁事件
- 被盗 npm 令牌的吊销顺序:防御 npm 供应链蠕虫
- 密钥放在哪里:.env 文件和 API 密钥为什么有风险 / 用 gitleaks 在提交前拦截密钥
- 平台的环境变量泄露时:Vercel 安全事件后开发者该做什么
- 2026年的其他事件:2026年的数据泄露与网络攻击
FAQ
Q哪些 Trivy 版本受到影响?
根据 Trivy 的安全公告 GHSA-69fq-xp46-6x23(CVE-2026-33634),受影响的制品是 Trivy v0.69.4(通过 GitHub、deb、rpm 和 get.trivy.dev 分发的二进制文件,以及 GHCR、ECR Public 和 Docker Hub 上的容器镜像;在暴露时间段内 latest 标签也指向它),以及发布到 Docker Hub 的容器镜像 v0.69.5 和 v0.69.6。v0.69.3 及更早版本、按摘要(digest)引用的镜像、从源码构建的二进制文件以及官方 Homebrew 公式不受影响。
Q我在用 trivy-action,受影响吗?
根据公告,以下情况受影响:引用了 0.35.0 以外的任何标签(0.0.1 至 0.34.2);在二进制文件暴露时间段内显式设置了 version: latest;或按 SHA 固定在2025年4月9日之前的提交。0.35.0 标签以及按 SHA 固定在2025年4月9日之后安全提交上的不受影响。标签被改写的时间是2026年3月19日 UTC 约17:43 至3月20日约05:40。
Q我在用 setup-trivy,受影响吗?
根据公告,凡是没有按 SHA 固定的使用方式都受影响。全部7个标签(v0.2.0 至 v0.2.6)在3月19日 UTC 约17:43 至约21:44 之间被指向恶意提交。按 SHA 固定在安全提交上的不受影响,v0.2.6 已用安全内容重新创建。
Q如果受影响了,该怎么做?
Aqua 表示,只要被入侵的版本有可能在你的环境中运行过,受影响流水线能访问的所有密钥都必须视为已暴露并立即轮换:云凭据(AWS、GCP、Azure)、Git 凭据、容器镜像仓库凭据、SSH 密钥、Kubernetes 令牌、环境变量及其他自动化密钥。它表示 npm 发布令牌应视为已被实际攻破。
Q原因是什么?
据 Aqua 称,2026年2月下旬,攻击者利用 Trivy 的 GitHub Actions 环境中的配置错误,提取了一个特权访问令牌。3月1日公开了这起事件并轮换了凭据,但轮换不是原子操作(花了几天),攻击者可能用一个仍然有效的令牌拿到了新轮换的密钥。Aqua 表示这使得3月19日的恶意发布成为可能。
QAqua Security 的商业产品受影响了吗?
Aqua 表示,没有迹象显示其商业产品受到影响,包括 Aqua Platform 中提供的 Trivy。它解释说,商业平台与 GitHub 分开构建和运营,不共享仓库、CI/CD 基础设施、密钥或签名系统,并且只在经过把关的安全审查后才引入开源版本。这一说法不适用于直接使用开源 Trivy 的情况。