跳至主要內容
>_ITDITD網站資安平台

資安指南

npm 供應鏈蠕蟲:安裝時如何竊取認證資訊,以及該怎麼防

2026 年 8 月,ChainDrop 在不到四小時內污染了 444 個 npm 套件,而且這些版本帶著有效的來源證明(provenance)發布。它在安裝時收集認證資訊,再用偷來的 GitHub 權杖把你的私有儲存庫複製成公開儲存庫。本文說明真正能擋住它的做法。

發布於 2026-08-22 更新於 2026-10-04 最後核實 2026-08-22 閱讀時間 3 分鐘

適合誰讀:使用 npm 或 pnpm 開發、把程式碼放在 GitHub、或從 CI 部署的人。本文根據廠商和研究機構公開的研究撰寫,不含攻擊步驟或樣本。

發生了什麼(ChainDrop,2026 年 8 月)

  1. 2026 年 8 月 4 日

    維護多個廣泛使用的快取套件的維護者 GitHub 帳號遭入侵。攻擊者觸發這些專案既有的 GitHub Actions 發布工作流程,把被污染的版本發布到 npm。
  2. 四小時內

    444 個套件、2,212 個版本遭污染,其中包括每週合計下載量超過 5 億次的套件。
  3. 安裝時

    安裝時的掛鉤收集了 npm、GitHub、雲端(AWS/GCP/Azure)、SSH 金鑰、Kubernetes 和 CI/CD 的認證資訊。根據公開分析,還包括從 CI runner 記憶體中擷取的短效 OIDC 權杖。
  4. 之後

    攻擊者用偷來的認證資訊,重新發布受害者有權發布的所有套件(自我擴散),並把收集到的機密資訊外傳到攻擊者建立的公開 GitHub 儲存庫。
444
遭污染的套件
2,212
遭污染的版本
5 億+
受影響套件的每週合計下載量
4 小時
所花的時間

這一類攻擊的主要損害:私有儲存庫被公開

Shai-Hulud 系列蠕蟲會用偷來的 GitHub 權杖,把受害者的私有儲存庫複製成公開儲存庫,已有報告指出名稱以 -migration 結尾。GitHub 並沒有被攻破。從你的筆電或 CI runner 偷走的權杖,是以你自己的權限,把這件事當作正常操作來執行。所以「等平台修正」在這裡不是防禦手段。

為什麼沒有被擋下

加入相依套件/在 CI 中安裝

↓ preinstall / postinstall 自動執行

在你的電腦或 runner 上執行任意程式碼

↓ 收集 npm / GitHub / 雲端 / SSH / CI 機密資訊

用偷來的權杖執行正常操作

私有儲存庫被複製成公開/重新發布套件以擴散

安裝掛鉤、收集認證資訊、再呼叫正常的 API。每個階段在技術上都是被允許的行為。

沒有幫上忙的

  • 簽章與來源證明:以維護者權限合法簽發,所以驗證會通過
  • 「這是很熱門的大套件」:被污染的正是這種套件
  • 只靠固定版本:全新安裝或下次升版時仍會拉到
  • 等平台修正:被利用的是有效的權杖和公開的 API

有幫助的

  • 預設停用安裝腳本:程式碼根本不會執行
  • 採用新版本前設冷卻期:避開從發布到下架之間的期間
  • 短效、範圍最小的權杖:限制被偷走的權杖能做什麼、能用多久
  • 限制 CI runner 的對外連線:封住外傳的路徑

今天就做的五件事

1

搜尋自己的 lockfile

檢查是否含有已通報遭污染的版本(例如 keyv@6.0.0、flat-cache@6.1.24、file-entry-cache@11.1.6)。沒有找到是好消息,但第 2 步之後是為下一次類似攻擊做準備,請繼續做下去。

2

預設關閉安裝腳本

讓 CI 使用 npm ci --ignore-scripts;pnpm 則在 .npmrc 設定 ignore-scripts=true,只明確允許真的需要建置的相依套件。這是效益最高的單一改動,因為它拿掉了這種攻擊所依賴的執行階段。

3

新版本發布後等幾天再採用

