假設你的團隊上個月替內部的 AI 助理裝了一個開源套件,用來接資料庫和寄信。今天早上資安同事傳來一則新聞:這個套件有幾個版本被植入惡意程式,裝到的電腦要當成已經被入侵。你打開專案一看,套件確實在,版本號你不確定,也想不起來當初是誰裝的。
大家的第一個反應多半是:「我們有審過程式碼。」可是這類事件裡,被換掉的常常是你沒審過的下一版。要查的是兩件事:誰有權發布新版本,以及你裝到的那一份到底是不是官方發的。
審外掛和技能的內容,看它會執行什麼、會碰哪些檔案,在別人的技能就是別人的程式:裝之前先看那篇講過。這篇往上游看一層,談發布權和套件來源。本文談資安做法,不構成法律意見;出事後要不要通報、責任怎麼分,請問公司法務。
三個事件,三種發布權出問題的方式
第一種,人離開了,權限還在。2026 年 6 月,AI 代理框架 Mastra 在 npm 上有 140 多個套件被發布了帶毒的新版本。Microsoft 說入口是一個維護者帳號被接管,那個帳號有整個 Mastra 套件群的發布權。SafeDep 的調查寫得更細:那是一位真實的前貢獻者,他的發布權從來沒有被收回;npm 也不會因為帳號很久沒動就自動撤掉權限。套件本身的程式一行沒改,每個套件只多了一個依賴 easy-day-js,名字在模仿熱門的日期套件 dayjs,安裝時就會下載並執行竊取加密貨幣的遠端控制程式。攻擊者前一天先發了一個乾淨的 easy-day-js,到大量重新發布 Mastra 套件前幾分鐘,才把它換成惡意版。
SafeDep 另外指出:Mastra 的正式版都是從自動化流程發布,附有來源證明,攻擊者用個人權杖發的版本沒有這份證明。可是專案沒有規定一定要有,所以照樣發得出去。SafeDep 的判斷是,安裝時要求驗證來源證明的話,這一波的每個套件都會被擋下來。
第二種,名字是假的。2025 年 9 月,Postmark 官方發公告:npm 上一個叫 postmark-mcp 的套件冒用他們的名字,跟官方完全無關,Postmark 在這之前也沒有在 npm 發過自己的 MCP 伺服器。攻擊者先發了 15 個版本累積信任,到 1.0.16 版才加上後門,把經過它的信件偷偷密件副本寄到外部伺服器。之前一直用得好好的,說明不了下一版。
第三種,惡意程式叫你電腦上的 AI 幫它找金鑰。2025 年 8 月 26 日,建置工具 Nx 在 npm 上出現幾個惡意版本,安裝後自動執行的腳本會用電腦上已經裝好的 AI 命令列工具(包括 Claude、Gemini、Q),帶著略過權限確認之類的危險參數,叫它們去翻檔案、找權杖和金鑰。Wiz 說這招在數百個案例裡成功,有些時候 AI 廠商的防護有攔下來。事後查出的源頭,是 Nx 專案自己一個自動化流程的設定有漏洞,讓外人能從合併請求(pull request)的標題注入指令。BleepingComputer 引述 Wiz 的事後評估:三個階段合計 2,180 個帳號、7,200 個儲存庫受影響,這個數字不全是 AI 命令列那一段造成的。
我的判斷是,三件事都有人的部分:權限沒人收、名字沒人核、流程設定沒人檢查。AI 在第三件裡是被借去用的工具。
要裝一個套件或外掛
│
▼
發布者是官方嗎?(官方文件有列)
├─ 否/查不到 → 先別裝
▼ 是
這一版的發布者、來源證明跟前幾版一樣嗎?
├─ 不一樣 → 暫停,先查
▼ 一樣
鎖定版本,用不自動執行腳本的方式安裝
│
▼
記下:誰裝的、哪一版、它碰得到哪些金鑰
│
▼
出事公告 → 照清單退版本、換金鑰
裝之前、裝之後檢查表
| 時間點 | 檢查什麼 | 怎麼看 | 沒過的話 |
|---|---|---|---|
| 裝之前 | 發布者是不是官方 | 從官方網站或官方文件點進套件頁,不從搜尋結果挑名字最像的 | 官方文件沒列的,當作冒牌貨 |
| 裝之前 | 名字有沒有拼得很像 | 跟官方名稱逐字比,多一個字母、多一個連字號都算 | 不裝 |
| 裝之前 | 這一版的發布方式跟前幾版一樣嗎 | 看套件頁的發布者與來源證明,跟前幾版比 | 發布者換人或證明消失,先暫停 |
| 裝之前 | 安裝時會不會自動跑腳本 | 請 AI 讀套件設定裡的安裝後腳本,只讀不執行 | 用不執行腳本的方式安裝,或不裝 |
| 裝之後 | 版本有沒有鎖住 | 鎖定版本的檔案有進版本控制,不設定「永遠抓最新」 | 補上鎖定,每次更新由人看過 |
| 裝之後 | 誰裝的、裝在哪幾台 | 一份清單:套件、版本、安裝人、機器 | 出事時只能全部重灌 |
| 裝之後 | 它碰得到哪些金鑰 | 同一份清單加一欄 | 出事時不知道要換哪幾把 |
| 你自己也發布套件時 | 離開的人還有沒有發布權 | 定期看一次維護者名單 | 當天移除 |
| 你自己也發布套件時 | 正式版是不是只從自動化流程發 | 要求來源證明,沒有證明的版本不收 | 一個人的權杖就能發新版 |
作者整理,非官方。
表裡最容易被跳過的是「它碰得到哪些金鑰」那一欄。三個事件的善後建議都繞著這件事:SafeDep 建議 6 月 16 日之後裝過受影響版本的,整台電腦當作已被入侵,退回事件前的版本,換掉它碰得到的雲端金鑰、AI 服務金鑰和加密貨幣錢包;Postmark 建議立刻移除、檢查寄信紀錄,並考慮更換可能透過信件寄出的密碼;Microsoft 建議鎖定已知安全的版本,安裝時加上不執行安裝後腳本的參數。清單上沒有這一欄,出事那天就只能每一把都換。
AI 命令列工具也要算進「它碰得到什麼」。Nx 那次被借用的,就是開了略過權限確認的 AI 工具。平常用來工作的電腦,別讓它長期處在略過確認的狀態,這部分在按到煩了就勾「一律允許」,你簽了什麼?那篇有分級。
動手做
裝任何新套件或外掛之前,把它的套件頁網址和設定檔交給 AI,只讀不裝:
我準備安裝下面這個套件(或 MCP 伺服器、外掛)。請只閱讀,不要安裝、不要執行任何檔案。 請用白話回報: 1. 發布者:套件頁上的發布者是誰?跟官方網站或官方文件列的名稱一字不差嗎?官方文件有沒有提到這個套件? 2. 名字:有沒有跟某個知名套件只差一兩個字元? 3. 版本歷史:最近一版的發布者、有沒有來源證明,跟前幾版比有沒有改變?最近有沒有突然新增的依賴? 4. 安裝時會自動執行的東西:設定檔裡有沒有安裝前、安裝後腳本,它們做什麼? 5. 它需要哪些金鑰或權杖才能運作? 看不懂或可疑的地方,列出檔名和那一段原文。 套件網址與設定檔:(貼上)
團隊自己有發布套件或技能的話,今天就可以打開維護者名單,看看上面有沒有已經離開的人。
站內延伸
- 外掛裡的 hook、伺服器怎麼逐項審 → 別人的技能就是別人的程式:裝之前先看
- 金鑰怎麼擋在提交之前 → 便條擋不住:用 hook 把金鑰攔在提交之前
- 代理能碰的範圍怎麼收窄 → 找方法AI Agent 權限最小化
來源: Microsoft Threat Intelligence:Inside the Mastra npm supply chain compromise(2026-06-17,06-19 更新;140+ 套件、維護者帳號被接管且有整個套件群的發布權、easy-day-js 仿冒 dayjs、建議鎖定已知安全版本與不執行安裝後腳本);SafeDep:Mastra npm scope takeover(2026-06-17;前貢獻者發布權從未收回、npm 不因閒置撤權、前一天先發乾淨版本、正式版附來源證明但未強制、要求驗證即可擋下、善後建議;歸因未確認);SecurityWeek(2026-06-22;套件數與時間窗各家寫法不同,本文只取「140 多個」);Postmark 官方公告(2025-09-25;冒名、此前未在 npm 發布、15 個版本後於 1.0.16 加後門密件副本、移除與檢查紀錄建議、考慮更換密碼);Wiz:s1ngularity(2025-08-27,08-29 更新;2025-08-26 惡意 Nx 版本、利用 AI 命令列工具與危險參數、數百個案例成功且防護有時攔下、源頭為自動化流程設定漏洞);BleepingComputer(2025-09-06;引 Wiz 事後評估三階段合計帳號與儲存庫數)。檢查表與流程圖為作者整理。