流水线成了黑客的提款机
📋 总体概括
GitHub Actions 被曝遭滥用窃取密钥,2,577 个凭证被瞄准、26 个确认外泄;同期 MALFEX 活动用 8 个恶意 npm 包铺量收割。两起事件共同指向一个判断:供应链攻击的重心正从偷代码转向偷身份,CI/CD 成为新的失守前线。
📄 正文
一条绿色的 CI 检查通过,26 组密钥已经出墙。
最近披露的两起事件,把同一个事实摆在所有工程团队面前:GitHub 的 GitHub Actions 被攻击者塞进了伪装成「安全检查」的恶意工作流,2,577 个密钥被列入窃取目标,最终确认 26 个从 13 个仓库成功外泄;几乎同一时间,代号 MALFEX 的 npm 供应链活动用 8 个恶意包持续分发 Windows 信息窃取木马,仅 function-flag 一个包就积累了 37,419 次下载。
一边是精准的定向猎杀,一边是铺量的流水线作业。两条路径不同,终点却一致——开发者凭证,正在成为攻击者眼中最硬的通货。
🎯 一场伪装成「安全检查」的盗窃
最讽刺的攻击,往往披着防御的外衣。
想象一下这个场景:某个工作日的早上,开发者打开仓库看到 Actions 面板里一条名为「安全检查」的工作流绿灯通过。没有人会多看一眼——它看起来就是在做它该做的事。但安全研究人员的分析显示,攻击者把窃密逻辑塞进了这类伪装成安全检查的工作流中,CI 环境一旦自动执行,就会在构建机内部翻找 SSH 私钥、云平台凭证和各类访问令牌。
数字很值得细读。据公开披露,这波攻击共将 2,577 个密钥列为窃取目标;但「瞄准」并不等于「得手」——研究人员最终确认成功外泄的只有 26 个,分布在 13 个仓库中。
这组数字本身,比攻击手法更有信息量。它划清了两条线:恶意工作流被注入(injection)和恶意载荷真正执行(execution)是两回事。攻击者可以广撒网,把 2,577 个密钥全写进窃取清单,但能否真正拿走,取决于工作流有没有被触发、目标密钥有没有恰好在执行环境里。
对防御方而言,这意味着审计思路要变:问题不再只是「我们有没有被投毒」,而是「投毒之后,到底跑了什么、带走了什么」。前者靠扫描,后者靠的是对 CI 执行日志和外发流量的持续可见性——而后者,恰恰是大多数团队完全空白的地带。
📦 八个包,一个「独行侠」
供应链攻击的门槛,已经低到一个人就能开工。
MALFEX 是另一个维度的样本。这是一场持续的 npm 供应链活动,通过 8 个恶意包分发 Windows 恶意软件,载荷包括 Overlord RAT 远控、名为 movinlike 的信息窃取器,以及一个藏在 ASCII-art 小工具里的独立下载器。窃取目标非常「个人化」:浏览器保存的密码、Discord 令牌、加密钱包文件。
更值得注意的是它的运营画像:据分析,这场活动背后很可能只有一名操作者,从 2023 年 8 月活跃至今。最大的分发贡献者 function-flag 自携带恶意代码以来累计 37,419 次下载——也就是说,一个疑似单人作战的攻击者,靠 npm 的分发网络维持了一年多的稳定「营业」。
把两起事件放在一张表里看,脉络会更清楚:
| 维度 | GitHub Actions 事件 | MALFEX 活动 |
|---|---|---|
| 载体 | CI 工作流投毒 | npm 恶意包 |
| 窃取目标 | SSH 私钥、云凭证、访问令牌 | 浏览器密码、Discord 令牌、加密钱包 |
| 规模 | 2,577 个密钥被瞄准,26 个确认外泄 | function-flag 单包 37,419 次下载 |
| 姿态 | 精准、低噪、重质 | 持久、铺量、重面 |
| 攻击者画像 | 定向作业 | 疑似单人长期运营 |
⚠️ 这两张面孔对应着同一个产业现实:npm 的发布门槛低、包名可自由注册、install 脚本默认即执行,这使得「个人作坊」也能完成工业化分发。而 CI 侧的攻击恰恰相反——门槛更高、更依赖对目标仓库的深入了解,但一旦得手,回报是以「企业云环境」为单位的。
一个偷零钱,一个偷保险柜。但两者都在证明:开发者工具链本身,已经是攻击面。
🔑 密钥才是新的据点
偷走一个云凭证,约等于偷走一整个云账号。
为什么攻击者盯上的不再是源码,而是密钥?答案藏在 CI 构建机的角色里。流水线 runner 是企业里权限最高、看管却最松的机器之一:它天然要持有云密钥去部署环境,要 SSH 私钥去拉取代码,要用各类 token 去发版、发布、通知。在开发者眼里这只是一次「跑个测试」,在攻击者眼里,这是一张通往生产云环境的直通车票。
再看那组 2,577 与 26 的对比,它其实是一张泄露漏斗:
漏斗顶部到底部超过两个数量级的落差,说明攻击者的「广撒网」策略大部分被环境差异、触发条件和执行失败消化掉了。但请注意:26 个已经足够。一次定向攻击里,一组有效的云凭证就足以完成从构建环境到生产云的横向移动;26 组,意味着攻击者可能同时握着十几个组织的入口。
据多位一线应急响应从业者私下讲,绝大多数企业在真正发生泄露之前,根本画不出一张「我们流水线里到底挂了哪些密钥」的完整清单。密钥散落在 secrets 配置、环境变量、构建脚本和第三方 action 的参数里,没有集中盘点,更谈不上轮换。这解释了为什么攻击者敢把 2,577 个目标一次性写进清单——他们赌的不是每一次都能得手,而是防守方根本不知道自己丢了什么。
这就是身份与访问安全必须前移到 CI/CD 的理由:构建环境的密钥治理,不能等到事件报告里出现自己的仓库才开工。
🛡️ 默认信任,是流水线最大的漏洞
流水线的每一环都假设上一环是干净的——攻击者赌的就是这个假设。
把当前主流的供应链攻击向量放到一张定位图上,你会看到一个清晰的迁徙趋势:
CI 工作流投毒和构建环境入侵落在右上角——技术门槛不低,但商业价值最高,因为它们直通企业身份体系;而 npm 铺量、拼写抢注这类传统手法依然是「存量玩家」,量大、廉价、转化率低。🔍 攻击者的注意力,正在从「骗终端用户」迁移到「骗构建系统」。
对应的防御动作,其实并不神秘,难点全在执行密度上:
这里面没有一条是新技术,但每一条都是「知道却没做」的重灾区。MALFEX 的存在尤其说明问题:一个疑似单人的攻击者能靠 8 个包吃一年多,说明大量团队连最基本的依赖审查流程都没有建立。防线不缺方案,缺的是把方案变成默认配置的工程纪律。
小结
两起事件,一条主线:软件供应链攻击的重心,正在从「偷代码」转向「偷身份」。GitHub Actions 的 26 组外泄密钥和 MALFEX 的 37,419 次下载,分别标注了定向猎杀与铺量收割的两种打法,而它们共同的靶心,是构建环境里那些被默认信任的凭证与依赖。往前看,随着 AI 编码代理开始自动写代码、自动触发流水线,「默认信任」的爆炸半径只会更大——下一轮攻防的胜负手,不在漏洞补丁里,而在每一条流水线的身份治理上。
本文由本站 AI 辅助聚合生成,原始来源如下: