// 威脅簡報
keyv、cacheable 等 npm 快取套件遭挾持:安裝時竊取憑證,並自我擴散到數百個套件(Shai-Hulud / ChainDrop)
- CVSS
- —
- CISA KEV
- 未列入
- 弱點類型
- CWE-506
AI 審稿 2026-09-30(未經人工)指令測試:未提供漏洞重現:未進行驗證紀錄 ↓
keyv、flat-cache 等熱門 npm 快取套件被發布了惡意版本,一安裝就竊取憑證,並自我擴散到 400 多個套件。
| 誰會中 | 安裝或更新到 keyv 6.0.0、flat-cache 6.1.24、file-entry-cache 11.1.6、cacheable 2.5.1、cacheable-request 13.0.20、cache-manager 7.2.10 等惡意版本(或被感染的下游套件),而且安裝時有執行安裝腳本的開發機與 CI 環境(用 --ignore-scripts 或 npm v12 預設設定安裝不會觸發)。惡意版本在 2026-08-04 發布,但之後仍可能經由還沒下架的下游套件、私有 registry / 鏡像或快取裝到(本頁推論;Snyk 建議從私有 registry 與快取清除這些版本)。也包括開啟被植入設定檔之程式庫的人:OSV 說開發者或 AI 程式助手開啟 clone 就會執行,Snyk 則說要開發者或代理信任並啟用專案設定才會執行(VS Code 視工作區信任與使用者設定可能先詢問)。 |
|---|---|
| 後果 | 惡意程式在 npm install 時自動執行,竊取雲端、GitHub、npm、Kubernetes、私鑰等憑證,再用偷來的 npm token 感染更多套件(OSV)。研究者另指出它會找資料庫連線憑證(SafeDep、Snyk),並安裝 gh-token-monitor 監控程式,在偷來的 token 被撤銷時執行攻擊者的處理程式(SafeDep、Snyk、Wiz);Wiz 表示這個死人開關會依攻擊者伺服器的回應選擇性啟用。 |
| 現在該做什麼 | 檢查 lockfile 與 node_modules 是否有這些版本;有的話把那台機器當成已被入侵。GitHub 公告要求立即從另一台電腦輪替所有秘密;本頁依 Socket、Snyk、Chainguard 的提醒建議的順序是:先隔離機器並移除 gh-token-monitor 常駐程式,再從乾淨的電腦輪替所有憑證,最後重建環境。改釘選到已知安全版本,並用 npm ci --ignore-scripts 重新安裝。 |
| 受影響版本 | keyv 6.0.0、flat-cache 6.1.24、file-entry-cache 11.1.6、cacheable 2.5.1、cacheable-request 13.0.20、cache-manager 7.2.10、@cacheable/net 2.1.1、@cacheable/node-cache 3.1.2、@cacheable/memory 2.2.1、@cacheable/utils 2.5.1、ecto 5.0.1,以及之後被蠕蟲感染的 400 多個下游套件;OSV 與 GHSA 另把 19 個 @keyv/* 轉接套件的 6.0.0 版列為惡意(Socket 表示這些版本不含 preinstall hook,Chainguard 則說 @keyv/* 從未受影響) |
| 修好的版本 | 沒有「修補版」;應改用惡意版之前的版本,例如 keyv 5.6.0、flat-cache 6.1.23、file-entry-cache 11.1.5、cacheable-request 13.0.19、cache-manager 7.2.9、ecto 5.0.0(Snyk),或 2026-08-04 09:30 UTC 之前發布的版本(Endor Labs) |
| 時間點 |
藍隊應對手冊
確認、修補 / 緩解、應變、強化。版本符合受影響條件不等於已被入侵;檢查沒有結果也不等於安全,每一項都有能證明與不能證明的範圍。標記的步驟對應下方攻擊流程裡可以擋下攻擊的那一步。
- 01檢查相依樹與 lockfile
列出這些套件實際安裝的版本,並在 package-lock、yarn.lock、pnpm-lock 中搜尋受影響版本。記得也看間接相依、公告中列出的下游套件,以及 @keyv/* 轉接套件的 6.0.0 版。
唯讀查詢npm ls keyv flat-cache file-entry-cache cacheable cacheable-request cache-manager ecto @cacheable/net @cacheable/node-cache @cacheable/memory @cacheable/utils --all - 02搜尋載入器與第二階段檔案
在 node_modules 中找含有執行 setup.mjs 之 preinstall 的套件,以及 setup.mjs、Math_Symbol.js 等檔案(Snyk)。雜湊值請對照 CSA 與 Aikido 公布的清單。
唯讀查詢find . -path '*node_modules*' \( -name setup.mjs -o -name Math_Symbol.js -o -name math_init.js \) 2>/dev/null - 03檢查常駐程式
SafeDep 公布的 gh-token-monitor 路徑,在 macOS 與 Linux 上都要檢查。
唯讀查詢ls -la ~/.local/bin/gh-token-monitor.sh ~/.config/gh-token-monitor/ ~/Library/LaunchAgents/com.user.gh-token-monitor.plist ~/.config/systemd/user/gh-token-monitor.service 2>/dev/null - 04檢查程式庫與 GitHub 組織
找出不是你加的 .claude/ 與 .vscode/ 檔案;在組織中搜尋描述為「Shai-Hulud: Here We Go Again」的儲存庫、名為「Run Copilot」的 workflow,以及含 toJSON(secrets) 的 workflow(SafeDep)。
唯讀查詢git log --all --oneline -- .claude/settings.json .vscode/tasks.json
- 01釘選已知安全版本並不執行腳本重新安裝
用 overrides 釘選到惡意版之前的版本(例如 keyv 5.6.0、flat-cache 6.1.23),從私有 registry 與快取清除惡意版本,再用 npm ci --ignore-scripts 重新安裝(Snyk)。
- 02開啟程式庫前先檢查 IDE 設定檔
就算乾淨版本已回到 latest,原始碼程式庫本身仍可能被植入設定(Chainguard)。開啟前檢查 .claude/settings.json 與 .vscode/tasks.json,並保持 VS Code 工作區信任機制開啟。
- 01先隔離並移除死人開關,再輪替憑證
GitHub 公告要求立即從另一台電腦輪替所有秘密;Socket、Snyk、Chainguard 則提醒先隔離機器、移除 gh-token-monitor,否則撤銷 token 可能觸發處理程式。本頁建議兩者並用:受感染機器先斷網並停用常駐程式,再從乾淨電腦撤銷 GitHub、npm、雲端等所有憑證。
- 02重建系統並稽核紀錄
重建受影響的機器與 CI runner,並稽核雲端與原始碼管理平台的紀錄(Wiz、CSA)。檢查你發布的套件是否有非預期的新版本。
- 01預設不執行相依套件的安裝腳本
npm v12(2026-07-08 正式推出)預設不執行相依套件的 preinstall、install、postinstall,需以 npm approve-scripts 明確核准。
- 02淘汰可繞過 2FA 的 token,改用分段發布
可繞過 2FA 的 Granular Access Token 自 2026-07-31 起不能做敏感帳號操作,直接發布能力預計約 2027 年 1 月移除。注意:這次惡意版本由專案自己的 CI 發布並帶有效來源證明,trusted publishing 與來源證明擋不住已被控制的原始碼,需要人工 2FA 核准的分段發布較能補這個缺口(本頁推論)。
- 03過濾對外連線、審查 hook 檔案、白名單相依
封鎖非預期的 Bun 下載與以太坊 RPC 流量;在 PR 中審查 IDE 與 AI 代理 hook 檔;採用相依套件白名單(SafeDep、Chainguard、Wiz)。
完整修復步驟與說明
- 確認是否受影響。 用
npm ls <套件> --all檢查,並在 package-lock、yarn.lock、pnpm-lock 搜尋上表版本;在node_modules找執行setup.mjs的preinstall,以及setup.mjs、Math_Symbol.js檔案;檢查不是你加的.claude/、.vscode/檔案。檔案雜湊與網域等指標請直接對照 CSA、Aikido、Datadog 公布的清單。 - 檢查常駐程式。
~/.local/bin/gh-token-monitor.sh、~/.config/gh-token-monitor/、~/Library/LaunchAgents/com.user.gh-token-monitor.plist、~/.config/systemd/user/gh-token-monitor.service。 - 如果中了:處理順序有爭議。 GitHub 公告要求把機器當成完全被入侵,立刻從另一台電腦輪替所有秘密;Socket、Snyk、Chainguard 則提醒先隔離機器並移除
gh-token-monitor,否則撤銷 token 可能觸發處理程式。本頁依這些來源建議兩者並用:受感染機器先斷網並停用常駐程式,再從乾淨電腦撤銷並輪替 GitHub、npm、雲端等所有憑證。 之後重建系統,並稽核雲端與原始碼平台紀錄(Wiz、CSA)。 - 清理並重新安裝。 從私有 registry 與快取清除惡意版本,用
overrides釘選安全版本,再以npm ci --ignore-scripts重新安裝(Snyk)。 - 開啟程式庫前先看設定檔。 Chainguard 提醒,即使乾淨版本已回到
latest,原始碼庫本身仍可能被污染。 - 在 GitHub 組織中搜尋 描述為「Shai-Hulud: Here We Go Again」的儲存庫、名為「Run Copilot」的 workflow,以及含
toJSON(secrets)的 workflow。 - 長期強化。
- npm v12(2026-07-08 正式推出)預設不執行相依套件的安裝腳本,需以
npm approve-scripts核准。 - 可繞過 2FA 的 token 自 2026-07-31 起不能做敏感帳號操作,直接發布能力預計約 2027 年 1 月移除;改用 trusted publishing 或分段發布。
- 注意:trusted publishing 與來源證明擋不住這類事件,因為攻擊者控制了原始碼,專案自己的 CI 就會替惡意版本產生有效證明。需要人工 2FA 核准的分段發布較直接針對這個缺口(本頁推論,非來源針對此事件的說法)。
- 過濾對外連線(封鎖非預期的 Bun 下載與以太坊 RPC 流量)、在 PR 審查 IDE hook 檔、採用相依套件白名單。
- npm v12(2026-07-08 正式推出)預設不執行相依套件的安裝腳本,需以
攻擊流程
從左到右是攻擊發生的順序。藍色盾牌代表這一步可以被擋下,越早擋下越好。點圖示可看細節。
由上到下是攻擊發生的順序。藍色盾牌代表這一步可以被擋下,越早擋下越好。點圖示可看細節。
- 攻擊者
攻擊者控制了維護者的 GitHub 帳號
帳號是怎麼被拿走的,目前沒有公開資訊。攻擊者直接把惡意檔案推到 main 分支。
防禦: 維護者使用抗釣魚的 2FA;main 分支要求他人審查才能合併。
- 你的系統
專案自己的發布流程把惡意版本發到 npm
透過專案的 GitHub Actions 發布,所以版本帶有有效的來源證明(provenance)(OSV);Snyk 表示 npm 資料把 GitHub Actions 列為 keyv@6.0.0 的 trusted publisher。證明只說明「在哪裡、怎麼建置」,不代表原始碼可信。
防禦: 發布前需要人工 2FA 核准的分段發布(本頁推論,非來源針對此事件的說法)。
- 你的系統
受害者執行 npm install,preinstall 腳本自動啟動
載入器 setup.mjs 下載獨立的 Bun 執行環境,再執行約 728 KB 的混淆第二階段程式。用 Bun 可能是為了避開只監控 Node.js 的工具。
防禦: 用 npm ci --ignore-scripts 安裝;升級到 npm v12 並只用 npm approve-scripts 核准必要的腳本;在 CI 過濾對外連線。
- 攻擊者
竊取憑證並送出
目標包括雲端、GitHub、npm、Kubernetes、Vault、私鑰(OSV),研究者另列出 SSH、資料庫、Terraform 狀態、AI 工具設定等。資料加密後送到攻擊者伺服器,備援方式是建立描述為「Shai-Hulud: Here We Go Again」的公開 GitHub 儲存庫。
防禦: 在建置環境使用短效、最小權限的憑證;封鎖非預期的對外連線。
- 外部
蠕蟲自我擴散到其他套件與程式庫
用偷到的 npm token 在可發布的套件中植入載入器並重新發布;同時在可寫入的程式庫提交 .claude/settings.json 與 .vscode/tasks.json,讓開發者或 AI 程式助手開啟 clone 時執行載入器(OSV;Snyk 表示需要信任並啟用專案設定),不需要 npm install。
防禦: 在 PR 審查中檢查 IDE 與 AI 代理的 hook 設定檔;開啟不明程式庫前先檢查這些檔案。
- 攻擊者
安裝「死人開關」常駐程式
gh-token-monitor 以 macOS LaunchAgent 或 Linux systemd 使用者服務常駐,每 60 秒檢查一次 GitHub;token 一被撤銷就執行攻擊者提供的處理程式(SafeDep)。Wiz 表示死人開關會依攻擊者伺服器的回應選擇性啟用。
防禦: 先隔離機器並移除 gh-token-monitor,再撤銷 token(Socket、Snyk、Chainguard)。
影響範圍
這不是程式寫錯的漏洞,而是套件本身被換成了惡意版本。所以沒有 CVE,也就沒有 NVD 的 CVSS 分數,也不在 CISA KEV 清單中(Snyk 自己的漏洞資料庫給 keyv 6.0.0 評了 CVSS 4.0 9.3 分);官方追蹤編號是 OSV 的 MAL- 編號與 GitHub 安全公告(GHSA),弱點類型為 CWE-506(內嵌惡意程式碼)。GitHub 公告的「修補版本」欄位是「無」:處理方式不是打修補,而是不要用那些版本。
第一批被直接污染的 11 個版本(Snyk、Aikido、Datadog 三方一致):
| 套件 | 惡意版本 | 最後已知安全版本(Snyk) | 官方公告 |
|---|---|---|---|
| keyv | 6.0.0 | 5.6.0 | MAL-2026-11524 / GHSA-3p9h-f68w-m6fx |
| flat-cache | 6.1.24 | 6.1.23 | MAL-2026-11971 / GHSA-8jxr-wprf-45g8 |
| file-entry-cache | 11.1.6 | 11.1.5 | MAL-2026-11970 / GHSA-qp89-2g43-jg8j |
| cacheable | 2.5.1 | 2.5.0 | MAL-2026-11963 / GHSA-jpjx-r3gh-v5pf |
| cacheable-request | 13.0.20 | 13.0.19 | MAL-2026-11964 / GHSA-mxgw-gq2g-4fq9 |
| cache-manager | 7.2.10 | 7.2.9 | MAL-2026-11523 / GHSA-p7m5-96hg-gppj |
| @cacheable/net | 2.1.1 | 2.1.0 | MAL-2026-11559 / GHSA-pvp8-4g69-xxqh |
| @cacheable/node-cache | 3.1.2 | 3.1.1 | MAL-2026-11560 / GHSA-7pv9-q9wh-jqc3 |
| @cacheable/memory | 2.2.1 | 2.2.0 | MAL-2026-11558 / GHSA-583f-9h76-9fx2 |
| @cacheable/utils | 2.5.1 | 2.5.0 | MAL-2026-11561 / GHSA-8v3r-r9vg-5r66 |
| ecto | 5.0.1 | 5.0.0 | MAL-2026-11966 / GHSA-g3q3-j6vf-388h |
npm registry 的發布時間也顯示 ecto 5.0.0(2026-06-25)是 5.0.1 之前的版本。Endor Labs 給的通用原則是:釘選在 2026-08-04 09:30 UTC 之前發布的版本。
@keyv/ 轉接套件:來源說法不一。* OSV 與 GHSA 另把 19 個 @keyv/* 套件的 6.0.0 版列為惡意程式(例如 @keyv/redis 為 MAL-2026-12020、@keyv/compress-gzip 為 MAL-2026-12010),包括 @keyv/bigmap、@keyv/cloudflare-kv、@keyv/compress-brotli、@keyv/compress-gzip、@keyv/compress-lz4、@keyv/dynamo、@keyv/encrypt-node、@keyv/encrypt-web、@keyv/etcd、@keyv/memcache、@keyv/mongo、@keyv/mysql、@keyv/postgres、@keyv/redis、@keyv/serialize-msgpackr、@keyv/serialize-superjson、@keyv/sqlite、@keyv/test-suite、@keyv/valkey。npm registry 顯示這些 6.0.0 版在 2026-08-04 09:30–09:32 UTC 發布,比 keyv@6.0.0 早幾分鐘。Socket 也把它們列入時間軸,但表示這些版本不含 preinstall hook,因帳號遭入侵而應視為可疑,惡意程式本體只在上表的套件中確認;OSV 紀錄中附帶的 Amazon Inspector 分析(例如 @keyv/redis)也寫沒有發現安裝時執行或竊取憑證的行為。Chainguard 則表示 @keyv/* 轉接套件從未受影響。本頁無法判斷哪一方正確,建議保守處理:不要使用這些套件的 6.0.0 版(本頁建議)。
這些套件的下載量極大,依 Aikido 統計,keyv 每月約 6.04 億次、flat-cache 約 5.8 億次、file-entry-cache 約 5.71 億次、cacheable-request 約 1.37 億次、cacheable 約 3,000 萬次。
第二波:蠕蟲擴散。 惡意程式用偷來的 npm token 感染其他套件,各家統計不同(因為快照時間不同):
| 來源 | 套件數 | 版本數 |
|---|---|---|
| OSV | 400 以上 | — |
| Aikido | 至少 444 | 1,381 |
| SafeDep | 444(12 個組織) | 2,234 |
| Endor Labs | 384 | 1,136 |
| CSA 新加坡 | — | 超過 1,300 |
點名受影響的下游範圍包括 @ornikar/*、@onereach/*、@or-sdk/*、@servicetitan/*、@qlik/*、@picsart/*、@deliveroo/*。整體而言可以說:超過 400 個套件、遠超過 1,000 個版本。
誰可能中招(本頁推論,非來源明說): keyv 的惡意版是新的主版本 6.0.0,只允許 ^5.x 的專案不會自動裝到;但 flat-cache、file-entry-cache、cacheable-request、cache-manager 的惡意版都只是小修號,使用 ^ 或 ~ 範圍又在惡意版本還在時重新解析相依的專案,可能自動裝到。惡意版本在 2026-08-04 發布,但下游被感染的套件陸續發布到當天 13:18(SafeDep),私有 registry、鏡像或快取也可能保留已被 npm 移除的惡意版本,所以之後的安裝仍可能裝到;Snyk 因此建議從私有 registry 與快取清除這些版本。
前提是安裝時有執行安裝腳本。 惡意程式靠 preinstall 腳本啟動,OSV 要求把「以啟用安裝腳本的方式安裝過這個版本」的環境視為完全被入侵。用 --ignore-scripts 安裝,或用 npm v12(2026-07-08 正式推出,預設不執行相依套件的 preinstall、install、postinstall,除非明確核准)安裝時,這段程式不會被觸發。其他套件管理工具的預設行為本頁沒有查證。不過下面這條 IDE 設定檔的路徑不需要安裝。
另外,不用 npm install 也可能中招:開啟被植入 .claude/、.vscode/ 設定檔的程式庫也可能觸發執行,但來源對觸發條件說法不同。OSV 說開發者或 AI 程式助手開啟 clone 時就會執行載入器;Snyk 則說要開發者或程式助手信任並啟用專案層級的設定才會形成這條執行路徑,VS Code 視工作區信任與使用者設定可能會先詢問。
原理
1. 入口:維護者帳號。 攻擊者控制了維護者的 GitHub 帳號,但怎麼取得的目前未知。攻擊者把惡意檔案直接推到 main,之後重設並重播 git 歷史,掩蓋痕跡。
2. 專案自己的發布流程替攻擊者簽了名。 OSV 說攻擊者把惡意程式推進原始碼庫,再透過 GitHub Actions 發布,所以惡意版本帶著有效的簽章來源證明上了 npm;Snyk 表示 npm 資料把 GitHub Actions 列為 keyv@6.0.0 的 trusted publisher。Snyk 指出關鍵:來源證明只能證明「在哪裡、用什麼流程建置」,不能證明原始碼可信。
3. 安裝時自動執行。 攻擊者在 package.json 加了 preinstall 腳本,在 npm install 時、任何應用程式碼執行前,就跑起載入器 setup.mjs。它下載獨立的 Bun 執行環境(1.3.13),再執行約 728 KB 的混淆第二階段程式 Math_Symbol.js(又名 math_init.js)。Socket 與 Datadog 認為改用 Bun 可能是為了躲過只監控 Node.js 的工具。
4. 偷什麼。 雲端(AWS、GCP、Azure,含執行個體中繼資料)、GitHub 與 npm token、Kubernetes 服務帳號 token、HashiCorp Vault、SSH 金鑰、資料庫連線字串(SafeDep 表示會找內嵌帳密的 MongoDB、MySQL、PostgreSQL、Redis 網址)、Terraform 狀態、Docker 設定、Stripe 與 Slack token;Wiz 另提到加密貨幣錢包與 AI 工具(Claude、OpenAI、Cursor、Gemini)的憑證與設定;Datadog 表示在 Linux 上有 sudo 時會讀取 GitHub Actions runner 的記憶體。還有名為「Run Copilot」的 workflow 會把整個程式庫的秘密一次倒出。
5. 送去哪裡。 資料加密後送到攻擊者伺服器,伺服器清單從以太坊智慧合約查詢;備援方式是建立描述為「Shai-Hulud: Here We Go Again」的公開 GitHub 儲存庫(SafeDep 數到超過 1,000 個)。Datadog 指出伺服器回傳的內容會被當成程式執行,等於一個通用後門。
6. 怎麼擴散。 兩條路:用偷到的 npm token 把載入器塞進所有能發布的套件並重新發布(SafeDep 觀察到有組織以約每秒一個的速度發布);以及在能寫入的程式庫提交 .claude/settings.json(Claude Code 的 SessionStart hook)與 .vscode/tasks.json(runOn: folderOpen)。
7. 死人開關。 安裝 gh-token-monitor(macOS LaunchAgent 或 Linux systemd 使用者服務),每 60 秒檢查 GitHub,發現 token 被撤銷就執行攻擊者提供的處理程式(SafeDep、Snyk)。Wiz 表示這一版的死人開關會依攻擊者伺服器的回應選擇性啟用:伺服器可以回傳指令來啟用它,並指定要監控哪個 token。
有風險的安裝方式(概念示意,不是惡意程式碼):
展開程式碼範例(bash)
# 在 CI 中用寬鬆版本範圍即時解析,並允許所有相依套件的安裝腳本執行
npm install較安全的安裝方式(概念示意):
展開程式碼範例(bash)
# 依 lockfile 安裝固定版本,且不執行任何相依套件的生命週期腳本
npm ci --ignore-scripts展開程式碼範例(json)
{
"overrides": {
"keyv": "5.6.0",
"flat-cache": "6.1.23",
"file-entry-cache": "11.1.5",
"cacheable-request": "13.0.19",
"cache-manager": "7.2.9"
}
}(overrides 版本需依你的相依樹實際使用的主版本調整。)
時間軸
| 時間(2026-08-04 UTC,另註明者除外) | 事件 |
|---|---|
| 09:02 | 第一個惡意 commit,加入載荷檔與 preinstall hook(Datadog) |
| 09:04 | 加入 VS Code 與 Claude Code hook(SafeDep) |
| 09:12–09:18 | 程式庫歷史被重設並重播,掩蓋痕跡(Datadog) |
| 09:30–09:32 | 19 個 @keyv/* 套件的 6.0.0 版發布,之後被 OSV 與 GHSA 列為惡意(npm registry;Socket 表示這些版本不含 preinstall hook) |
| 09:35 | keyv@6.0.0 帶來源證明發布 |
| 09:38 | 兩個命名空間以外的第一個套件被感染(Socket) |
| 10:06–10:07 | cacheable 程式庫被推入惡意 commit 並建立 GitHub release(Datadog) |
| 10:09–10:28 | cacheable 家族(10:09–10:14)與 ecto(10:28)的惡意版本發布到 npm(Datadog、Snyk;Socket 列出 cacheable 家族 10:09–10:14) |
| 10:18–10:20 | 第一批公開警告(Snyk) |
| 10:39–11:11 | npm 移除 flat-cache@6.1.24、cacheable-request@13.0.20、cache-manager@7.2.10;11:16 時仍有 8 個惡意版本標為 latest(Snyk) |
| 13:18 | 最後一次已知的惡意發布(SafeDep) |
| 當日 | OSV 與 GHSA 公告發布 |
| 約 20:40 | npm 據稱宣布事件已控制,並預防性輪替可繞過 2FA 的寫入權限 token(僅二手轉述,未確認) |
| 2026-08-06 | 新加坡 CSA 發布 AD-2026-009 |
沒有 CVE 發布日,也沒有列入 CISA KEV。
延伸閱讀
- 評分: 沒有 CVE,因此沒有 NVD 分數。GitHub 將 keyv 公告標為 Critical(惡意程式);Snyk 的漏洞資料庫給 keyv 6.0.0 評了 CVSS 4.0 9.3 分(Critical)。
- 版本標註: Chainguard 撰文時對 file-entry-cache、cacheable、@cacheable/memory、@cacheable/node-cache 的版本標註為不確定。
- 尚未確認: 維護者帳號怎麼被入侵、npm 上各版本目前的狀態(本頁無法查證)、維護者本人的說明(未找到;keyv 儲存庫唯一相關 issue #2051 由第三方開立且已關閉)。
- 所屬攻擊系列: Datadog 與 CSA 稱此惡意程式為「ChainDrop」,屬 Shai-Hulud 家族;Wiz 認為它是「Mini Shai-Hulud」的後代,建立在 TeamPCP 公開的程式庫上,但沒有說這次是 TeamPCP 發動。SafeDep 則認為與先前事件的直接關聯尚未確認,「Here We Go Again」標記只暗示延續或共用基礎設施。
- 背景: 最早的 Shai-Hulud 於 2025-09-14 被發現,GitHub 移除了 500 多個套件並宣布強化 npm。2026-05-11 的 Mini Shai-Hulud / TanStack 事件由 Wiz 高度信心歸因於 TeamPCP,入口是 GitHub Actions 弱點鏈,與這次的帳號被接管不同。Chainguard 把 keyv 算作 2026 年同一工具組的第三波(4 月 PyTorch Lightning、5 月 @antv),但沒有列入 TanStack,所以「第幾波」依來源而定;4 月與 @antv 兩波本頁只有 Chainguard 一個來源。
- 相關弱點類型: CWE-506。
驗證紀錄 AI 依審稿規則逐項核對來源,全部通過;未經人工審稿,也尚未在我們的環境重現
| AI 審稿 | 2026-09-30 · 審稿規則 |
|---|
驗證紀錄只寫環境與結果,不公開重現步驟或可攻擊他人系統的程式。詳見 政策.
來源
- 安全公告MAL-2026-11524: Malicious code in keyv (npm) · OSV, 2026-08-04 · 查閱 2026-09-23
- 安全公告MAL-2026-11963: Malicious code in cacheable (npm) · OSV, 2026-08-04 · 查閱 2026-09-23
- 安全公告MAL-2026-11971: Malicious code in flat-cache (npm) · OSV, 2026-08-04 · 查閱 2026-09-23
- 安全公告Malware in keyv (GHSA-3p9h-f68w-m6fx) · GitHub Advisory Database, 2026-08-04 · 查閱 2026-09-23
- 安全公告Malware in cacheable (GHSA-jpjx-r3gh-v5pf) · GitHub Advisory Database, 2026-08-04 · 查閱 2026-09-23
- 安全公告Malware in flat-cache (GHSA-8jxr-wprf-45g8) · GitHub Advisory Database, 2026-08-04 · 查閱 2026-09-23
- 安全公告MAL-2026-11970: Malicious code in file-entry-cache (npm) · OSV, 2026-08-04 · 查閱 2026-09-24
- 安全公告Malware in file-entry-cache (GHSA-qp89-2g43-jg8j) · GitHub Advisory Database, 2026-08-04 · 查閱 2026-09-24
- 安全公告Embedded Malicious Code in keyv (SNYK-JS-KEYV-18515941) · Snyk Vulnerability Database, 2026-08-04 · 查閱 2026-09-24
- 安全公告Ongoing npm Supply Chain Attack Affecting Keyv and Related Packages ("Shai-Hulud" Worm) · Cyber Security Agency of Singapore, 2026-08-06 · 查閱 2026-09-23
- 其他[URGENT] Repository and package compromised (issue #2051) · keyv 專案(GitHub), 2026-08-04 · 查閱 2026-09-23
- 研究文章Popular npm packages in the keyv and cacheable namespaces compromised in active supply chain attack · Socket, 2026-08-04 · 查閱 2026-09-23
- 研究文章Keyv and friends compromised in npm supply chain attack · Aikido Security, 2026-08-04 · 查閱 2026-09-23
- 研究文章keyv and cacheable npm compromise: 400+ packages · SafeDep, 2026-08-04 · 查閱 2026-09-23
- 研究文章keyv and cacheable npm Package Hijacked in Supply Chain Attack · Wiz, 2026-08-04 · 查閱 2026-09-23
- 研究文章Inside the keyv npm Supply Chain Compromise · Snyk, 2026-08-04 · 查閱 2026-09-23
- 研究文章The keyv and cacheable npm Supply Chain Attack: Inside the Mini Shai-Hulud Campaign · Chainguard, 2026-08-04 · 查閱 2026-09-23
- 研究文章'ChainDrop' worm compromises hundreds of popular npm packages · Datadog Security Labs, 2026-08-04 · 查閱 2026-09-23
- 研究文章NPM Malware Compromises keyv and cacheable with 500M+ Weekly Downloads and Spreads to Hundreds of Packages · Endor Labs, 2026-08-04 · 查閱 2026-09-23
- 其他Legitimate provenance did not stop the malware · cuon (note.com) · 查閱 2026-09-23
- 廠商說明npm install-time security and GAT bypass2fa deprecation · GitHub Changelog, 2026-07-08 · 查閱 2026-09-28
- 廠商說明Restricting npm bypass-2FA granular access tokens · GitHub Changelog, 2026-07-31 · 查閱 2026-09-23
- 廠商說明Our plan for a more secure npm supply chain · GitHub Blog, 2025-09-22 · 查閱 2026-09-23
- 研究文章Mini Shai-Hulud Strikes Again: TanStack + more npm Packages Compromised · Wiz, 2026-05-11 · 查閱 2026-09-23
- 安全公告MAL-2026-11964: Malicious code in cacheable-request (npm) · OSV, 2026-08-04 · 查閱 2026-09-28
- 安全公告MAL-2026-11523: Malicious code in cache-manager (npm) · OSV, 2026-08-04 · 查閱 2026-09-28
- 安全公告MAL-2026-11559: Malicious code in @cacheable/net (npm) · OSV, 2026-08-04 · 查閱 2026-09-28
- 安全公告MAL-2026-11560: Malicious code in @cacheable/node-cache (npm) · OSV, 2026-08-04 · 查閱 2026-09-28
- 安全公告MAL-2026-11558: Malicious code in @cacheable/memory (npm) · OSV, 2026-08-04 · 查閱 2026-09-28
- 安全公告MAL-2026-11561: Malicious code in @cacheable/utils (npm) · OSV, 2026-08-04 · 查閱 2026-09-28
- 安全公告MAL-2026-11966: Malicious code in ecto (npm) · OSV, 2026-08-04 · 查閱 2026-09-28
- 安全公告MAL-2026-12020: Malicious code in @keyv/redis (npm) · OSV, 2026-08-04 · 查閱 2026-09-28
- 安全公告MAL-2026-12010: Malicious code in @keyv/compress-gzip (npm) · OSV, 2026-08-04 · 查閱 2026-09-28
- 其他@keyv/redis package metadata (npm registry) · npm registry · 查閱 2026-09-28
- 其他ecto package metadata (npm registry) · npm registry · 查閱 2026-09-28
媒體簡報
一句話
2026 年 8 月 4 日,keyv、flat-cache、cacheable 等 npm 快取套件被發布了惡意版本(依 Aikido 統計,keyv 與 flat-cache 每月下載各約 6 億次,cacheable 約 3,000 萬次)。攻擊者控制了維護者的 GitHub 帳號,讓專案自己的發布流程把惡意程式送上 npm,因此這些版本帶有看似正常的來源證明。惡意程式在安裝時竊取開發者與 CI 的憑證,再自我擴散到 400 多個套件、上千個版本。這起事件屬於 Shai-Hulud 系列攻擊,沒有 CVE 編號,以 OSV 的 MAL-2026-11524 等編號追蹤。
關鍵數字
- 主要編號
- OSV MAL-2026-11524(keyv 6.0.0),別名 GHSA-3p9h-f68w-m6fx;無 CVE osv.dev
- 弱點類型
- CWE-506 內嵌惡意程式碼;沒有修補版本 github.com
- 擴散規模
- 至少 444 個套件、1,381 個版本(Aikido;各家數字不同) aikido.dev
- keyv 首個惡意版發布
- 2026-08-04 09:35 UTC securitylabs.datadoghq.com
- 新加坡 CSA 公告
- AD-2026-009,2026-08-06 csa.gov.sg
已確認
- keyv 6.0.0、flat-cache 6.1.24、file-entry-cache 11.1.6、cacheable 2.5.1 被 OSV 與 GitHub 公告列為惡意版本(CWE-506)。
- 惡意版本經由專案自己的 GitHub Actions 發布,帶有有效的來源證明(OSV)。
- 惡意程式在安裝時竊取憑證,並用偷來的 npm token 感染其他套件,也會植入 Claude Code 與 VS Code 的自動執行設定。
尚未確認 / 說法不一
- 是否經 npm trusted publishing 發布:Snyk 表示 npm 資料把 GitHub Actions 列為 keyv@6.0.0 的 trusted publisher,OSV 只說經 GitHub Actions 發布並帶有效來源證明;6.0.0 已從 npm 移除,本頁無法自行查證。
- 維護者帳號是怎麼被入侵的,尚未公開。
- 日期說法不一:Snyk 漏洞資料庫把 keyv 的揭露與引入日期標為 2026-08-03,npm registry 顯示 keyv@6.0.0 在 2026-08-04 09:35 UTC 發布,Socket、Datadog 也都寫 8 月 4 日;本頁採用 npm registry 的日期,Snyk 標示差異的原因不明。
- @keyv/* 轉接套件的 6.0.0 版是否惡意:OSV 與 GHSA 列為惡意,Socket 表示不含 preinstall hook、只視為可疑,Chainguard 說 @keyv/* 從未受影響。
- 受感染套件與版本的總數,各研究單位從 384 到 444 個套件、1,136 到 2,234 個版本不等。
- 誰是實際操作者:Wiz 指出惡意程式大量沿用 TeamPCP 公開的程式碼,工具有關聯,但沒有說是 TeamPCP 發動;操作者尚未確認(SafeDep 也認為與先前事件的關聯未確認)。npm 宣布已控制事件的說法本頁只取得二手轉述。
可引用的一句話
這次的套件有完整的「出生證明」,問題是出生的地方本身已經被人占領了。
圖片
引用時請標示「PlainCVE」並附上本頁連結。 完整引用格式見下方「如何引用本頁」。有事實錯誤請回報.
keyv、cacheable 等 npm 快取套件遭挾持:安裝時竊取憑證,並自我擴散到數百個套件(Shai-Hulud / ChainDrop) 2026 年 8 月 4 日,keyv、flat-cache、cacheable 等 npm 快取套件被發布了惡意版本(依 Aikido 統計,keyv 與 flat-cache 每月下載各約 6 億次,cacheable 約 3,000 萬次)。攻擊者控制了維護者的 GitHub 帳號,讓專案自己的發布流程把惡意程式送上 npm,因此這些版本帶有看似正常的來源證明。惡意程式在安裝時竊取開發者與 CI 的憑證,再自我擴散到 400 多個套件、上千個版本。這起事件屬於 Shai-Hulud 系列攻擊,沒有 CVE 編號,以 OSV 的 MAL-2026-11524 等編號追蹤。 關鍵數字: - 主要編號:OSV MAL-2026-11524(keyv 6.0.0),別名 GHSA-3p9h-f68w-m6fx;無 CVE(https://osv.dev/vulnerability/MAL-2026-11524) - 弱點類型:CWE-506 內嵌惡意程式碼;沒有修補版本(https://github.com/advisories/GHSA-3p9h-f68w-m6fx) - 擴散規模:至少 444 個套件、1,381 個版本(Aikido;各家數字不同)(https://www.aikido.dev/blog/keyv-and-friends-compromised-in-npm-supply-chain-attack) - keyv 首個惡意版發布:2026-08-04 09:35 UTC(https://securitylabs.datadoghq.com/articles/npm-worm-compromises-popular-npm-packages/) - 新加坡 CSA 公告:AD-2026-009,2026-08-06(https://www.csa.gov.sg/alerts-and-advisories/advisories/ad-2026-009/) 已確認: - keyv 6.0.0、flat-cache 6.1.24、file-entry-cache 11.1.6、cacheable 2.5.1 被 OSV 與 GitHub 公告列為惡意版本(CWE-506)。 - 惡意版本經由專案自己的 GitHub Actions 發布,帶有有效的來源證明(OSV)。 - 惡意程式在安裝時竊取憑證,並用偷來的 npm token 感染其他套件,也會植入 Claude Code 與 VS Code 的自動執行設定。 尚未確認 / 說法不一: - 是否經 npm trusted publishing 發布:Snyk 表示 npm 資料把 GitHub Actions 列為 keyv@6.0.0 的 trusted publisher,OSV 只說經 GitHub Actions 發布並帶有效來源證明;6.0.0 已從 npm 移除,本頁無法自行查證。 - 維護者帳號是怎麼被入侵的,尚未公開。 - 日期說法不一:Snyk 漏洞資料庫把 keyv 的揭露與引入日期標為 2026-08-03,npm registry 顯示 keyv@6.0.0 在 2026-08-04 09:35 UTC 發布,Socket、Datadog 也都寫 8 月 4 日;本頁採用 npm registry 的日期,Snyk 標示差異的原因不明。 - @keyv/* 轉接套件的 6.0.0 版是否惡意:OSV 與 GHSA 列為惡意,Socket 表示不含 preinstall hook、只視為可疑,Chainguard 說 @keyv/* 從未受影響。 - 受感染套件與版本的總數,各研究單位從 384 到 444 個套件、1,136 到 2,234 個版本不等。 - 誰是實際操作者:Wiz 指出惡意程式大量沿用 TeamPCP 公開的程式碼,工具有關聯,但沒有說是 TeamPCP 發動;操作者尚未確認(SafeDep 也認為與先前事件的關聯未確認)。npm 宣布已控制事件的說法本頁只取得二手轉述。 「這次的套件有完整的「出生證明」,問題是出生的地方本身已經被人占領了。」— PlainCVE https://plaincve.date/vulns/mal-2026-11524-keyv-cacheable-npm-compromise
如何引用本頁
本文採 CC BY 4.0,轉載請保留署名與連結。
PlainCVE 團隊(2026)。《keyv、cacheable 等 npm 快取套件遭挾持:安裝時竊取憑證,並自我擴散到數百個套件(Shai-Hulud / ChainDrop)》。PlainCVE。https://plaincve.date/vulns/mal-2026-11524-keyv-cacheable-npm-compromise(查閱日期:YYYY-MM-DD)BibTeX
@misc{mal202611524keyvcacheablenpmcompromise2026,
title = {keyv、cacheable 等 npm 快取套件遭挾持:安裝時竊取憑證,並自我擴散到數百個套件(Shai-Hulud / ChainDrop)},
author = {PlainCVE 團隊},
year = {2026},
howpublished = {PlainCVE},
url = {https://plaincve.date/vulns/mal-2026-11524-keyv-cacheable-npm-compromise},
note = {更新於 2026-09-30}
}