乐于分享
好东西不私藏

当安全工具本身成为攻击载体:Trivy 供应链攻击事件深度解析

当安全工具本身成为攻击载体:Trivy 供应链攻击事件深度解析

你用来发现漏洞的工具,正在悄悄偷走你的密钥。

引言:安全悖论

2026年3月19日,一个普通的周三下午。全球数千个 CI/CD 流水线照常运行,安全扫描工具 Trivy 默默守护着代码仓库。

但没有人意识到,守护者已经变成了入侵者

在短短12小时内,攻击者通过被污染的 Trivy 生态系统,窃取了无数企业的云凭证、数据库密码、SSH 密钥,甚至加密货币钱包私钥。

这不是科幻小说,这是真实发生的供应链攻击事件。

事件回顾:一条精心设计的攻击链

第一幕:潜伏

故事要从2026年2月底说起。攻击者通过某种方式获取了 Trivy 项目的访问凭证。3月1日事件首次披露后,项目团队进行了凭证轮换。

但问题在于:凭证轮换不是原子操作

在轮换窗口期内,攻击者利用仍有权限的旧凭证,窃取了新凭证。这就像你发现家里进了贼,换了一把锁,但忘记收回备用钥匙——贼手里已经有了新锁的钥匙。

第二幕:布局

3月19日,攻击者发动了组合拳:

1. 发布恶意版本 v0.69.4

攻击者推送了一个看似正常的 commit,但其中暗藏玄机:

  • 将 actions/checkout 引用替换为恶意 commit

  • 从仿冒域名下载恶意代码

  • 跳过二进制验证流程

2. 劫持历史标签

强制推送了 76 个版本的 trivy-action 标签,注入信息窃取器。这意味着即使你使用的是两年前的版本标签,也会被攻击。

3. 污染安装工具

所有 7 个 setup-trivy 标签都被替换为恶意版本。

第三幕:收割

恶意代码极其专业,攻击目标覆盖:

  • 云平台凭证:AWS、GCP、Azure、Kubernetes

  • 数据库密码:MySQL、PostgreSQL、Redis、MongoDB

  • SSH 密钥:私钥、授权密钥、已知主机

  • Docker 配置:容器镜像仓库凭证

  • 加密货币钱包:Bitcoin、Ethereum、Solana 等

  • CI/CD 配置:GitLab CI、Jenkins、Terraform 状态

  • Shell 历史记录:可能包含敏感命令和凭证

更可怕的是它的备用泄露机制:如果直接外传失败,它会用你的 GitHub PAT 在你的账号下创建一个公开仓库 tpcp-docs,把偷来的数据作为公开 release 发布。

你的密钥,就这样变成了公开资产。

深度思考:开源软件的安全困境

困境一:信任链条的脆弱性

现代软件是一个层层叠加的信任链条:

你的应用                  → 依赖库 A                  → 依赖库 B                  → 构建工具 C                  → CI/CD 平台 D                  → … ?

每一层都可能成为攻击入口。Trivy 事件中,攻击者选择的切入点是 GitHub Actions——一个被广泛信任的自动化工具。

你信任了 Trivy,Trivy 信任了 GitHub Actions,而 Actions 的标签是可以被劫持的。

困境二:版本标签的”可变性陷阱”

这是 Git 设计中的一个经典安全陷阱:

  • 标签 理论上应该是不可变的

  • 但实际上,git tag -f 可以强制覆盖标签

  • GitHub 的 immutable releases 功能需要主动开启

在这次事件中,攻击者正是利用了这一点:两年前的版本标签 0.0.1 被强制推送到恶意 commit,用户以为自己在用”稳定老版本”,实际在执行恶意代码。

困境三:凭证管理的”窗口期风险”

凭证轮换是安全标准操作,但如何轮换往往被忽视:

串行轮换 ❌ 危险

存在窗口期,攻击者可窃取新凭证

原子轮换 ✅ 安全

同时撤销所有旧凭证,立即启用新凭证

Trivy 事件就是”串行轮换”的典型案例。在几天的窗口期内,攻击者完成了凭证转移。

困境四:开源项目的”信任赤字”

