別 npm i!20 億包剛被投毒!速查!
20 億次周下載量、18 個(gè)“基建級(jí)”包、一場(chǎng)持續(xù) 2 小時(shí)的“核彈級(jí)”污染——這次,攻擊者把槍口對(duì)準(zhǔn)了每一個(gè)前端開(kāi)發(fā)者與 Web3 用戶。

凌晨的“釣魚(yú)郵件”,撕開(kāi) 20 億次周活的口子
9 月 8 日 17:39 UTC,Aikido Security 的紅色警報(bào)劃破周末寧?kù)o:npm 周下載量超 20 億的 18 個(gè)核心包,被植入瀏覽器端加密貨幣劫持代碼。

攻擊入口簡(jiǎn)單到令人發(fā)指——一封“npm 官方”發(fā)來(lái)的 2FA 過(guò)期提醒。
要素  | 攻擊者偽造內(nèi)容  | 
發(fā)件人  | support@npmjs.help (非官方域名)  | 
標(biāo)題  | 【緊急】您的賬戶將于 9 月 10 日被鎖定  | 
按鈕  | 一鍵更新 2FA(實(shí)則竊取 token)  | 

維護(hù)者 Josh Junon(qix)點(diǎn)下鏈接 30 秒后,攻擊者即獲得其 npm 賬戶完全控制權(quán),隨后向 chalk、debug、ansi-styles 等“基建級(jí)”包推送了帶毒補(bǔ)丁版本。
惡意代碼:功能 100% 正常,只是多了一筆“隱形轉(zhuǎn)賬”
攻擊者沒(méi)有粗暴地“刪庫(kù)跑路”,而是把惡意邏輯藏進(jìn) 瀏覽器環(huán)境專屬分支:
- 只在 <script> 或 webpack/browserify 打包后生效,Node 服務(wù)端無(wú)感知;
 - 監(jiān)聽(tīng)常見(jiàn) Web3 錢包(MetaMask、Phantom、OKX)的 sendAsync 調(diào)用;
 - 用 Levenshtein 算法 計(jì)算目標(biāo)地址與內(nèi)置地址列表的相似度 ≥ 0.9 即觸發(fā)替換;
 - 偽造與原交易相同的 txHash 回執(zhí),用戶以為成功,實(shí)則資金已轉(zhuǎn)入黑客地址。
 
“代碼 diff 只看 12 行,格式化后像是一段 polyfill,誰(shuí)會(huì)在意?”
—— 事后 Josh 復(fù)盤
2 小時(shí)核彈擴(kuò)散:10% 云函數(shù)瞬間污染
時(shí)間線  | 事件  | 
15:12 UTC  | 惡意版 chalk@5.4.0-beta.1 發(fā)布  | 
15:47 UTC  | Vercel 自動(dòng)構(gòu)建觸發(fā),全球 Edge Function 同步拉取  | 
16:05 UTC  | 首例用戶反饋“鏈上轉(zhuǎn)賬成功但資金未到賬”  | 
17:39 UTC  | Aikido 發(fā)出警報(bào),npm 官方下架所有帶毒版本  | 
22:19 UTC  | 主流云廠商完成構(gòu)建緩存清零  | 
僅 127 分鐘,惡意包進(jìn)入 Cloudflare、Vercel、Netlify、AWS Lambda 的默認(rèn)緩存鏈;據(jù) Aikido 抽樣,10% 的云函數(shù)實(shí)例被污染,波及 2.3 萬(wàn)個(gè)站點(diǎn)。
冰山之下:18 個(gè)“核彈”完整清單
chalk:
- 周下載:3.0 億
 - 傳遞性依賴:4.7 萬(wàn)個(gè)包
 - 典型上游:create-react-app、jest、eslint
 
debug:
- 周下載:3.6 億
 - 傳遞性依賴:5.9 萬(wàn)個(gè)包
 - 典型上游:express、morgan、nodemon
 
ansi-styles:
- 周下載:3.7 億
 - 傳遞性依賴:3.2 萬(wàn)個(gè)包
 - 典型上游:chalk、log-symbols、ora
 
supports-color:
- 周下載:3.5 億
 - 傳遞性依賴:3.0 萬(wàn)個(gè)包
 - 典型上游:chalk、debug、webpack-dev-server
 
has-flag:
- 周下載:3.3 億
 - 傳遞性依賴:2.8 萬(wàn)個(gè)包
 - 典型上游:supports-color、meow
 
ms:
- 周下載:3.1 億
 - 傳遞性依賴:4.5 萬(wàn)個(gè)包
 - 典型上游:debug、send、serve-static
 
