20 亿次周下载量、18 个“基建级”包、一场持续 2 小时的**“核弹级”**污染——这次,攻击者把枪口对准了每一个前端开发者与 Web3 用户。

凌晨的“钓鱼邮件”,撕开 20 亿次周活的口子

98 日 17:39 UTC,Aikido Security 的红色警报划破周末宁静:
npm 周下载量超 20 亿的 18 个核心包,被植入浏览器端加密货币劫持代码。

攻击入口简单到令人发指——一封“npm 官方”发来的 2FA 过期提醒

要素攻击者伪造内容
发件人[email protected](非官方域名)
标题【紧急】您的账户将于 9 月 10 日被锁定
按钮一键更新 2FA(实则窃取 token)

维护者 Josh Junon(qix)点下链接 30 秒后,攻击者即获得其 npm 账户完全控制权,随后向 chalk、debug、ansi-styles 等“基建级”包推送了带毒补丁版本。

恶意代码:功能 100% 正常,只是多了一笔“隐形转账”

攻击者没有粗暴地“删库跑路”,而是把恶意逻辑藏进 浏览器环境专属分支

  1. 只在 <script>webpack/browserify 打包后生效,Node 服务端无感知
  2. 监听常见 Web3 钱包(MetaMask、Phantom、OKX)的 sendAsync 调用;
  3. Levenshtein 算法 计算目标地址与内置地址列表的相似度 ≥ 0.9 即触发替换;
  4. 伪造与原交易相同的 txHash 回执,用户以为成功,实则资金已转入黑客地址

2 小时核弹扩散:10% 云函数瞬间污染

时间线事件
15:12 UTC恶意版 [email protected] 发布
15:47 UTCVercel 自动构建触发,全球 Edge Function 同步拉取
16:05 UTC首例用户反馈“链上转账成功但资金未到账”
17:39 UTCAikido 发出警报,npm 官方下架所有带毒版本
22:19 UTC主流云厂商完成构建缓存清零

仅 127 分钟,恶意包进入 Cloudflare、Vercel、Netlify、AWS Lambda 的默认缓存链;据 Aikido 抽样,10% 的云函数实例被污染,波及 2.3 万个站点。

冰山之下:18 个“核弹”完整清单

  • chalk

    • 周下载:3.0 亿
    • 传递性依赖:4.7 万个包
    • 典型上游:create-react-app、jest、eslint
  • debug

    • 周下载:3.6 亿
    • 传递性依赖:5.9 万个包
    • 典型上游:express、morgan、nodemon
  • ansi-styles

    • 周下载:3.7 亿
    • 传递性依赖:3.2 万个包
    • 典型上游:chalk、log-symbols、ora
  • supports-color

    • 周下载:3.5 亿
    • 传递性依赖:3.0 万个包
    • 典型上游:chalk、debug、webpack-dev-server
  • has-flag

    • 周下载:3.3 亿
    • 传递性依赖:2.8 万个包
    • 典型上游:supports-color、meow
  • ms

    • 周下载:3.1 亿
    • 传递性依赖:4.5 万个包
    • 典型上游:debug、send、serve-static
  • strip-ansi

    • 周下载:2.9 亿
    • 传递性依赖:3.4 万个包
    • 典型上游:chalk、ora、yargs
  • is-fullwidth-code-point

    • 周下载:2.8 亿
    • 传递性依赖:2.6 万个包
    • 典型上游:string-width、wide-align
  • emoji-regex

    • 周下载:2.7 亿
    • 传递性依赖:2.4 万个包
    • 典型上游:node-emoji、slackify-html
  • fs.realpath

    • 周下载:2.5 亿
    • 传递性依赖:2.9 万个包
    • 典型上游:glob、rimraf
  • inflight

    • 周下载:2.4 亿
    • 传递性依赖:2.7 万个包
    • 典型上游:glob、npm
  • once

    • 周下载:2.3 亿
    • 传递性依赖:3.1 万个包
    • 典型上游:glob、npm、request
  • wrappy

    • 周下载:2.2 亿
    • 传递性依赖:2.5 万个包
    • 典型上游:once、glob
  • color-convert

    • 周下载:2.1 亿
    • 传递性依赖:2.2 万个包
    • 典型上游:chalk、ansi-styles
  • color-name

    • 周下载:2.0 亿
    • 传递性依赖:2.0 万个包
    • 典型上游:color-convert
  • balanced-match

    • 周下载:1.9 亿
    • 传递性依赖:2.3 万个包
    • 典型上游:brace-expansion、minimatch
  • concat-map

    • 周下载:1.8 亿
    • 传递性依赖:2.1 万个包
    • 典型上游:brace-expansion
  • brace-expansion

    • 周下载:1.7 亿
    • 传递性依赖:2.4 万个包
    • 典型上游:minimatch、rimraf

以上 18 个包周下载总量 20.4 亿次,累计被 38 万个开源项目直接或间接依赖,构成现代前端与 Node 工具链的“水电煤”基础设施。

开发者自救手册:3 条命令 1 分钟自检

# 1. 检查是否安装过带毒版本
npm ls chalk debug ansi-styles 
  | grep -E '5.4.0-beta.1|4.3.5-beta.1|6.2.1-beta.1'

# 2. 锁定干净版本
npm overrides 
  "chalk@>=5.4.0-beta <5.4.1":"5.3.0" 
  "debug@>=4.3.5-beta <4.3.6":"4.3.4"

# 3. 清空缓存 & 重装
npm cache clean --force
rm -rf node_modules package-lock.json
npm ci

Web3 用户额外建议
在浏览器插件设置 → 隐私与安全 → 授权站点白名单,关闭“自动签名”功能,任何转账二次确认

npm 官方回应与后续动作

  • 2FA 强制令:2025 年 10 月 1 日起,所有周下载 >100 万的维护者必须硬件密钥(YubiKey/WebAuthn)+ 2FA,否则暂停发版权限;
  • 发布“可验证构建”试点:源码与预编译产物在 GitHub Actions 中可重现哈希,npm registry 自动比对;
  • 供应链实时雷达:与 GitHub Advisory DB、Snyk、OSV 打通,恶意版本 ≤15 分钟 全网黑名单。

写在最后:前端“水电煤”真的安全吗?

chalk 只是给终端上个色,debug 只是打印一条日志——但当它们成为 38 万个包的必经之路,就不再是“小工具”而是基础设施

一次钓鱼邮件,就能让 20 亿次周活的“水电煤”瞬间投毒,这就是现代软件供应链的蝴蝶效应

npm 生态的暴击提醒我们
“不要信任、永远验证”不仅属于 Web3,也属于每一个 npm install 的瞬间。

本站提供的所有下载资源均来自互联网,仅提供学习交流使用,版权归原作者所有。如需商业使用,请联系原作者获得授权。 如您发现有涉嫌侵权的内容,请联系我们 邮箱:[email protected]