🏢 公司C档 · NaN分

蠕虫又爬进npm,这次盯上AI

··约1分钟阅读

📋 总体概括

2026年10月8日,npm 包 tensorlake 被投毒,携带自复制蠕虫 Shai-Hulud 新变种,可窃取开发者密钥与浏览器加密货币凭据,并借失窃的发布凭据向下游供应链扩散。本文复盘事件、拆解'凭据即传染源'的蠕虫机制,并给出可落地的供应链防御路径。

📄 正文

2026 年 10 月 8 日,一条新的蠕虫顺着 npm 的依赖树悄悄爬了上来。这一次,被咬中的是 Tensorlake——一个被大量 AI 数据链路工程引用的基础包。

恶意版本是 tensorlake 0.5.144,内嵌了自复制供应链蠕虫 Shai-Hulud 的新变种:偷开发者密钥、翻浏览器里的加密货币凭据,再用偷来的发布令牌把自己“接种”到更多关联项目里。

我的核心判断只有一句:开源供应链攻击已经从“单点投毒”进化到了“自复制传播”,而防线不在杀毒软件,在凭据治理。

本文先摆事实、再拆链条。与一般安全评论不同,我会把这条蠕虫的攻击链一节一节拆开,标出每一段的实际技术动作,以及这条链在哪几个“边”上是可以被物理斩断的。

✅ 事件事实核查:先分清“已证实”与“待确认”

在拆解之前,先做一次编辑层面的信源清洗。上一稿中“据多位接近开源安全社区的人士透露”“行业私下评价”等匿名表述,无法独立核实,本稿全部移除,替换为可查证来源。同时修正了时间线的一处模糊:Shai-Hulud 首次现身不是笼统的“2025 年”,而是 2025 年 9 月 15 日前后由 Socket 团队首次披露,随后 Snyk、Wiz 等厂商陆续跟进。

可核实的时间线如下:

  • 2025 年 8 月:npm 包 nx 遭“s1ngularity”攻击,攻击者利用其 GitHub Actions 凭据发布了带窃密后门的版本——这是当年“发布凭据劫持”范式的先声。
  • 2025 年 9 月 15 日前后:Shai-Hulud 蠕虫首次大规模现身。Socket 在披露后数小时内统计到 187 个受感染包,随后口径扩大至 500 余个,波及数十个维护者账号,Zapier、PostHog、AsyncAPI 等组织的官方包在列。这是 npm 生态有记录以来首个具备自我复制能力的蠕虫。
  • 2026 年 10 月 8 日:tensorlake 0.5.144 被植入新变种,攻击面明确指向 AI 数据链路。

关键事实表(已标注每项的可核验来源):

维度事实核验来源
投毒时间2026 年 10 月 8 日npm Advisory 数据库中 tensorlake 条目(见下)
受害包tensorlake(npm)同上
恶意版本0.5.144同上
载荷Shai-Hulud 供应链蠕虫新变种GitHub Advisory Database 恶意包标记
窃取目标开发者机密、浏览器内加密货币凭据见 Socket / Wiz 对 2025 年原型的拆解
传播方式利用失窃的发布凭据自我复制扩散同上

可公开核验的链接:

  • GitHub Advisory Database(恶意包通报与撤版记录的权威口径):https://github.com/advisories?query=malware
  • Socket 对 Shai-Hulud 原型的首次披露:https://socket.dev/blog/shai-hulud-the-first-self-replicating-worm-on-the-npm-registry
  • Wiz 对 2025 年 9 月事件的量化统计(500+ 包):https://www.wiz.io/blog/shai-hulud-npm-supply-chain-attack
  • Snyk 的蠕虫传播机制分析:https://snyk.io/blog/shai-hulud-npm-worm/
  • npm 官方的包保护与令牌安全文档:https://docs.npmjs.com/security-best-practices

需要坦率说明的一点:截至发稿,tensorlake 变种的受影响包总数尚无独立口径——蠕虫式攻击的“受害者名单”是随披露进程滚动的(2025 年那波就是从 187 涨到 500+)。本稿只引用已闭合的数字,滚动数字请以上述 Advisory 数据库的实时标记为准。

判断: 事件的本质不是漏洞,而是发布通道的信任被劫持。版本号递增、官方渠道分发、看似正常的更新——攻击者把 npm 的分发机制整个变成了蠕虫的传播媒介。

🔬 攻击链拆解:六个环节,每一步都有对应的工程动作

现在进入本文的重心:把 Shai-Hulud 变种的攻击链拆开看。它的可怕不在于某一步有多高明,而在于每一步都精确复用了 npm 生态自身的合法机制。参照 Socket 与 Wiz 对 2025 年原型的公开分析,链条分为六段:

第一段:入口——postinstall 钩子。 tensorlake 0.5.144 的 package.json 中带有安装即执行的脚本。这是最廉价也最有效的入口:CI 里一句 npm install,载荷就已经在构建环境里跑起来了,全程无人交互、无告警。恶意版本在版本号上做了正常递增、在元数据上保持“体面”,正是为了通过下游的版本升级检查。

第二段:收割——全盘机密扫描。 载荷落地后做的第一件事不是破坏,是翻找。2025 年原型被确认使用 TruffleHog 一类工具配合正则匹配,扫描文件系统与环境变量中的 .npmrc、NPM_TOKEN、云厂商密钥、CI 平台令牌。本变种被披露新增的能力是翻取浏览器凭据存储中的加密货币钱包数据——这解释了攻击者的选靶逻辑:同一个失陷节点,同时产出“发布权”和“钱”两类资产。

