周五凌晨,Aqua Security安全工程师Itay Shakury在GitHub上发布了一则简短声明。他用了最克制的技术语言,却藏不住事情的严重性——Trivy,这个被3.3万开发者标星、广泛嵌入CI/CD(持续集成/持续部署,一种自动化软件发布流程)管道的漏洞扫描工具,几乎全军覆没。
攻击者用被盗凭证完成了"强制推送"(force-push,一种覆盖Git历史记录的危险操作)。除了0.35.0版本,所有trivy-action标签和七个setup-trivy标签都被替换为携带恶意依赖的版本。这意味着什么?全球数以万计的软件构建流水线,可能在不知情的情况下执行了攻击者的代码。
Shakury的补救建议直截了当:"如果你怀疑运行过被篡改的版本,请立即将所有流水线密钥视为已泄露并轮换。"没有迂回,没有安抚。
攻击者如何藏进你的构建流程
供应链攻击的可怕之处,在于它劫持的是"信任"本身。Trivy不是某个边缘小工具——它是开发者用来扫描漏洞、检测硬编码密钥的标准组件。当扫描器本身成为攻击载体,防御者的第一道防线就变成了最隐蔽的后门。
根据安全公司Socket和Wiz的分析,这次攻击的技术设计相当精细。恶意代码被触发后,会并行启动两个进程:一个是正常的Trivy服务,维持表面上的功能;另一个是隐蔽的数据收集模块。
这个模块的狩猎范围极广:GitHub令牌、云服务商凭证、SSH密钥、Kubernetes令牌,以及任何可能散落在开发环境中的敏感信息。它还会收集环境变量、遍历文件系统、枚举网络接口—— essentially,把一台机器能暴露的攻击面扫了个遍。
数据被压缩加密后,通过主备双通道外传到攻击者控制的服务器。如果检测到运行在开发者本地机器上,它还会写入一个base64编码的Python持久化程序,确保即使重启后仍能维持访问。
被篡改的版本标签包括广泛使用的@0.34.2、@0.33、@0.18.0。这些不是实验性版本,是生产环境中的默认选择。
为什么"强制推送"成了致命漏洞
Git的强制推送机制,本意是给开发者一个"后悔药"——当你需要重写历史记录时可以使用。但它也是一把双刃剑:一旦凭证泄露,攻击者可以用它彻底覆盖仓库的提交历史,让恶意代码看起来像是官方发布的一部分。
Trivy的维护者在攻击发生后删除了攻击者发布的事发讨论帖,但损害已经造成。从周四凌晨攻击开始,到周五确认,窗口期内的任何自动拉取都可能中招。
这里暴露的是一个结构性问题:开源生态的"星标信任"模式。3.3万GitHub星标意味着广泛采用,但广泛采用不等于安全审计的同步跟进。大多数团队将Trivy集成到流水线后,很少会验证每次拉取的哈希值或签名——他们信任的是"这个工具一直被用,所以应该没问题"。
攻击者正是利用了这种惯性。CI/CD环境的特殊性加剧了风险:这些流水线通常持有高权限凭证,能访问生产环境、代码仓库、云基础设施。一旦扫描环节被攻破,攻击者获得的不是单点突破,而是横向移动的"万能钥匙"。
开发者的两难:便利与安全
这次事件抛出了一个残酷的选择题。Trivy的价值恰恰在于它的"无摩擦"集成——几行YAML配置,就能在每次代码提交时自动扫描漏洞。但这种便利的代价是,你默认将执行权限交给了上游仓库。
更深层的问题在于版本标签的语义模糊性。@0.34.2看起来是个精确锁定,但在GitHub Actions的语境下,它仍然指向一个可移动的引用。攻击者的强制推送让同一个标签指向了完全不同的代码内容,而大多数流水线配置不会察觉这种变化。
一些团队开始采用"哈希锁定"作为防御——不引用标签,而是直接指定提交的SHA-256哈希。这确实能防止类似攻击,但代价是失去了自动安全更新的便利。每次Trivy发布合法更新,你都需要手动审查并更新哈希值。对于安全团队人力有限的中型公司,这几乎是个不可持续的负担。
另一种方案是使用私有镜像仓库,将外部依赖缓存到内部并经过审计后再分发。但这需要额外的基础设施投入,而且缓存本身也有滞后性——你如何在攻击发生的几小时内识别出恶意版本?
供应链攻击的进化轨迹
回顾近年的类似事件,攻击者的策略正在从"广撒网"转向"精准打击"。2020年的SolarWinds事件针对的是IT管理软件,2021年的Codecov攻击瞄准了代码覆盖率工具,2023年的3CX事件则波及了通信软件。Trivy的案例延续了这一模式:找到开发者工具链中的高信任节点,然后静默潜伏。
这些攻击的共同点在于,它们都利用了"开发者的开发者"这一身份。当攻击代码出现在你用来检查安全的工具里,传统的防御假设——"我的扫描器会告诉我是否安全"——瞬间失效。
Socket和Wiz的联合分析揭示了一个细节:恶意代码会根据运行环境调整行为。在CI/CD服务器上,它专注于快速窃取密钥;在开发者本地机器上,它会额外部署持久化机制。这种环境感知能力说明攻击者做过充分的侦察,了解不同场景下的价值密度。
加密外传的机制也经过设计:数据被压缩减少传输量,加密规避网络层的DLP(数据防泄漏)检测,双通道确保即使主通道被阻断仍有备份。这不是脚本小子的即兴发挥,是专业团队的系统作业。
行业层面的信任重构
Trivy事件可能加速几个趋势。首先是"可验证构建"(Reproducible Builds)的落地——通过密码学证明,某个二进制确实由公开的源代码编译而来,而非被篡改的中间产物。Linux发行版多年前就开始推行这一实践,但应用层工具链的 adoption 一直缓慢。
其次是签名基础设施的升级。GitHub在2023年推出了 artifact attestation(制品证明)功能,允许Action的发布者用Sigstore进行签名验证。但 adoption 率仍然有限,很多主流工具尚未启用。Trivy攻击后,"有没有签名"可能成为选择依赖的新标准。
更激进的方案是"供应链防火墙"——在组织边界处拦截所有外部依赖,进行静态分析、动态沙箱测试后再放行。Google的SLSA框架、OpenSSF的Scorecard都在推动这类实践,但实施成本决定了它目前主要是大型企业的游戏。
对于中小团队,更现实的可能是"最小权限流水线"原则:假设任何工具都可能被攻破,因此限制CI/CD环境的访问范围。扫描漏洞不需要访问生产数据库,部署代码不需要读取所有仓库密钥。通过权限分割,即使Trivy这类工具被利用,损害也能被控制在局部。
Shakury的声明最后提到了一个数字:75个trivy-action标签被确认携带恶意代码,7个setup-trivy标签同样中招。这些数字背后是具体的团队、具体的项目、具体的凌晨被警报惊醒的值班工程师。供应链攻击的抽象性常常让人忽视其个体代价,但每一次"强制推送"覆盖的,都是某个开发者对"开源协作"这一社会契约的信任。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.