CanisterWorm 恶意软件
一场精心策划的供应链攻击最初针对的是广泛使用的 Trivy 扫描器,但随后升级为影响众多 npm 软件包的大规模入侵。幕后黑手涉嫌部署了一种此前未被记录的自传播蠕虫病毒 CanisterWorm,这显著扩大了入侵的规模和影响。
该恶意软件的名称源于其利用互联网计算机协议 (ICP) 容器(一种托管在去中心化区块链上的防篡改智能合约)作为其命令基础设施的一部分。这是首次有公开记录的利用 ICP 容器来获取命令与控制 (C2) 端点的案例,引入了一种新颖且极具韧性的策略,使传统的缓解措施更加复杂。
目录
受损包裹和初始访问途径
此次攻击影响了多个不同范围的 npm 包,表明其波及范围很广,遍及软件供应链:
- @EmilGroup 范围内的 28 个软件包
- @opengov 范围内的 16 个软件包
- 其他软件包包括 @teale.io/eslint-config、@airtm/uuid-base32 和 @pypestream/floating-ui-dom
此次攻击活动紧随一次凭证泄露事件之后,该事件使得攻击者能够发布与 Trivy 相关的恶意工具版本,特别是 trivy、trivy-action 和 setup-trivy,这些工具内置了窃取凭证的功能。据信,此次行动与一个名为 TeamPCP 的专注于云服务的网络犯罪团伙有关。
感染工作流程和分散式指挥基础设施
感染链始于 npm 包的安装过程,安装后脚本会执行一个加载器。该加载器会部署一个基于 Python 的后门,该后门旨在与 ICP 容器通信。该容器充当死信箱解析器,返回一个 URL,引导受感染的系统下载并执行下一阶段的有效载荷。
ICP 基础设施的去中心化特性为攻击者提供了显著优势。由于容器可以动态更新有效载荷 URL,威胁行为者无需修改已部署的恶意软件本身,即可在所有受感染的系统中分发新的恶意二进制文件。这种架构也使得清除工作变得更加困难。
持久化机制和隐身技术
持久性是通过创建一个 systemd 用户服务来实现的,该服务被配置为自动重启恶意进程。主要特征包括:
- 通过 Restart=always 指令强制执行自动重启
- 如果后门程序被终止,则延迟 5 秒后再重新启动。
- 将该服务伪装成名为“pgmon”的合法PostgreSQL监控软件
这种方法通过与合法系统服务融合,确保持续运行,同时最大限度地降低被检测到的可能性。
自适应有效载荷投放和终止开关行为
后门程序每隔 50 分钟定期与 ICP 罐通信,使用伪造的浏览器用户代理以避免引起怀疑。返回的 URL 决定下一步操作:
- 如果该 URL 指向有效的有效载荷,恶意软件就会下载并执行它。
- 如果网址包含“youtube.com”,恶意软件将进入休眠状态。
这种机制实际上相当于一个远程终止开关。攻击者可以通过切换容器的 URL(在良性 YouTube 链接和恶意载荷之间切换),来激活或停用所有受感染系统上的恶意软件。值得注意的是,先前执行的载荷会继续在后台运行,因为恶意软件不会终止之前的进程。
在被植入木马的 Trivy 二进制文件(版本 0.69.4)中也发现了类似的基于 YouTube 的终止开关,它通过一个单独的 Python dropper 与相同的 ICP 基础设施进行通信。
蠕虫能力和自动繁殖
最初,传播依赖于一个名为 deploy.js 的手动执行脚本,该脚本利用窃取的 npm 身份验证令牌将恶意代码注入到可访问的软件包中。此脚本并非在安装过程中触发,而是作为一个独立工具来扩大攻击范围。
CanisterWorm 的后续变体已经发生了显著变化。在较新的版本中,例如 @teale.io/eslint-config 中的版本(1.8.11 和 1.8.12),该蠕虫将自我传播直接集成到软件包的安装过程中。更新后的机制包括:
- 从受感染的环境中提取 npm 身份验证令牌
- 立即执行传播例程,作为分离的后台进程
- 利用窃取的凭证自动发布受感染的软件包
这种转变将攻击从人工操作的活动转变为完全自主的传播系统。
升级为自我维持的供应链威胁
自动令牌收集和自我传播功能的引入标志着安全形势的急剧升级。任何安装了受感染软件包且包含可访问 npm 凭据的开发者工作站或 CI/CD 流水线都会成为活跃的传播节点。这会产生级联效应,受感染的软件包会导致下游依赖项进一步感染。
现阶段,威胁已不再局限于孤立的账户入侵,而是演变为一个自我维持的恶意软件传播生态系统。每个新感染的环境都会促进传播,导致呈指数级增长,并使遏制工作变得更加困难。
更令人担忧的是,测试工件(例如占位符有效载荷“hello123”)表明,攻击者在部署完全可操作的恶意二进制文件之前,正在积极地完善和验证攻击链。