事件起因
事情的源头,可以追溯到去年的一次重大安全事件。当时,一个名为TeamPCP的黑客组织,将目标对准了流行的漏洞扫描工具Trivy。他们成功入侵后,在其v0.69.4版本中植入了后门,随后在GitHub上以强力推送的方式,发布了多达75个恶意标签。这次攻击导致大量开发者中招,使得该团伙窃取了数量可观的npm账户凭证。

正是利用这批窃取的凭证,黑客们开发出了名为CanisterWorm的蠕虫。这款蠕虫的可怕之处在于,它能自动登录受害者的npm账户,发布新的恶意软件包,从而形成自我繁殖的感染链条。
它是怎么传染的?三步走
第一步:你装了个带毒的包
当开发者执行一条看似普通的安装命令时,陷阱就已经布下:
npm install @emilgroup/xxx ← 看起来正常的包,postinstall 脚本偷偷运行
第二步:它偷你的 npm 账号
安装后,隐藏在包内的脚本立即开始行动:翻找项目的.npmrc配置文件,扫描系统环境变量,目的只有一个——窃取有效的NPM_TOKEN。一旦得手,便将其保存下来。
第三步:它用你的身份发毒包
接下来,蠕虫会利用盗取的令牌,以受害者的身份发布新的恶意包版本。整个过程可能被伪装成一次正常的版本更新,例如提示:“检测到你有 5 个 npm 包,正在帮你发布 v1.2.3...”。
“检测到你有 5 个 npm 包,正在帮你发布 v1.2.3...”
就这样,下一个毫无戒备的开发者安装这些新包后,循环再次开始,感染规模如滚雪球般扩大。
已经有多少人中招?
目前的影响范围已经相当惊人:累计发布了超过140个恶意版本,波及66个以上独立的npm包。其中,@emilgroup/*(28个包)和@opengov/*(16个包)这两个命名空间下的包是重灾区。如果你近期安装过来自这些组织的软件包,务必警惕,你的系统可能已被植入后门。

这次攻击最棘手的设计在于其命令与控制(C2)服务器。蠕虫并未使用传统的中心化服务器,而是连接到了Internet Computer(ICP)区块链上的“容器”(类似智能合约)。这种去中心化的基础设施没有固定IP,也无法被轻易查封,提供了极强的抗打击能力。蠕虫每50分钟会向区块链查询一次最新指令。目前,指令指向的还是一个“戏弄”人的YouTube视频(即所谓Rick Roll),这使得它处于“休眠”状态。但危险在于,攻击者随时可以更换指令,一旦指向真实的恶意载荷,全球所有被感染的机器将在瞬间被激活。
还有更狠的:它会看你在哪个国家
更值得关注的是,蠕虫的最新变种增加了地理定位功能,具备“选择性破坏”能力:
- 若检测到运行环境位于伊朗,则会执行格式化硬盘并强制重启的破坏性操作。
- 对于其他国家或地区的机器,则选择悄悄安装后门,进行隐蔽的潜伏。
这种行为模式清晰地表明,攻击者的意图并不仅仅是谋取经济利益,其动机可能更为复杂。
我们现在可以做什么?(按优先级)
应急方案(5 分钟内):
- 立即访问 https://www.npmjs.com/settings/tokens,撤销所有现有的npm访问令牌,然后仅创建必需的新令牌。
- 在系统上运行检查命令(如审查进程),查看是否存在异常的“pgmon”服务。
- 如果你是npm包的维护者,立即检查你名下的包在近期是否有非你本人发布的异常版本。
- 删除项目中的node_modules目录和package-lock.json文件,使用干净的依赖重新安装。
- 设置npm配置以禁止安装时自动执行脚本,这是阻断此类攻击的关键一步:
需要注意的是,这可能会导致一些依赖安装后脚本的正经包功能失效,但在安全威胁面前,此举至关重要。npm config set ignore-scripts true
长期方案
- 为你的npm账户启用双因素认证(2FA),这是账户安全的第一道坚实防线。
- 使用短期、自动过期的访问令牌,彻底放弃使用永久有效的令牌。
- 在安装依赖前养成习惯,确认包来源是否官方,并审查版本号是否有可疑的突然更新。
写在最后
对比过去的软件供应链攻击,黑客往往需要手动逐一投毒,行动效率有限且易被追踪。而这次的蠕虫攻击实现了全自动传播,感染能力呈指数级增长,一旦启动便难以遏制。
值得注意的是,这是继2025年的Shai-Hulud蠕虫之后,第二起被确认的具备自我传播能力的npm供应链攻击。这无疑是一个强烈的信号:黑客已经彻底掌握了这种攻击模式的“方法论”,类似的威胁未来只会更加频繁。说得直白些,供应链安全的游戏规则正在被改写。
行动建议非常明确:现在就去检查你的npm令牌和系统服务。不要等待,明天或许就轮到你被动地成为传播链条中的下一个“帮凶”。
(本文信息综合整理自GBHackers、Socket、Aqua Security等安全团队的研究报告。相关深度分析可参考:https://gbhackers.com/canisterworm-hijacks-npm/)