开源软件面临一个根本性矛盾:

  • 开放性:源代码公开,理论上”更多人审计 = 更安全”

  • 实际性:大部分用户不会审计代码,只是盲目信任

Trivy 拥有 24,000+ GitHub Stars,是云原生安全领域的主流工具。但 stars 数量不等于安全审计质量。

当安全工具被攻破时,受害者往往是那些最注重安全的企业。

防御策略:从事件中学到的教训

策略一:固定到不可变引用

❌ 危险:可变标签

– uses: aquasecurity/trivy-action@0.34.0

✅ 安全:不可变 SHA

– uses: aquasecurity/trivy-action@a95a2d8e5c0d4b5e8f7a9b0c1d2e3f4a5b6c7d8e

关键原则:版本标签是名字,commit SHA 才是身份。

策略二:验证发布物完整性

使用 sigstore 签名验证:

Bash                  # 验证二进制签名                  cosign verify-blob \                  –certificate-identity-regexp ‘https://github\.com/aquasecurity/’ \                  –certificate-oidc-issuer ‘https://token.actions.githubusercontent.com’ \                  –bundle artifact.sigstore.json \                  artifact.tar.gz                  # 验证容器镜像                  cosign verify \                  –certificate-identity-regexp ‘https://github\.com/aquasecurity/’ \                  ghcr.io/aquasecurity/trivy:0.69.2

关键原则:不仅验证”这是正确的文件”,还要验证”这是在安全时间点发布的文件”。

策略三:启用不可变发布

GitHub 的 immutable releases 功能一旦启用,就无法删除或覆盖已发布的 release。

应该在项目早期就启用此功能,而不是在事件发生后。

策略四:最小权限原则

CI/CD 环境中的凭证应该:

  • 只拥有完成任务所需的最小权限

  • 设置较短的有效期

  • 定期轮换(且要原子轮换)

  • 隔离不同环境的凭证

策略五:监控异常行为

建立检测机制:

  • 监控是否存在意外的公开仓库创建

  • 检查 CI/CD 日志中的异常网络请求

  • 追踪敏感文件的访问记录

更深层的思考

开源安全的未来

这次事件暴露了一个残酷的现实:开源供应链攻击正在成为主流攻击手段

原因很简单:

  • 一次攻击,影响面极大(Trivy 被数万企业使用)

  • 攻击隐蔽性强(嵌入信任链条)

  • 持续时间长(历史版本标签也会被污染)

我们需要什么样的安全?

传统的安全思维是”检查清单式”:

✅ 使用安全扫描工具

✅ 定期更新依赖

✅ 启用双因素认证

但供应链攻击告诉我们:安全工具本身也可能是攻击载体

我们需要建立的是”零信任”思维:

  • 不因为”这是安全工具”就信任它

  • 不因为”这是老版本”就认为安全

  • 不因为”有签名”就完全信任(签名时间也很重要)

写在最后

Trivy 事件不是孤例,也不会是最后一例。

从 SolarWinds 到 Log4j,从 event-stream 到这次 Trivy,供应链攻击已经成为国家级攻击者和高级威胁组织的首选武器。

对于开源生态:

  • 项目维护者需要更严格的发布流程

  • 平台需要提供更好的安全机制

  • 用户需要更谨慎的信任策略

在软件供应链时代,每一次 npm installpip installdocker pull,都是一次信任决策。

谨慎一点,不会错。

附录:事件关键时间线

2026年2月底 – 初始攻击开始

2026年3月1日 – 首次披露,凭证轮换

2026年3月3-4日 – 启用 immutable releases

2026年3月19日 17:43 UTC – 攻击者开始活动

2026年3月19日 18:22 UTC – 恶意 v0.69.4 发布

2026年3月19日 21:42 UTC – v0.69.4 移除(暴露约 3 小时)

2026年3月20日 05:40 UTC – trivy-action 清理(暴露约 12 小时)

参考来源

  • https://github.com/aquasecurity/trivy/security/advisories/GHSA-69fq-xp46-6×23

  • https://github.com/aquasecurity/trivy/discussions/10425

本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » 当安全工具本身成为攻击载体:Trivy 供应链攻击事件深度解析

猜你喜欢

  • 暂无文章