一只会“自己找路”的供应链蠕虫,正在把开源世界变成跳板

安全 2026年3月24日
最近活跃的黑客组织 TeamPCP,把软件供应链攻击又往前推了一步:它不仅污染开源包和安全工具,还让恶意程序具备了“自我传播”能力,能顺着开发者的 CI/CD 流水线一路蔓延。更让人不安的是,这场原本看起来以牟利为主的行动,后来又突然加入了专门针对伊朗机器的数据擦除逻辑,说明供应链攻击正从赚钱工具,滑向更难预测的混合型威胁。

开源世界这些年最尴尬的一件事,大概是:越是被大家信任、越是嵌入开发流程深处的工具,越可能成为攻击者最爱下手的地方。

最近被安全研究人员持续追踪的黑客组织 TeamPCP,就把这件事演得相当彻底。它最新投放的一种恶意程序,不只是常见的后门,也不只是偷偷窃取凭证的“扒手”,而是一只会沿着软件供应链自己扩散的蠕虫。它盯上的不是普通用户电脑,而是开发者机器、CI/CD 流水线、npm 令牌、Docker 镜像仓库、GitHub 账户这些现代软件工业的关键节点。说得直白一点,它不是在撬一扇门,而是在试图改写整栋楼的物流系统。

更诡异的是,这场攻击后半段还出现了一个转向:恶意代码开始对位于伊朗的机器触发擦除逻辑。一个原本以经济利益为主要动机的团伙,突然在代码里塞进带有地缘政治色彩的“破坏开关”,这让整件事从典型的网络犯罪,变成了一场带着不确定性的混合风险事件。

从“偷钥匙”到“自己复制自己”,供应链攻击升级了

根据 Aikido、Socket 等安全公司的分析,TeamPCP 最近传播的这只恶意程序被命名为 CanisterWorm。它最危险的地方,不是它用了多么新奇的漏洞,而是它把一整套已经被证明有效的攻击手法,拼成了一个高度自动化的流水线:一旦感染某台机器,就会主动搜索 npm 仓库访问令牌;如果发现当前环境拥有可发布的包权限,它就会把恶意代码打进新版本,再由下游用户继续安装、执行、传播。

这种传播方式很像现实中的“带毒零件”进入总装厂。一个开发者可能只是照常拉取依赖、跑一次构建、发布一个版本,却在不知情的情况下成了下一轮感染的中转站。研究人员甚至观察到,这只蠕虫在不到一分钟的时间里就瞄准了 28 个包。这个速度说明,攻击者对开发链路的理解已经非常工业化,不再是传统黑客那种“打一枪换一个地方”的作风,而更像是在运营一套自动感染网络。

这也是为什么这件事格外重要。过去几年,供应链攻击已经不新鲜了,从 SolarWinds 到 3CX,再到 xz Utils 后门风波,大家都知道“信任链”是脆弱的。但这次的问题在于,TeamPCP不满足于只污染一个包、一个镜像、一个版本,而是试图让恶意代码具备自己寻找下一个宿主的能力。供应链攻击一旦和蠕虫特性结合,杀伤力会出现质变——因为它不再依赖攻击者逐个投毒,而会借助开发生态自己长出触角。

安全工具也被反咬一口:Trivy 事件的警示意义

这轮风暴里最扎眼的受害者之一,是广泛使用的漏洞扫描工具 Trivy。安全公司 Aqua Security 旗下的 GitHub 账户此前已遭入侵,攻击者随后借此发动供应链攻击,污染了几乎所有版本的 Trivy。事情更糟的是,后续的凭证轮换 apparently 并不彻底,导致 TeamPCP 仍能继续控制发布基础设施,甚至连 Docker Hub 账号、内部代码仓库都被波及。

这类事件最让行业难堪的地方在于:被入侵的不是边缘系统,而是“负责告诉别人哪里有风险”的安全工具。换句话说,用户本来是为了提升安全性去安装它,结果却有可能把攻击者请进了门。这种讽刺感,和当年 CCleaner 被植入恶意代码、NotPetya 借助乌克兰税务软件传播时非常相似。安全产品和基础开发工具之所以威力巨大,恰恰因为它们天然拥有高权限、广分发和高信任。

我一直觉得,软件行业对“凭证轮换”这四个字的想象有点过于乐观。很多公司觉得发生事故后,把令牌和密码换掉就算完成止血;现实却是,现代发布链路里散落着大量遗留密钥、自动化机器人账户、缓存凭证、镜像构建变量、CI 密文配置和第三方集成授权。你以为自己换了一把锁,攻击者可能早就顺手配了十几把备用钥匙。Aqua 这次暴露出的,正是现代 DevSecOps 环境里一个非常普遍、但又最容易被低估的问题:身份和发布权限的边界,远比看起来更模糊。

一个“打不掉”的控制思路,和它没那么无敌的现实

CanisterWorm 还有一个颇具戏剧性的设计:它使用了基于 Internet Computer Protocol 的 canister 机制,来充当近乎不可篡改的控制层。简单理解,攻击者不是把所有控制地址硬编码在恶意程序里,而是让受感染主机定期向一个链上式的控制容器“报到”,再由这个容器动态告诉它们去哪里下载新的恶意载荷。

