CanisterWorm:Trivy 攻击后 npm 供应链中的自我传播蠕虫
攻击者趁 Trivy 被入侵之机,部署了 CanisterWorm 蠕虫,该蠕虫感染了数十个 npm 包。该恶意软件使用 Internet Computer 区块链上的 ICP canister 作为弹性 C2 服务器。这是首次记录到的 ICP 被滥用于载荷检索,提供去中心化的抗移除能力。
感染与传播机制
攻击链从被入侵包中的 postinstall hook 开始。该 hook 启动一个 loader,安装 Python 后门。后门连接到 ICP canister 以检索下一个载荷的 URL。
ICP canister 实现了 get_latest_link、http_request 和 update_link 方法。后者允许控制器实时更改 URL,从而在不中断操作的情况下更新所有受感染主机的可执行文件。
后门每 50 分钟使用假冒的 User-Agent 轮询 canister。如果 URL 包含 youtube.com,植入物进入休眠状态。通过切换到真实载荷激活;旧进程并行继续运行。
持久性通过名为 "pgmon" 的 systemd 服务确保,伪装成 PostgreSQL 监控。Restart=always 指令在终止后 5 秒重启后门。
受影响包:
- @EmilGroup 作用域下 28 个;
- @opengov 作用域下 16 个;
- @teale.io/eslint-config;
- @airtm/uuid-base32;
- @pypestream/floating-ui-dom。
Socket 检测到 66+ 个唯一包中的 141 个恶意工件。
CanisterWorm 向完全自动化的演变
在 @teale.io/eslint-config 的 1.8.11–1.8.12 版本中,一个变异变种将 npm token 窃取集成到 index.js 中。findNpmTokens() 函数在 postinstall 期间扫描环境,并将 deploy.js 作为后台进程启动以实现自我传播。
Deploy.js 使用窃取的 token 向所有可访问包发布恶意版本。该蠕虫据推测由使用 Vibe 技术的 AI 生成,没有对代码进行混淆。
ICP 中的当前载荷是测试字符串 "hello123",表明在全面攻击前处于链路验证阶段。
在木马化的 Trivy 0.69.4 中,通过 sysmon.py 发现了类似带有 youtube.com 检查的机制,引用了相同的 ICP canister。
与以往活动的比较
CanisterWorm 遵循 Shai-Hulud(9 月)的模式:tinycolor 被入侵传播到 40+ 个包,然后蠕虫通过 NpmModule.updatePackage 和 TruffleHog 用于凭证验证感染 300+ 个。
Sha1-Hulud(11 月)影响 25,000+ 个仓库:preinstall 脚本 setup_bun.js 检测 Bun 环境,启动 bun_environment.js 进行数据窃取。
| 活动 | 受影响包数 | 传播机制 | 窃取工具 |
|-------------|------------|-----------------------------------|-----------------|
| Shai-Hulud | 300+ | NpmModule.updatePackage | TruffleHog |
| Sha1-Hulud | 25,000+ | preinstall/setup_bun.js | bun_environment |
| CanisterWorm| 66+ | postinstall/deploy.js + ICP C2 | findNpmTokens |
关键要点
- 首次使用 ICP canister 作为恶意软件的 C2:去中心化使移除变得困难。
- 自动传播:token 窃取 + deploy.js 将安装转为 CI/CD 和开发机器的感染向量。
- 弹性:systemd 的 Restart=always + 并行进程 + 动态 update_link。
- 伪装:服务伪装成 pgmon,在 youtube.com 时休眠模式。
- 规模:从 Trivy 到 141 个工件;演变为无需手动部署的完全自动化。
公司 Aikido Security、Endor Labs、JFrog 和 Wiz 确认:这标志着 npm 生态系统中从单一入侵向指数级蠕虫行为的转变。
— Editorial Team
暂无评论。