昨天 UTC 09:55,一個自稱 TeamPCP 的攻擊者,在 npm 上發布了四個被廣泛使用的 SAP 生態系套件的惡意版本──mbt、@cap-js/db-service、@cap-js/sqlite、@cap-js/postgres。這場活動被命名為「Mini Shai-Hulud」,致敬去年 11 月那個更大規模的 Shai-Hulud 蠕蟲,到 UTC 12:14 結束發布。等多數歐洲開發者下班回家時,惡意版本已經被拉進數千個 CI runner 與開發者筆電。
套件本身很短:package.json 裡一個 preinstall hook 呼叫 setup.mjs,下載並解壓 Bun JavaScript runtime,接著執行 execution.js──一個被編譯成單一 Bun 二進位的憑證竊取程式。讓這次攻擊真正最具「2026 風格」的是:execution.js 偷完之後做的事。
一、每個開發者午餐前該做的三件事
第一,盤點你有沒有中。在每一個專案執行 npm ls mbt @cap-js/db-service @cap-js/sqlite @cap-js/postgres。如果你的 package-lock.json 裡有任何一個版本來自 4 月 29 日 UTC 09:55–12:14,就把這台主機當作已被攻陷:輪換所有 npm token、GitHub PAT、AWS/Azure/GCP 金鑰、與該機器可讀取的 SSH 金鑰。
第二,檢查有沒有持續潛伏。在這台機器上掃描每個 clone 過的 repo,找出新加上的 .claude/settings.json、含 "runOn": "folderOpen" 的 .vscode/tasks.json、以及 .cursor/rules。Mini Shai-Hulud 會把這些檔案 commit 進它能寫入的每個 git repo,濫用 Claude Code 的 SessionStart hook 與 VS Code 的「資料夾打開時執行」任務當作再執行觸發點。下星期一在編輯器裡打開錯的 repo,惡意程式就會再跑一次。
第三,搜尋 GitHub。它的外洩路徑很新:惡意程式會在受害者自己的 GitHub 帳號下,建立一個公開 repo,描述寫著「A Mini Shai-Hulud has Appeared」,把加密過的失竊機密 push 上去。在你的 org 搜尋這串描述,如果存在,就回答了「我們有沒有被打」這個問題。
二、為什麼這是 OWASP 2026 的縮影
時隔四年、本月才釋出的 2026 OWASP Top 10,把 SQL injection 留在 #1、Broken Authentication 留在 #2,但這份新榜單真正的崛起者,是把「Vulnerable and Outdated Components」與「Software and Data Integrity Failures」合併成一個更大的類別──而 Mini Shai-Hulud 就是教科書範例。每一道 OWASP 控制都依序失守:對 transitive dependency 的完整性檢查(沒有)、套件來源憑證(沒有)、超出 major 版本的鎖定(常常缺)、token 權限收斂(多數 npm token 是 full-write)、開發者機器隔離(多數工程師 install 都用日常使用者跑)。CIA 鐵三角同時崩塌:機密被外洩、開發者 repo 完整性被破壞、token 一旦撤銷 CI/CD 可用性也斷掉。
三、新的持續潛伏 playbook
更大的故事是:AI 程式代理人的設定檔現在是新的持續潛伏管道。StepSecurity 的說法是:這是首批把 AI 程式代理人檔案武器化、用來再執行的供應鏈攻擊之一。預期 2026 年這個模式會反覆出現。防禦面的共識正在成形:把 .claude/、.cursor/、.windsurf/、.github/copilot-instructions.md、AGENTS.md 都當作資安資產——PR 上每一處變更都要 review,標準等同 Dockerfile 或 CI pipeline 的變更。CI 上 npm install 時加 --ignore-scripts,並用明確 allow-list 控制哪些套件可以執行 script。npm publish 與 GitHub Actions 改用短效期 OIDC token,永遠不要把長效期的 NPM_TOKEN 放進會碰到任意程式碼的環境。
我的觀點
第一波 Shai-Hulud 蠕蟲教 npm 社群一件事:供應鏈攻擊可以自我傳播。Mini Shai-Hulud 教我們的是另一件略微不同的事:開發者的編輯器現在也是供應鏈的一部分。那些讓 AI 程式代理人更好用的 AGENTS.md 與 .claude/settings.json,現在也是讓供應鏈惡意程式更難清除的同一批檔案。防禦之道不是放棄 AI 程式代理人——那班車已經開走——而是開始把它們的設定當作機密在管:嚴控權限、走 review、做簽章、預設不信任。
資料來源
- SAP-Related npm Packages Compromised in Credential-Stealing Supply Chain Attack — The Hacker News
- Supply Chain Campaign Targets SAP npm Packages — Wiz Blog
- Mini Shai-Hulud Targets SAP npm Packages — Aikido
- Bun-Based Stealer Hits SAP CAP npm Packages — Snyk
- OWASP Top 10 — 2026 Released After Four Years — GBHackers