別 npm i!20 億包剛被投毒!速查!
20 億次周下載量、18 個“基建級”包、一場持續 2 小時的“核彈級”污染——這次,攻擊者把槍口對準了每一個前端開發者與 Web3 用戶。

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

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

維護者 Josh Junon(qix)點下鏈接 30 秒后,攻擊者即獲得其 npm 賬戶完全控制權,隨后向 chalk、debug、ansi-styles 等“基建級”包推送了帶毒補丁版本。
惡意代碼:功能 100% 正常,只是多了一筆“隱形轉賬”
攻擊者沒有粗暴地“刪庫跑路”,而是把惡意邏輯藏進 瀏覽器環境專屬分支:
- 只在 <script> 或 webpack/browserify 打包后生效,Node 服務端無感知;
- 監聽常見 Web3 錢包(MetaMask、Phantom、OKX)的 sendAsync 調用;
- 用 Levenshtein 算法 計算目標地址與內置地址列表的相似度 ≥ 0.9 即觸發替換;
- 偽造與原交易相同的 txHash 回執,用戶以為成功,實則資金已轉入黑客地址。
“代碼 diff 只看 12 行,格式化后像是一段 polyfill,誰會在意?”
—— 事后 Josh 復盤
2 小時核彈擴散:10% 云函數瞬間污染
時間線 | 事件 |
15:12 UTC | 惡意版 chalk@5.4.0-beta.1 發布 |
15:47 UTC | Vercel 自動構建觸發,全球 Edge Function 同步拉取 |
16:05 UTC | 首例用戶反饋“鏈上轉賬成功但資金未到賬” |
17:39 UTC | Aikido 發出警報,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 工具鏈的“水電煤”基礎設施。
傳遞性依賴:指直接/間接引用該包的 npm 項目總量,數據來源 libraries.io
開發者自救手冊: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 ciWeb3 用戶額外建議:在瀏覽器插件設置 → 隱私與安全 → 授權站點白名單,關閉“自動簽名”功能,任何轉賬二次確認。
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 的瞬間。


























