天塌了!NPM 又被 投毒??
就在 七天前,npm 才剛剛經歷一場 “史詩級”供應鏈大屠殺:
攻擊者篡改大名鼎鼎的 chalk 依賴,把 挖礦木馬 + 系統信息竊取腳本 塞進 每周下載量 6000 萬次的流行包,導致 全球無數 CI 瞬間變礦場(詳見《npm 大屠殺:6000 萬下載量 chalk 系被投毒》)。
社區驚魂未定,官方連道歉信都沒寫完——第二把刀閃電般捅到:
48 小時內“雙連擊”
- 9/15 傍晚:220 萬周下載量的 @ctrl/tinycolor 被劫持發布惡意版本,postinstall 自動執行 bundle.js,掃描并外泄本地機密。

- 9/16 凌晨:同一攻擊鏈已 橫向感染 40+ 包,涵蓋 Angular 生態、顏色工具、甚至企業安全廠商包。

- 9/16 早上:第二波投毒 啟動,目標直指 CrowdStrike 相關 npm 包,可自動觸發惡意 GitHub Actions。
一句話總結:上周投毒 chalk,本周輪到你離不開的配色小工具 + 安全大廠 SDK,連“守門員”都成了輸送后門的人。
攻擊手法拆解
(1) 入口:釣魚或泄露 maintainer 的 npm 令牌 → 劫持發布通道。
(2) 植入:在 package.json 的 postinstall 字段調用 node bundle.js。
(3) 執行:
- 掃描 ~/.aws、~/.npmrc、~/.env、GITHUB_TOKEN、DOCKER_AUTH。
- 把機密拼接到 webhook.site 公開地址,無需自建服務器。
- 若運行在 GitHub Actions,還會 創建新的 workflow 文件,持續駐留。
(4) 擴散:利用依賴平級提升(hoist)(node_modules/@ctrl/tinycolor 被上百個包引用),一次投毒,萬人中招。
哪些包已確認“含毒”
以下名稱均來自 Socket 團隊實時推文,列表仍在增加:
- @ctrl/tinycolor(≥4.0.3)
- crowdstrike-* 系列今早更新的所有版本
- 任何在 9/14-9/16 突然發 patch 的 Angular 配色周邊包
- 名稱帶 -color、-theme、-ui 且 版本號異常跳升 的小眾包(典型特征:上周下載 <1000,突然發 2.0.0)
自查與急救三步走
(1) 停裝
# 全局關閉腳本
npm config set ignore-scripts true
# 如果 CI 里用的是 yarn,也加
yarn config set ignore-scripts true(2) 鎖死
# 把現有可用版本寫死
npm shrinkwrap
# 或者把 lock 文件設為只讀,禁止自動刷新
git add package-lock.json && git commit -m "freeze clean deps"(3) 清密
立刻輪換:
- GitHub Personal Access Token
- NPM 訪問令牌
- Docker Hub、AWS、Vault 等任何在 ~/.npmrc 或 env 里出現過的密鑰
審查 GitHub Actions 日志,看是否出現陌生 workflow_run 或對外 HTTP 200 到 webhook.site。
以后還能不能 npm i?
可以,但 別手滑。給出三條“保命”默認配置:
- npm:npm ci --ignore-scripts --audit signatures
- yarn:yarn install --ignore-scripts
- pnpm:pnpm install --ignore-scripts(pnpm 默認會彈窗讓你審腳本,最安全)
再加一道 Socket 插件:
npx socket@latest scan可在 install 前給出 實時風險評分,9 月以來的所有投毒包均被標為 Critical。
寫在最后
npm 的“便利”是把雙刃劍:一個 postinstall 就能讓任何開發者的電腦變成礦機、泄密器、C2 跳板。
供應鏈攻擊已進入 “小時級”迭代 時代,靠 npm 官方人工下架根本來不及。真正的安全閥只有兩道:
- 開發者自己的手指——別一鍵 npm i;
- 自動化審查工具——讓機器先跑,確認無毒再裝。
記住:每一次 npm i,都是把別人寫的代碼直接跑在你的筆記本、CI、生產服務器上。





























