2026 年 8 月 4 日約 09:00 UTC,一名攻擊者取得了 Jared Wray(jaredwray)GitHub 帳號的控制權 。他們利用此權限,直接將惡意程式碼推送至 keyv 儲存庫的 main 分支,並立即在整個 keyv 和 cacheable 套件家族中發布了新的版本 。
最初的感染種子涵蓋了這兩個命名空間下的 11 個套件,包括 keyv、cacheable-request、cache-manager、@cacheable/utils、flat-cache、file-entry-cache 等 。來自 Aikido Security、StepSecurity(將此蠕蟲命名為「ChainDrop」)、Socket 和 Chainguard 的安全研究人員都在事發頭幾個小時內獨立確認了此次入侵 。
每個被感染的套件都收到了相同的感染模式:兩個新檔案(setup.mjs 和 Math_Symbol.js),以及一份被修改過的 package.json,其中新增了 "preinstall": "node setup.mjs" 條目 。
當任何開發者或 CI 系統執行 npm install 時,setup.mjs 這個 dropper 會在安裝完成前自動執行。它的工作是從 GitHub Releases 下載一個正式的 Bun JavaScript 執行環境二進位檔,然後啟動混淆過的第二階段酬載(Math_Symbol.js,大小約 710–728 KB)。
微軟威脅情报(Microsoft Threat Intelligence)確認此酬載是 Mini Shai-Hulud 的一個變種 。它會從受感染的環境中竊取多種憑證和機密資料 :
這起攻擊之所以特別危險,在於它能夠自我複製。蠕蟲在竊取受感染環境中的 npm 發布 token 和 GitHub PAT 後,會利用這些存取權限,為其他無關維護者擁有的套件發布更多惡意版本 。
受影響的範圍迅速擴大:
這隻蠕蟲跨越了命名空間的邊界——它並未停留在最初感染的 keyv/cacheable 家族中,而是跳躍到了包括 Deliveroo、Ornikar、OneReach、Picsart、Qlik 和 ServiceTitan 等許多組織所擁有的套件 。
被竊取的憑證會被外洩到攻擊者控制的一個 GitHub 儲存庫——蠕蟲會為此創建一個新的儲存庫,或使用一個專門的外洩儲存庫 。該酬載內建了多條備援的外洩管道 ,使其能夠抵禦任何單一管道被關閉的風險。
多家公司的安全研究人員呼籲團隊,將任何接觸過受影響套件的系統都視為完全淪陷。以下是一致建議的補救步驟 :
使用 npm/yarn/pnpm 的 overrides(例如在 package.json 中設定 "overrides"),以防止意外重新安裝有毒版本 。檢查 lockfile(package-lock.json、yarn.lock、pnpm-lock.yaml),確認是否有任何受影響的套件版本,包括間接依賴 。
切勿僅從執行過受影響版本 npm install 的機器上刪除惡意檔案 。應假設該主機上的所有機密資料都已經洩漏。
撤銷並重新產生所有可能曝露的憑證 :
一個關鍵細節:此惡意軟體有時會設置 GitHub workflow 監控器,這些監控器可以在新 token 被建立的那一刻就將其再次暴露 。研究人員建議,在輪換憑證之前,先停用或移除任何監控服務 。
清除開發者機器和 CI/CD runner 上的 npm/pnpm/yarn 快取以及 Docker 建置快取 。從頭開始重建所有產出物,以防止受污染的依賴項殘留在建置快取或 Docker layer 中 。
搜尋是否有新建立的儲存庫或未經授權的 workflow 。檢查是否有蠕蟲可能留下的持續性後門,例如 .claude/settings.json 或 .vscode/tasks.json 等檔案 。
2026 年 8 月 4 日的 Shai-Hulud 蠕蟲攻擊,是 JavaScript 生態系安全的一個分水嶺。它證明了,單一個維護者帳號被入侵——即使攻擊者沒有直接存取大多數受影響套件的權限——也能引發連鎖反應,在數小時內產生一隻毒害超過一千個套件的蠕蟲。此攻擊利用合法的 Bun 執行環境二進位檔來執行酬載、透過偷來的 token 自我複製,並使用備援的外洩管道,其精細程度遠超過先前的供應鏈攻擊 。
對工程與安全團隊而言,這起事件凸顯了鎖定依賴版本、盡可能停用 pre/post-install 腳本、監控異常的 GitHub 活動,以及為供應鏈入侵事件建立應變手冊的重要性。