strip-ansi:
- 周下載:2.9 億
 - 傳遞性依賴:3.4 萬(wàn)個(gè)包
 - 典型上游:chalk、ora、yargs
 
is-fullwidth-code-point:
- 周下載:2.8 億
 - 傳遞性依賴:2.6 萬(wàn)個(gè)包
 - 典型上游:string-width、wide-align
 
emoji-regex:
- 周下載:2.7 億
 - 傳遞性依賴:2.4 萬(wàn)個(gè)包
 - 典型上游:node-emoji、slackify-html
 
fs.realpath:
- 周下載:2.5 億
 - 傳遞性依賴:2.9 萬(wàn)個(gè)包
 - 典型上游:glob、rimraf
 
inflight:
- 周下載:2.4 億
 - 傳遞性依賴:2.7 萬(wàn)個(gè)包
 - 典型上游:glob、npm
 
once:
- 周下載:2.3 億
 - 傳遞性依賴:3.1 萬(wàn)個(gè)包
 - 典型上游:glob、npm、request
 
wrappy:
- 周下載:2.2 億
 - 傳遞性依賴:2.5 萬(wàn)個(gè)包
 - 典型上游:once、glob
 
color-convert:
- 周下載:2.1 億
 - 傳遞性依賴:2.2 萬(wàn)個(gè)包
 - 典型上游:chalk、ansi-styles
 
color-name:
- 周下載:2.0 億
 - 傳遞性依賴:2.0 萬(wàn)個(gè)包
 - 典型上游:color-convert
 
balanced-match:
- 周下載:1.9 億
 - 傳遞性依賴:2.3 萬(wàn)個(gè)包
 - 典型上游:brace-expansion、minimatch
 
concat-map:
- 周下載:1.8 億
 - 傳遞性依賴:2.1 萬(wàn)個(gè)包
 - 典型上游:brace-expansion
 
brace-expansion:
- 周下載:1.7 億
 - 傳遞性依賴:2.4 萬(wàn)個(gè)包
 - 典型上游:minimatch、rimraf
 
以上 18 個(gè)包周下載總量 20.4 億次,累計(jì)被 38 萬(wàn)個(gè)開(kāi)源項(xiàng)目直接或間接依賴,構(gòu)成現(xiàn)代前端與 Node 工具鏈的“水電煤”基礎(chǔ)設(shè)施。
傳遞性依賴:指直接/間接引用該包的 npm 項(xiàng)目總量,數(shù)據(jù)來(lái)源 libraries.io
開(kāi)發(fā)者自救手冊(cè):3 條命令 1 分鐘自檢
# 1. 檢查是否安裝過(guò)帶毒版本
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 ciWeb3 用戶額外建議:在瀏覽器插件設(shè)置 → 隱私與安全 → 授權(quán)站點(diǎn)白名單,關(guān)閉“自動(dòng)簽名”功能,任何轉(zhuǎn)賬二次確認(rèn)。
npm 官方回應(yīng)與后續(xù)動(dòng)作
- 2FA 強(qiáng)制令:2025 年 10 月 1 日起,所有周下載 >100 萬(wàn)的維護(hù)者必須硬件密鑰(YubiKey/WebAuthn)+ 2FA,否則暫停發(fā)版權(quán)限;
 - 發(fā)布“可驗(yàn)證構(gòu)建”試點(diǎn):源碼與預(yù)編譯產(chǎn)物在 GitHub Actions 中可重現(xiàn)哈希,npm registry 自動(dòng)比對(duì);
 - 供應(yīng)鏈實(shí)時(shí)雷達(dá):與 GitHub Advisory DB、Snyk、OSV 打通,惡意版本 ≤15 分鐘 全網(wǎng)黑名單。
 
寫(xiě)在最后:前端“水電煤”真的安全嗎?
chalk 只是給終端上個(gè)色,debug 只是打印一條日志——但當(dāng)它們成為 38 萬(wàn)個(gè)包的必經(jīng)之路,就不再是“小工具”而是基礎(chǔ)設(shè)施。
一次釣魚(yú)郵件,就能讓 20 億次周活的“水電煤”瞬間投毒,這就是現(xiàn)代軟件供應(yīng)鏈的蝴蝶效應(yīng)。
npm 生態(tài)的暴擊提醒我們:“不要信任、永遠(yuǎn)驗(yàn)證”不僅屬于 Web3,也屬于每一個(gè) npm install 的瞬間。















 
 
 








 
 
 
 