
keyv 供應鏈蠕蟲攻陷 444 個 npm 套件:開發團隊即時排查指南
先查 lockfile 同安裝紀錄,中招就要由乾淨裝置輪換所有 secrets
iThome 報道,keyv 維護者嘅 GitHub 帳號俾人入侵,攻擊者改咗三個項目嘅原始碼,再借原有 GitHub Actions 發布流程送出惡意 npm 版本。事件值得即刻處理,因為 keyv 呢類底層工具好多時藏喺依賴樹深處,開發者冇直接裝過,一樣可能由其他套件帶入項目。
由一個套件變成識得自己擴散嘅蠕蟲
StepSecurity 嘅原始分析截至香港時間 8 月 5 日凌晨 2 時 10 分,確認 444 個套件、2,212 個惡意版本,數字包括首批 11 個直接植入惡意程式嘅套件,同埋蠕蟲用偷返嚟嘅發布憑證污染嘅 433 個套件。最早確認版本包括 [email protected]、[email protected]、[email protected]、[email protected] 同 [email protected];完整名單要跟持續更新嘅 IOC,唔好淨係查呢幾個名。
惡意套件加咗 preinstall,安裝期間會啟動 setup.mjs,下載正版 Bun runtime,再跑真正嘅竊密程式。目標包括環境變數、npm 同 GitHub token、SSH key、AWS、Azure、Google Cloud、Kubernetes、Vault、資料庫連線資料,同多款 AI 開發工具嘅登入資料。偷到 npm 發布權限後,佢仲會替受害者管理嘅套件推出新惡意版本,幾個鐘內擴散就係咁發生。

圖片:StepSecurity
見到 keyv 個名,未等於部機已經失守
風險要分三層。package.json 直接列出 keyv,只代表項目想用佢;package-lock.json 或依賴樹命中受污染嘅 套件名加版本,代表建置有機會拉過惡意檔;只有開發機或 CI runner 真係安裝過嗰個版本,惡意 preinstall 先會執行。舉例,ESLint 可沿 file-entry-cache → flat-cache → keyv 帶入 keyv,但鎖住 [email protected] 嘅項目唔會因為 [email protected] 出事就自動中招。
先跑 npm ls keyv flat-cache file-entry-cache --all 睇已裝版本,再用 npm explain keyv 追返邊個上層套件帶佢入嚟;冇保留 node_modules 就用 npm ls --package-lock-only --all 查 lockfile。跟住攞 Wiz 公開嘅套件及版本 CSV逐項比對 package-lock.json、yarn.lock 或 pnpm-lock.yaml。淨係搜尋 keyv 唔夠,第二波有大量套件名同 keyv 完全冇關。
再查 CI、Claude Code 同 VS Code 痕跡
命中版本後,要翻查 8 月 4 日 UTC 09:35 之後嘅 npm install、npm ci、yarn 或 pnpm 紀錄,亦要睇舊 lockfile、CI cache 同已刪 runner 嘅工作紀錄。可疑檔案包括 node_modules/**/setup.mjs、Math_Symbol.js、math_init.js,仲有突然出現嘅 .claude/setup.mjs、.claude/settings.json、.vscode/setup.mjs 同 .vscode/tasks.json。研究人員指,後兩組設定可喺開啟 VS Code 資料夾或啟動 Claude Code session 時再次執行惡意程式,就算冇再跑 npm install 都可能重新觸發。
中招後,輪換 secrets 個次序好重要
確認執行過惡意版本,就先隔離開發機或 runner、停低發布流程同保留 audit log。StepSecurity 仲發現 macOS 同 Linux 可出現 gh-token-monitor 持續感染機制,專門喺 GitHub token 失效時觸發指令;要由保安人員先清除呢個 watcher,再用另一部可信裝置撤銷憑證,唔好喺疑似中招嗰部機直接登入各個後台。
輪換範圍至少包括 npm token、GitHub PAT、OAuth session、SSH key、deploy key、雲端 access key、Kubernetes service account、CI/CD secrets、資料庫密碼,同當時放喺環境變數或 .env 嘅 API key。npm 官方建議刪除已外洩 token;GitHub 官方指引亦要求先撤銷舊憑證,再建立新 token 同 SSH key。最後重建 runner、清走 node_modules 同 package cache,檢查有冇陌生版本、Run Copilot workflow、異常 commit 或新建資料庫,先重新開放發布。
今次仲拆穿咗一個常見誤會:[email protected] 經真正 GitHub Actions 同 npm OIDC 發布,所以有有效 provenance。嗰張證明只講到套件由邊個 workflow 建出嚟,保證唔到送入 workflow 嘅原始碼冇毒。鎖版本仍然有用,不過團隊仲要為新版本設冷靜期、限制 CI 對外連線,新加嘅 lifecycle script 亦要由人手覆核。
參考來源
- iThome — 熱門NPM套件keyv遭植入竊密蠕蟲,至少400個套件受感染 — original report
- StepSecurity:ChainDrop npm Worm — 原始技術分析、受污染版本、IOC、持續感染機制同修復次序。
- Aikido:Keyv and friends compromised in npm supply chain attack — 獨立研究,交叉核對首批惡意版本、竊密範圍同 AI 開發工具持續感染手法。
- Wiz Research:keyv 受污染套件及版本清單 — 可下載嘅公開 IOC 清單,方便逐項比對 lockfile。
- npm Docs:Revoking access tokens — npm 官方撤銷受影響 token 指引。
- npm Docs:npm ls — npm 官方依賴樹查核方法,亦解釋點用 npm explain 追查間接依賴。
- GitHub Docs:Revoking your credentials — GitHub 官方 token、SSH key 同授權撤銷及重建指引。
本文根據原文及公開資料整理;資料有出入時,以原文及官方資料為準。