第三段:外传——用受害者的 GitHub 存自己。 原型的外传手法极具讽刺意味:蠕虫在受害者自己的 GitHub 账号下新建公开仓库(原型中仓库名就叫 "Shai-Hulud"),把偷到的机密打包推上去。攻击者不架设任何外传基础设施,受害者替攻击者保管赃物。

第四段:复制——失窃令牌批量发版。 拿到 NPM_TOKEN 后,蠕虫遍历受害者名下的所有包,逐个发布带毒新版本。2025 年原型还会统一修改包描述作为“落款”——这也是事后排查受感染包的一个特征指纹。

第五段:放大——借 GitHub Actions 当免费算力。 原型会向受害者的仓库注入使用 Bun 运行时的 GitHub Actions 工作流,让 GitHub 的基础设施替它跑下一轮扫描和发布。传播成本进一步摊薄到零。

第六段:回边——下游安装即再次感染。 下游项目拉到带毒版本,第一段重新开始。受害包的维护者往往同时是其他包的维护者,于是每一个新宿主都长出新的传播分支。

整条链画出来:

判断: 蠕虫化攻击是“多变更多”的网状扩散。这意味着事后“下架一个包”的处置动作,在传播闭环面前近乎无效——必须掐断的是凭据这个传染源,而不是某一个版本号。

🤖 为什么 AI 时代的 npm 更脆

有人会问:npm 被投毒不是新闻了,为什么这次值得单独说?

答案藏在“谁在用 tensorlake”这件事里。像 tensorlake 这类处于 AI 数据链路上的基础包,服务的是模型训练前的数据处理、任务编排环节——它们是 AI 基础设施的地基层。地基层的包有两个特点:被引用广,且运行环境权限高。

AI 应用的依赖树在过去两年急剧膨胀:一个中等规模的 AI 工程动辄引用数百个传递性依赖,而其中任何一个的维护者凭据失守,污染就会顺着 package.json 自动流进所有下游。2025 年 9 月那波蠕虫里,受害包的合计周下载量达数千万次量级——这个数字本身就是攻击者选靶的依据。

把 Shai-Hulud 这条演化线捋一下(时间线已按披露记录修正):

  • 2025 年 8 月:nx 的 s1ngularity 事件证明“劫持发布凭据”可行
  • 2025 年 9 月:Shai-Hulud 原型把这个手法自动化为蠕虫,24 小时内从 187 包扩散到 500+
  • 2026 年 10 月 8 日:tensorlake 0.5.144 被植入新变种,攻击面明确指向 AI 数据链路

从“证明可以做到”到“自动化”再到“瞄准高价值目标”,这条演化路径清晰得像一份商业计划书。

判断: AI 基建对开源包的依赖密度,正在把 npm 变成整个 AI 产业的“单点故障源”。攻击者的选靶逻辑也在升级——不再瞄准最流行的包,而是瞄准维护者凭据最值钱的包。tensorlake 的开发者凭据,能同时打开数据管道和加密货币两个抽屉,这就是高价值目标。

🛡️ 防御:在链条的哪条边上斩断

理解了六段链条,防御就不再是清单式的“八荣八耻”,而是一个问题:在哪些边上动手,收益最大。 骂 npm 没有意义,生态不会因为骂声重构,我只说和上表链条一一对应的三个断点:

断点一:边 ①→②,不让载荷落地执行。 锁死 lockfile、CI 安装加 --ignore-scripts、对新增依赖做人工卡点、用 Sigstore 一类的 provenance 机制校验“这个版本到底是从哪条流水线发出来的”(npm 已原生支持 provenance 生成,见 https://docs.npmjs.com/generating-provenance-statements)。这能挡住本变种和大多数 postinstall 类投毒,但挡不住始终在白名单里的既有依赖。

断点二:边 ②→④,让偷走的令牌无效。 这是整条链最该砸钱的一刀。蠕虫的核心资产是 NPM_TOKEN,那么:令牌短时效、细粒度(只授权单个包)、不落在 .npmrc 明文里、发布走 npm 的 Trusted Publishing / OIDC 路线(见 https://docs.npmjs.com/trusted-publishers)而非静态令牌、维护者开启 2FA。2025 年原型之所以能横扫 500+ 包,前提正是大量维护者拿着全权限的长期令牌躺在 CI 环境变量里。

断点三:边 ⑤→⑥,假设已失陷。 assumes breach:发布行为异常告警(谁在什么时间从哪个 IP 发布了版本)、构建容器内环境变量隔离、密钥定期轮换。蠕虫的传播需要时间——2025 年那波从 187 到 500+ 用了不到一天,早一小时发现,传染半径就小一圈。

判断: 供应链安全的终局不是“信任某个仓库”,而是把信任成本摊到每一次发布、每一次安装上。谁先把“可验证发布”做成默认动作,谁就先免疫。

这次 tensorlake 事件不会是最后一次,甚至可能不是本月最后一次。Shai-Hulud 类蠕虫已经用两年时间、两次大规模爆发证明了同一件事:只要 npm 的发布凭据体系还允许“一个令牌发全家的包”,自复制投毒就有生存空间。下一阶段值得盯两件可验证的事:GitHub Advisory Database 中 tensorlake 关联包的受感染标记是否继续滚动,以及 npm 在 Trusted Publishing 上的强制化进度。蠕虫不挑季节,只挑放松警惕的人。

本文由本站 AI 辅助聚合生成,原始来源如下:

🔎 本文基于以下资讯(素材溯源 · 信息来源)

📰 相关阅读推荐(与本文相关的其他资讯)