这个设计思路很聪明,因为它试图解决恶意软件世界里一个老问题:命令控制服务器太容易被封、被接管、被下线。传统木马经常死于域名被查封、IP 被拉黑,而这种更偏去中心化的控制方式,理论上能让恶意软件变得更顽强,像野草一样割一茬长一茬。对防守方来说,这不是简单的 IOC(妥协指标)更新问题,而是基础对抗模型变了。

不过,这个“近乎打不掉”的方案最终还是被研究人员拆掉了。Aikido 表示相关 canister 已在周日晚被移除。这个结果其实也说明一件事:网络安全世界从来没有绝对无敌的设计。攻击者喜欢宣传自己的基础设施“不可摧毁”,防守方则总能在实现细节、运营链路、上游服务、配套接口甚至人为失误中找到突破口。只是,别因为这次成功处置就放松警惕——下一次类似设计,未必还会这么快被掐断。

为什么偏偏是伊朗?当黑产开始带上地缘政治滤镜

整起事件里最让人皱眉的部分,是 TeamPCP 后来加入的擦除功能。按照研究人员披露的逻辑,如果恶意程序判断目标机器位于伊朗时区或配置为伊朗环境,它就不再优先执行凭证窃取,而是触发名为 Kamikaze 的擦除载荷:在 Kubernetes 环境下,它会尝试向整个集群下发破坏性任务;如果不是 Kubernetes,则直接走接近“删库跑路”的粗暴路径。

从技术层面看,这段逻辑不算复杂,真正复杂的是它背后的意图。TeamPCP 此前的行为模式更接近标准化黑产:搭代理网络、扫配置错误、窃取数据、勒索、挖矿,目标是赚钱。而这次针对特定国家的破坏,和纯粹的经济动机并不完全一致。它可能是在表达某种立场,也可能只是为了制造更大舆论声量,把自己从普通犯罪团伙包装成“有态度的行动者”。在今天的网络空间,这两种动机往往会混在一起,真假难辨。

这正是未来几年最麻烦的趋势之一:你以为自己面对的是勒索软件团伙,结果它突然掺入政治表达;你以为这是国家级行动,最后发现背后只是想抬高赎金的犯罪组织。边界被故意做模糊之后,企业的风险判断会变得更难。因为一家公司在做威胁建模时,原本可以区分“求财”和“求破坏”的攻击者,可一旦对手同时具备这两种倾向,很多传统应对策略就会失效。

对开发团队来说,这不是“别人家的事故”

如果你所在的团队大量依赖 npm、GitHub Actions、Docker Hub、Kubernetes 和自动化发布链路,那这件事就不是安全新闻,而是运维现实。CanisterWorm 这类攻击最危险的一点,是受害者很可能根本不知道自己已经参与了传播。开发者平时看到构建成功、测试通过、版本发布,一切都像往常一样平静;真正的异常,可能只是某个不太起眼的令牌被读取、某个包悄悄多发了一个版本、某个镜像标签在半夜被替换。

所以这次事件给行业的提醒,并不只是“赶紧查 IOC”。更核心的问题是,软件开发体系要不要重新审视自己的默认信任模型。为什么 CI 环境里经常放着长期有效的发布令牌?为什么一个令牌拿到手后,能改动那么多包?为什么内部工具、第三方镜像仓库和代码平台之间的权限链常常像藤蔓一样缠在一起?这些问题过去常常被开发效率压过去,因为大家都忙着交付;但攻击者已经证明,他们最爱利用的,正是这种“为了方便而默认敞开的门”。

我个人的判断是,未来一年,针对开发者工作流的攻击会越来越像“企业级 SaaS”——自动化、模块化、可以快速替换载荷,也会更擅长利用开源社区的分发特性。防守端也必须升级思维:光靠杀毒软件和边界防火墙,已经管不住一条会从包管理器、镜像仓库和流水线里钻来钻去的蠕虫。更细粒度的令牌权限、更严格的构建隔离、可验证发布、依赖来源审计,以及对异常发布行为的实时监测,恐怕都要从“加分项”变成“必修课”了。

说到底,开源生态最大的魅力是共享,最大的软肋也是共享。它像一座不断自我生长的城市,效率惊人,活力十足,但下水道一旦进了脏东西,污染也会顺着管网迅速扩散。TeamPCP 这次只是又一次提醒我们:在今天的软件世界里,最危险的攻击,不一定来自系统外部;它很可能伪装成一次正常安装、一次正常更新,甚至一次“为了更安全”而执行的扫描。

Summary: TeamPCP 这次行动真正可怕的,不是某一个被污染的包,也不是某一个被攻陷的账号,而是它展示了一种新范式:让恶意代码借助开发生态自己传播,再根据目标环境切换成窃密、勒索或破坏模式。我的判断是,今后的供应链攻击会越来越自动化、越来越像平台化运营。对企业而言,最需要补的不是某个单点漏洞,而是整个发布链路的信任治理能力;谁还把 CI/CD 当成“内部安全区”,谁就可能成为下一块跳板。
软件供应链攻击TeamPCPCanisterWormCI/CD 流水线开源包污染自我传播蠕虫npm 令牌Docker 镜像仓库GitHub 账户数据擦除逻辑