資訊安全

「Mini Shai-Hulud」攻陷 SAP npm 套件——每一個 PHP 團隊都應該認真讀完這篇

2026.05.01 · 31 次瀏覽
「Mini Shai-Hulud」攻陷 SAP npm 套件——每一個 PHP 團隊都應該認真讀完這篇

為什麼一場 JavaScript 供應鏈蠕蟲事件,是輸入驗證、第三方信任與整個 CIA 鐵三角的警鐘——即使你根本不寫 Node

2026 年 4 月 29 日,UTC 時間 09:55 到 12:14 之間,攻擊者在 npm 上發佈了 SAP Cloud Application Programming Model 中四個套件的惡意版本:mbt@cap-js/db-service@cap-js/sqlite@cap-js/postgres。研究人員把這個行動命名為 "Mini Shai-Hulud"。攻擊手法是把一個 preinstall hook 塞進 package.json,執行 setup.mjs,再透過 Bun runtime 載入一個 11.6 MB 的憑證竊取+自我傳播框架。惡意程式會撈走開發者本機憑證、GitHub 與 npm token、GitHub Actions secret,以及 AWS、Azure、GCP、Kubernetes 的雲端 secret。被竊資料會被加密、上傳到「攻擊者用受害者自己的帳號」新建的公開 GitHub repo,repo 描述全部寫著 "A Mini Shai-Hulud has Appeared.",目前已超過 1,100 個。


這條蠕蟲會繁殖:它會用偷到的 GitHub 與 npm token,自動把惡意 GitHub Actions workflow 注入受害者的其他 repository,並繼續發佈被污染的套件。一個工程師執行一次 npm install,就可能把整個團隊、以及那個團隊維護的所有開源專案,一起拖下水。


一、舊有的防禦徹底失效


這次攻擊乾淨地擊穿了三層大多數團隊預設信任的控制。Lockfile pinning 無效,因為惡意版本是「全新發佈」的版本;CI sandbox 無效,因為 payload 在 preinstall 階段就在開發者筆電上跑了;SCA 掃描器無效,因為昨天那個套件還是乾淨的。這次的入口是維護者本人的 npm publish 憑證——而這正是這支蠕蟲自己會偷的那種憑證,所以這類攻擊一旦開始,就會以指數速度擴散。


二、把這次事件對應到 CIA 鐵三角


機密性(C):開發者憑證、原始碼、雲端 secret 全外洩。完整性(I):惡意 GitHub Actions workflow 被注入正當 repo,已簽章的 build 被竄改。可用性(A):不是直接目標,但事件處理會強制 token rotation、key rotation、pipeline 凍結,這本身就是一次延長停機。三條腿一次中招。


三、本週可以馬上動手的具體防禦


在 CI 阻擋 install script。對所有不需要安裝腳本的 pipeline,使用 npm install --ignore-scriptspnpm install --ignore-scripts固定到 integrity hash,不要只 pin 版本號。npm publish token 改用短效 OIDC,長效 classic token 全部廢掉。新版本依賴隔離 24–72 小時後才允許進入正式 build。開發者本機的依賴安裝盡量丟進可拋棄、限制網路的 sandbox裡跑。


四、是的,PHP 與 Python 團隊也適用


這是 npm 的故事,但結構性的教訓是通用的。Composer(PHP)和 PyPI(Python)過去 18 個月都發生過幾乎結構一致的事件。「套件管理器」就是信任邊界,而這條邊界在大多數筆電上是沒有設防的。不管你寫的是哪一種語言,去稽核你自己的供應鏈控管。


五、輸入驗證仍然不是 optional


這條蠕蟲沒有用任何記憶體破壞漏洞。它利用的是「對第三方程式碼的隱性信任——而這段程式在安裝期就以開發者全部權限執行」。OWASP Top 10:2025 把「軟體供應鏈失敗」升到 A03 就是這個理由——這個類別在所有 CVE 之中,平均利用分數與衝擊分數最高。把「依賴」當成「未經信任的輸入」來驗證,現在已經是基本盤,不是加分題。


我的觀點


很多團隊把「資安」當成像功能一樣的東西在編預算:一季一個專案、一份檢核表、一年一次稽核。Mini Shai-Hulud 是最新一次提醒——供應鏈攻擊是「營運風險」,不是「合規條目」。蠕蟲是用它偷到的憑證在自我繁殖,這表示一個被污染的套件多在你 pipeline 裡待一天,下一次入侵的影響半徑就大一圈。能夠安然度過 2026 的團隊,會把自己的依賴樹當成銀行對待 AML pipeline 那樣經營:持續、自動化、偏執、並且預設對方有惡意。你的 node_modules 不是一份「方便的工具清單」,它是一面由你從來沒見過的人簽名背書的攻擊面。請按照這個前提去設計你的工程流程。


資料來源