
ChainDrop 攻陷逾 400 個 npm 套件:中招後先隔離,唔好即刻換 token
Keyv 只係起點,開發電腦同 CI runner 都要查
Node.js 團隊今次要快手查清楚依賴樹。iThome 報道,熱門快取套件 Keyv 嘅維護者帳戶出事後,惡意版本經 npm 擴散;Microsoft Threat Intelligence 亦確認,ChainDrop 已牽連超過 400 個套件。佢會偷開發環境入面嘅憑證,再借受害者本身嘅發布權限製造下一批有毒版本,幾個鐘已經由單一維護者燒到多個互不相干嘅 publisher。
npm install 未完,惡意程式已經跑緊
受污染套件會喺 package.json 加入 preinstall,呼叫 node setup.mjs。呢個 loader 再準備 Bun runtime,執行經混淆嘅 Math_Symbol.js 載荷。關鍵係 preinstall 喺安裝完成、測試同一般應用程式檢查之前已經會跑;套件本身之後仲可以照常運作,所以一次成功嘅 npm install 都唔代表環境冇事。
ChainDrop 跟住會判斷自己身處咩環境。喺一般開發電腦,佢會另開背景程序,等安裝程序完咗仍然繼續活動;喺 CI/CD runner,佢就留喺現有 job 入面,趁機接觸 workflow secret、runner token 同 OpenID Connect 發布權限。Hosted runner 雖然個 job 跑完就會棄用,但憑證、build artifact 同共享 cache 可能一早已經流出去;調查時唔可以淨係追嗰部 runner。

