一句话结论:2026 年 9 月 15 日,一个叫 prime0 的 npm 账号在 3 分钟内发布了 85 个仿冒包,名字全是 chalk、semver、debug、minimatch、ajv 等顶流库的”错别字版”。包里带 C2,每 30 秒回连一次等投喂命令。DBA 也别笑——你的监控面板、运维脚本、工单系统的 node 依赖里,一样可能躺着这种东西。

1. 发生了什么(CloudSEK 披露)

  • 时间:2026-09-15 15:36:25–15:39:38 UTC,3 分钟,85 个包,一气呵成
  • 账号:prime0,包全在 @prime0 scope 下(事后该 scope 已被 npm 下架)
  • 名字生成算法:删掉原库名前 3 个字符里的 1 个;如果删完的名字已被注册,就换成相邻键位的错别字。比如 chalk → dhalk / fhalk / xhalk(因为 calk、chlk、halk 都被占了)
  • 84/85 个包的样本带的是同一份远控代码,模板注释里还留着没填的 <PKGNAME> 占位符——自动化批量生成的实锤

2. 最骚的细节:不靠打错字,靠搜索排名

你可能会想:@prime0/fhalk 这种带 scope 的名字,打错字 npm install fhalk 也装不上啊?

没错,直接装会报 not found。但 CloudSEK 发现:当你把错别字输进 npm 搜索框或编辑器的包名自动补全时,只要没有同名的非 scope 包存在,@prime0/fhalk 会排在搜索结果第一位。攻击者赌的就是你手一抖点了第一项。

3. 包里干了什么

  • 安装时:把主机指纹发到 69.48.229.140:8080
  • 被 require 加载后:启动 agent,每 30 秒向同一台服务器要一条 shell 命令,执行,把输出传回去
  • 无认证、无加密、无目标筛选——典型的广撒网
  • 彩蛋:这台 C2(69.48.229.140)上还跑着另一个服务——针对 vast.ai 市场的 GPU 挖矿控制面板。CloudSEK 判断是同一伙人的共享基础设施,但 npm 投毒和挖矿是两拨受害者

4. DBA 自查(30 秒)

1
2
3
4
5
# 所有项目的 lockfile 里搜一遍
grep -r "@prime0" --include="package-lock.json" --include="pnpm-lock.yaml" --include="yarn.lock" ~ 2>/dev/null

# 出站封掉 C2(iptables 示例,按自己环境来)
iptables -A OUTPUT -d 69.48.229.140 -j DROP

判定标准(CloudSEK 原话):只安装过 = 主机信息已泄露;在构建机/运行时里被加载过 = 从加载那一刻起,它执行的每一条命令都是攻击者下发的。

5. 以后怎么防

  1. 锁版本:lockfile 进版本库,CI 只按 lockfile 装,不裸跑 npm install xxx
  2. 私服代理:内网搭 npm 私服/代理(如 Verdaccio),非常见包先审再放行
  3. npm audit 进流水线:构建时跑一遍,有 high 以上直接失败
  4. 别手抖:自动补全选包时看一眼 scope,@prime0 这种眼生的 scope 多留个心眼

参考:

原文作者: liups.com

原文链接: http://liups.com/posts/fe16c284/

许可协议: 知识共享署名-非商业性使用 4.0 国际许可协议