关注「索引目录」公众号,获取更多干货。
🚨 近期 NPM 供应链攻击事件——事件经过、重要性及防范措施
开源 JavaScript 库正遭受攻击。2025 年末,多起影响巨大的攻击针对 npm 包,从小型工具到广泛使用的 React/Next.js 依赖项,无一幸免。这些事件泄露了数千个机密信息,导致维护者账户被盗,并暴露了 JavaScript 供应链的脆弱性。
这篇文章详细分析了事件经过、这些攻击是如何进行的,以及开发者今后可以采取哪些措施来保护自己。
1. 2025 年 NPM 攻击浪潮
1.1 2025 年 9 月 Chalk/Debug 攻击
2025年9月,攻击者入侵了维护者账户,并将混淆的加密窃取代码注入到一些流行的软件包中,其中包括:
-
粉笔 -
调试 -
ansi 正则表达式 -
颜色名称……以及其他。
这些受感染的版本在被 npm 删除之前,会悄悄地将加密货币交易重定向到攻击者的钱包。
这次攻击尤其令人担忧,因为这些软件包每天被下载数十亿次,这表明一个被攻破的依赖项是如何波及整个生态系统的。
1.2 沙伊-胡鲁德蠕虫(2025年9月)
不久之后,一种名为Shai-Hulud的可自我复制的 npm蠕虫出现了。
攻击者攻破了真实的开发者账户,并推送了带有后门的受信任软件包版本,例如:
-
ngx-bootstrap -
ng2文件上传 - @ctrl
/tinycolor
每次被植入木马的更新:
-
窃取凭证(GitHub 令牌、npm 令牌、云密钥) -
已将密钥上传到公共 GitHub 仓库 -
利用窃取的 npm 令牌感染更多软件包
它迅速蔓延——在恶意软件被完全清除之前,已有超过500 个包裹被感染。
1.3 域名抢注恶意软件浪潮(2025 年 10 月)
10月份,安全研究人员发现了一系列拼写错误抢注的软件包,这些软件包旨在模仿流行的库:
-
react-router-dom -
ethers.js -
节点守护程序 -
状态
这些虚假包裹中包含多阶段信息窃取程序,这些程序:
-
触发虚假验证码 -
安装了一个隐藏的 24MB 有效载荷 -
摘录: -
系统密码 -
浏览器 Cookie -
操作系统密钥链秘密
他们甚至启动了隐藏终端进行隐蔽运行——这表明安装后脚本有多么危险。
2. 最新攻击:Shai-Hulud 2.0(2025 年 11 月)
第二波,甚至更大的浪潮于2025 年 11 月下旬到来。
2.1 有哪些新内容?
攻击者再次将目标对准了多个大型项目的维护者账户,其中包括:
-
Zapier -
ENS 域 -
PostHog -
邮差
一旦入侵成功,他们便发布了带有预安装脚本的、被植入木马的 npm 版本,该脚本会:
-
下载并执行了Bun运行时环境 -
运行了一个10MB 的凭证窃取有效载荷。 -
使用 TruffleHog 扫描秘密 -
将窃取的数据上传到名为 “Sha1-Hulud: The Second Coming”的GitHub仓库
受害者的电脑实际上变成了秘密窃取机器人。
2.2 影响规模
- 超过 800 个受感染的 npm 包
- 约有 30,000 个 GitHub 代码库
被创建用于存储被盗凭证。 - 超过40万条秘密
泄露 - 已暴露的 npm 令牌中有 60% 仍然有效。
-
包含一个破坏性擦除器,可能会删除用户的主目录。
2.3 React / Next.js 生态系统影响
包裹类型:
- @posthog/nextjs
- @posthog/nextjs-config
……也包括那些被植入木马程序的程序,这意味着即使是常见的 React/Next.js 分析集成也可能成为攻击入口。
3. 这类供应链攻击是如何运作的
3.1 维护者账户接管
网络钓鱼或窃取的凭证使攻击者能够向合法软件包发布恶意更新。
3.2 域名抢注
创建与热门软件包外观几乎完全相同的软件包:
react-router-dom.js对比 react-router-dom
3.3 依赖性混淆
上传一个与私有软件包同名的公共软件包,诱使 CI 流水线拉取攻击者的版本。
3.4 恶意生命周期脚本
npm 执行:
preinstallpostinstall
脚本自动运行。
攻击者会利用这些时机:
-
运行二进制文件 -
下载恶意软件 -
泄露秘密 -
启动隐藏的后台进程
3.5 为什么 npm 存在漏洞
npm install=完全远程代码执行。
生命周期脚本中的任何代码都以开发者权限运行。
4. 这些攻击为何重要
供应链妥协可能导致:
-
后门企业系统 -
窃取云 API 密钥 -
劫持 GitHub 仓库 -
感染整个 CI/CD 流水线 -
自动跨依赖树传播
即使是像Chalk这样的“小型”实用程序,每周的下载量也可能达到数十亿次——因此其影响范围非常巨大。
Shai-Hulud 2.0 甚至包含一个擦除器,如果受到干扰,它可以删除整个用户目录。
5. 如何保护您的项目
5.1 使用锁定文件和确定性安装
总是:
-
提交 package-lock.json或yarn.lock -
在 CI 中使用 npm ci或yarn --frozen-lockfile
这样可以防止恶意版本意外更新。
5.2 禁用或限制生命周期脚本
选项:
npm install --ignore-scripts-
Yarn 的脚本阻塞模式 -
pnpm 的默认阻止脚本策略 - 类似LavaMoat 的
工具可以用来将允许的脚本列入白名单。 -
Deno 需要显式 --allow-scripts权限
5.3 使用安全运行时和沙箱
- Deno
→ 默认安全,无任何标志禁止文件/网络访问 - Bun
→ 没有沙盒,但内置了 CVE 扫描器 - pnpm
→ 更安全的模块隔离,内容寻址存储
5.4 保护您的注册表帐户
-
在 npm 上启用双因素身份验证 -
旋转代币 -
使用作用域 + 短生命周期令牌 -
采用npm 出处/可信发布
5.5 定期审计依赖关系
使用:
npm audit-
Snyk -
开源软件指数 -
GitHub 安全公告
注意:
-
突然版本跳转 -
新维护者 -
最近转移的包裹 -
安装时出现奇怪的行为
6. 比较 npm、pnpm、Bun 和 Deno 的安全性
|
|
|
|
|
|
|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7. 总结要点
2025 年的 npm 攻击事件敲响了警钟。
他们证明了:
-
依赖项安装 = 潜在的远程代码执行 -
即使是可信的包裹也可能被入侵。 -
维护者账户是高价值目标 -
整个生态系统(React、Next.js、工具库)都存在漏洞
前进的方向:
-
封锁安装 -
限制脚本 -
尽量减少依赖关系 -
采用安全的运行时环境 -
积极审计
没有万全之策。
但多层防御措施能大大降低供应链遭受灾难性攻击的可能性。
关注「索引目录」公众号,获取更多干货。

