資訊安全

第一個把 Claude Code 武器化的供應鏈蠕蟲:SAP npm「Mini Shai-Hulud」攻擊全解析

2026.05.02 · 32 次瀏覽
第一個把 Claude Code 武器化的供應鏈蠕蟲:SAP npm「Mini Shai-Hulud」攻擊全解析

4 月 29 日 SAP 四個官方套件被植入惡意程式,靠 .claude/settings.json 與 .vscode/tasks.json 取得持久化。OWASP A03 從這天開始變得真有殺傷力。

2026 年 4 月 29 日,UTC 時間 09:55 到 12:14 之間,SAP 雲端應用程式設計(CAP)生態系裡的四個官方 npm 套件——@cap-js/[email protected]、@cap-js/[email protected]、@cap-js/[email protected][email protected]——被連續發佈了夾帶惡意 preinstall 腳本的版本。StepSecurity、Wiz、Mend、Onapsis 等資安研究團隊把這波攻擊命名為「Mini Shai-Hulud」,這已經是 Shai-Hulud 蠕蟲家族的第三代(第一代在 2025 年 9 月出現)。值得注意的不是 npm 又被攻陷了——這兩年來這幾乎是每週二的新聞——值得注意的是這條蠕蟲攻陷之後做了什麼。


它把一個 .claude/settings.json 提交到所有它能寫入的 repo,濫用 Claude Code 的 SessionStart hook,讓惡意程式在下次有人用 Claude Code 打開該 repo 時自動再次執行。它同時丟下一個 "runOn": "folderOpen" 的 .vscode/tasks.json,把同樣的把戲套用在「根本沒在用 AI 代理人」的 VS Code 使用者身上。兩個檔案都用偽造身份 [email protected] 提交,commit 訊息是「chore: update dependencies」。據資安情資社群所知,這是史上第一個把 AI 程式代理人設定檔「武器化」當作持久化與傳播載體的供應鏈蠕蟲。


一、這條蠕蟲到底做了什麼


preinstall 腳本一執行,惡意載荷會立刻收集本地憑證、GitHub 與 npm token、GitHub Actions 機密、以及 AWS、Azure、GCP、Kubernetes 的雲端金鑰。接著利用偷到的 GitHub token,建立一個公開 repo,命名規則是從《沙丘》宇宙詞表抽兩個字組成,描述設為「A Mini Shai-Hulud has Appeared」,把偷到的機密 push 上去。如果系統語系是 ru,載荷就乾淨地結束——這個「俄語豁免」是西方資安社群已經太熟悉的東歐攻擊者指紋。


二、它跟以前的 npm 蠕蟲哪裡不一樣


以前的 npm 蠕蟲,住在開發者機器上的 node_modules 裡,工程師清掉 node_modules 就斷根。這條蠕蟲住在開發者的 repo 裡,意思是它在 rm -rf node_modules && npm i 之後依然存活。而且它會傳播:每當隊友把被感染的 repo clone 下來、用 Claude Code 或 VS Code 打開,惡意程式就在他的環境裡再次執行、再次收割他的機密、再把 hook 寫進他機器上的其他 repo。爆炸半徑是指數的,而攻擊者需要的「0 day」數量是 0。他們需要的是一個 npm 發佈 token,加上一個業界認知——AI 代理人會自動載入它的 session 設定。


三、這個事件如何精準命中 OWASP 與 CIA


這一個事件直接命中 OWASP 2025 版被升級的四個類別。A03 軟體供應鏈失誤——教科書級別。A01 失效的存取控制——npm 發佈 token 幾乎可以肯定是在更早的釣魚或撞庫階段被偷的。A07 身份識別與驗證失誤——git commit 用了偽造身份。A05 安全設定錯誤——VS Code 的 runOn: folderOpen 與 Claude Code 的 SessionStart 設計上就強大、需要明確政策。對應到 CIA 三角:機密性(Confidentiality)在每一台被蠕蟲感染的開發機器上都被擊穿;完整性(Integrity)也被擊穿,因為攻擊者用偷到的 token 取得了 repo 的寫入權;可用性(Availability)會在 IR 團隊鎖帳號、部署中斷時被波及。


四、這個禮拜 PHP / Node / Python 團隊立刻能做的防禦


這不是「下一季再去讀 OWASP」的等級,這是「本週要做」的等級。第一,在 CI 與開發機上設定 npm config set ignore-scripts true,再維護一份白名單。preinstall 腳本是入口;把入口拿掉。第二,在你的 PHP / Node / Python 管線裡,新增一條 commit 檢查:如果作者不是團隊裡的真人,但 commit 內容包含 .claude/、.vscode/tasks.json、.idea/ 等檔案——直接擋下。這正是這條蠕蟲與後繼者的特徵性指紋。第三,輪換過去 14 天內任何接觸過開發者機器的所有憑證:npm、GitHub PAT、AWS access key、GCP service account key、Azure SPN。第四,強制使用「硬體金鑰簽章」的 commit;那筆偽造的 [email protected] commit 過不了簽章驗證就上不了。第五,CI 鎖死 dependency 安裝:lockfile 凍結、走自家私有鏡像、走已知良好的快取。第六,今天就審查每一個 repo 的 .claude/settings.json 與 .vscode/tasks.json,把它們當作 .env 等級的安全敏感設定來對待。


我的看法


過去十年資安業界一直說「供應鏈會是下一個大攻擊面」。4 月 29 日 SAP CAP 這次事件,是這句話從投影片陳腔濫調變成「禮拜一早上的事故」的時刻。新的層次是——AI 程式代理人,剛剛變成開發者機器上槓桿最高的持久化機制,因為它會自動執行開發者根本沒看一眼的設定檔。請把 .claude/、.vscode/、.cursor/ 等目錄當作 .env 來保護。簽你的 commit。preinstall 腳本預設關閉。從這次攻擊裡學到東西的團隊會沒事,把這次事件當作「SAP 自己的問題」打發掉的團隊,會是下一篇報導的主角。


資料來源