圖片:StepSecurity
偷完憑證,再借你個名發布下一輪
Microsoft 分析指,載荷會翻環境變數、設定檔、shell history、SSH key、GitHub Actions runner 記憶體同各款 CLI 登入資料。搵到 token 後,佢仲會主動登入 npm、GitHub、AWS、Kubernetes 同 HashiCorp Vault,確認權限兼讀取更多資源。資料壓縮同加密後,會送去攻擊者控制嘅 HTTPS 端點;如果呢條路唔通,就會改經 GitHub repository 傳走。
如果偷到有寫入權限嘅 npm token,ChainDrop 會下載受害者有權發布嘅套件、塞入 loader 同載荷、加一個 patch 版本,再用受害者身份推上 registry。部分版本更由真正 GitHub Actions workflow 發布,連 provenance attestation 都有效。呢件事拆穿咗一個常見盲點:provenance 可以證明檔案由指定 workflow 整出嚟,但 workflow、帳戶或者入面嘅 commit 一早俾人控制,個簽名一樣可以係真。
Claude 同 VS Code 設定都變成翻生位
偷到 GitHub 權限後,載荷亦會嘗試改動 repository 分支,加入 .claude/settings.json、.claude/setup.mjs、.vscode/tasks.json 同 .vscode/setup.mjs。開發者之後用 Claude Code 開 session,或者信任及打開 VS Code workspace,惡意程式就有另一條執行路徑。Microsoft 仲搵到一個條件式後備流程會裝 token monitor,偵測 token 撤銷後可觸發破壞性處理,所以見到相關痕跡時,先隔離主機同保存證據,唔好喺可疑電腦上急住換 token。
444 個套件係調查快照,Keyv 唔係全線中招
StepSecurity 截至 8 月 4 日 18:10 UTC 嘅調查快照,記錄到 444 個套件、2,212 個惡意版本;集中發布時段係當日 09:35 至 13:20 UTC,即香港時間 17:35 至 21:20。呢啲數字計緊惡意 package artifact,唔等於有 2,212 部機執行過載荷,而且完整名單仍可能跟調查更新,核對時應以研究機構嘅逐項清單為準。
首批確認帶完整載荷嘅 11 個版本係 [email protected]、[email protected]、[email protected]、[email protected]、@cacheable/[email protected]、[email protected]、@cacheable/[email protected]、[email protected]、@cacheable/[email protected]、[email protected] 同 @cacheable/[email protected]。唔可以見到 Keyv 個名就當全線版本都有毒;今次清楚確認嘅 Keyv 版本係 6.0.0,StepSecurity 列出嘅已知安全回退版本就係 5.6.0。
先查 lockfile、cache,再追有冇真正執行
第一輪要查晒 package-lock.json、npm-shrinkwrap.json、其他 lockfile、SBOM、node_modules、artifact repository 同 CI cache,連間接依賴都要計。亦要對照完整受影響清單,唔好淨係搜尋上述 11 個版本;今次後續 433 個套件牽涉大量歷史版本,單睇 package.json 入面幾個直接 dependency 好易漏網。曾經做過無 lockfile fresh install、Renovate 測試或者動態建立專案嘅 job,都要另外翻 CI 紀錄。
主機同網上紀錄可搜尋 setup.mjs、Math_Symbol.js、Math_init.js、math_<guid>.js,同埋 node setup.mjs 或 Bun 執行可疑 JavaScript 嘅程序鏈。Microsoft 公布嘅三個 SHA-256 IOC 分別係 54dc7ea54a1317cca0e890a2770630cf7fa6c97813e0cb9d2caa93012b350668、fd3ca4007b225fdf8de7af4345a19179d5efa8c4bb9205f88cda806e5684b1eb 同 9fc2570b7cef51c1b8df116d144d11ff4096357be7d2c4c6367cfc2509cf1bcc;網絡亦要查 npm-cache[.]com、pypi-get[.]com、js-mirror[.]com 同 /router 路徑。
中招後點收拾,次序好重要
發現受影響版本而又證明唔到 install script 當時已停用,就應先當環境可能失守:隔離開發電腦或 runner、保存 log 同磁碟證據、檢查 .claude、.vscode 及 token monitor 痕跡,再用可信 image 重建。共享 base image、npm 或 yarn cache、artifact store 同下游 build 產物都要重整,因為淨係刪走套件,清唔到已經留低嘅後門同外洩憑證。
完成隔離後,先喺已知乾淨裝置撤銷及更換嗰個環境接觸過嘅 npm、GitHub、雲端、Vault、Kubernetes、SSH、database 同 CI secret,跟住查 npm 發布紀錄、repository 分支、workflow 變動、雲端 audit log 同可疑 public repository。Microsoft 同篇文章有推介 Defender 系列偵測功能,呢部分屬佢自家產品方案;通用修復工作唔依賴 Defender,任何 endpoint、SIEM 或網絡紀錄只要保留到相應程序、hash 同連線資料,都可以照樣追查。
之後每次裝套件,都留一段冷靜期
npm v12 已經預設唔執行未獲批准嘅 dependency lifecycle script,團隊可配合 npm approve-scripts 建立 allowlist。舊環境調查期間亦可考慮 npm ci --ignore-scripts,不過原生 module 同真係靠 install script 嘅套件可能會壞,唔應該當永久設定盲目套用。min-release-age 就可以限制太新嘅版本即時入 build,畀保安工具同社群多幾日發現問題,但緊急安全修補亦可能俾佢擋住,要預先定好例外流程。
ChainDrop 最實際嘅教訓係,團隊要隨時答到某次 build 解咗邊個精確版本、安裝腳本有冇跑過、憑證當時有咩權限。用緊 Node.js、GitHub Actions 或自建 runner 嘅公司同自由工作開發者,應先完成版本及 IOC 核對;只要有一項對中,就按主機失守處理,唔好等套件名由 registry 消失先郁手。
參考來源
- iThome — 剖析NPM套件Keyv遭供應鏈攻擊ChainDrop,微軟揭露惡意程式完整運作流程 — original report
- Microsoft Threat Intelligence:ChainDrop supply chain compromise — 一手惡意程式分析、攻擊流程、修復建議、檔案 hash 同網絡 IOC。
- StepSecurity:ChainDrop npm Worm — 提供截稿快照、精確發布時段、11 個完整載荷版本同其餘受影響套件清單。
- npm Docs:min-release-age 設定 — 確認 release-age 冷靜期嘅運作方式、限制同例外設定。
- GitHub:npm v12 安裝階段保安改動 — 確認 npm v12 已推出,同 dependency lifecycle script 改為預設唔自動執行。
本文根據原文及公開資料整理;資料有出入時,以原文及官方資料為準。