不要在版本一發布就採用,3 到 7 天的冷卻期就夠了。像這次一樣,從發布到下架只有幾小時到幾天時,光是等待就能避開。如果使用自動更新 PR,請把這段延遲寫進設定。

2026-09-05 補充:這已經不必靠紀律來維持。Node.js 官方安全指南在供應鏈攻擊的緩解措施中,列出了用 --min-release-age(npm v11.10.0 以上)設定相依套件冷卻期,避免安裝剛發布的套件。**能用設定解決的,就不要靠紀律。**依賴有人記得的程序,在忙碌的日子很容易被跳過。

4

盤點權杖,縮短期限並縮小範圍

把 GitHub 個人存取權杖從 classic 換成 fine-grained,縮短期限,並只限於需要的儲存庫。不要把 npm 發布權杖一直放在 CI 裡。金鑰與機密資訊的處理方式,請見 .env 與 API 金鑰的危險之處和 SSH 金鑰的最小權限。目標是讓被偷走的權杖造成的損害很小。

5

檢查自己的 GitHub 帳號

找找看有沒有不是你建立的公開儲存庫(名稱以 -migration 結尾、陌生的說明)、你沒加過的 GitHub Actions 工作流程、被放進 .vscode/tasks.json 或 .claude/ 的可執行設定,以及你不認得的 API 金鑰或 SSH 金鑰。要用機器持續監看相依套件中的已知漏洞,請見 osv-scanner 入門。

懷疑遭感染時,順序要對

研究人員特別強調一點:先移除留在電腦上的常駐元件(監看權杖的腳本等),再撤銷權杖。順序顛倒的話,常駐元件可能會對撤銷做出反應。大致步驟:
1. 中斷網路連線
2. 移除常駐機制與可疑檔案
3. 依 npm → GitHub → 雲端 → SSH → Kubernetes 的順序撤銷並重新簽發
4. 刪除 node_modules 與快取,乾淨地重新安裝
5. 檢查公開儲存庫和套件發布紀錄

沒有日誌時,答案是「不知道」,而不是「沒事」。請當作已遭入侵來處理。

本站的看法:簽章證明的是來源,不是安全

簽章與來源證明多年來一直是供應鏈安全的首要建議,而這次攻擊繞過了它們。這並不意外:簽章告訴你誰發布了它,而不是它的內容是否安全。被入侵帳號簽出的有效簽章,同時是有效的,也是危險的。所以我們不把來源證明當作讓你安全的控制措施,而是當作事後界定影響範圍的鑑識工具。預防取決於另外兩件事:不要在安裝時執行別人的程式碼,也不要把機密資訊放在那段程式碼會執行的地方。

資料來源

接著讀

FAQ

Q為什麼執行 npm install 就可能被偷走認證資訊?
A

因為套件可以帶有在安裝時自動執行的腳本(preinstall/postinstall)。加入相依套件,就等於讓那段程式碼以你的權限執行。ChainDrop 正是利用這一點,收集了 npm、GitHub、雲端、SSH 和 CI/CD 的認證資訊。

Q「私有儲存庫被公開」是什麼意思?
A

這一類蠕蟲會用偷來的 GitHub 權杖,把受害者的私有儲存庫複製成公開儲存庫,已有報告指出名稱以 -migration 結尾。GitHub 本身並沒有被攻破:從你的電腦或 CI 偷走的權杖,是以你自己的權限執行這個操作。所以等平台修正並不能保護你。

Q有簽章、有來源證明的套件不就安全了嗎?
A

這次被繞過的正是這一點。攻擊者用維護者的權限觸發了專案既有的發布工作流程,所以被污染的版本帶著有效的來源證明發布。簽章證明的是誰發布的,不是內容是否安全。被入侵帳號簽出的有效簽章,仍然是有效簽章。

Q今天最有效的一件事是什麼?
A

兩件事:預設停用安裝腳本(npm ci --ignore-scripts,pnpm 則設定 ignore-scripts=true),以及不要在新版本一發布就立刻採用,先等幾天。前者讓程式碼根本不會執行;後者避開最危險的期間,也就是從發布到下架之間的幾小時到幾天。