npm 3 分钟发布 85 个仿冒包:@prime0 供应链投毒事件,DBA 也别觉得与己无关
一句话结论: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,包全在@prime0scope 下(事后该 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 | # 所有项目的 lockfile 里搜一遍 |
判定标准(CloudSEK 原话):只安装过 = 主机信息已泄露;在构建机/运行时里被加载过 = 从加载那一刻起,它执行的每一条命令都是攻击者下发的。
5. 以后怎么防
- 锁版本:lockfile 进版本库,CI 只按 lockfile 装,不裸跑
npm install xxx - 私服代理:内网搭 npm 私服/代理(如 Verdaccio),非常见包先审再放行
- npm audit 进流水线:构建时跑一遍,有 high 以上直接失败
- 别手抖:自动补全选包时看一眼 scope,
@prime0这种眼生的 scope 多留个心眼
参考:
原文作者: liups.com
原文链接: http://liups.com/posts/fe16c284/
许可协议: 知识共享署名-非商业性使用 4.0 国际许可协议