// 威脅簡報
SAP @cap-js 與 mbt npm 套件遭植入惡意版本(Mini Shai-Hulud):安裝後可能竊取登入金鑰並自我擴散
- CVSS
- 9.3 CRITICAL
- CISA KEV
- 未列入
- 弱點類型
- CWE-506
AI 審稿 2026-09-30(未經人工)指令測試:未提供漏洞重現:未進行驗證紀錄 ↓
2026-04-29,SAP 的四個開發套件出現被植入惡意程式的版本;若安裝時允許安裝腳本執行,電腦或自動建置環境裡的登入金鑰就可能被偷,並被拿去散播。
| 誰會中 | 在 2026-04-29 之後安裝到 @cap-js/sqlite 2.2.2、@cap-js/postgres 2.2.2、@cap-js/db-service 2.10.1 或 mbt 1.2.48 的開發者電腦與 CI 環境,包含經由其他套件間接裝到的情況。 |
|---|---|
| 後果 | 安裝時自動執行的腳本會蒐集登入憑證,官方公告說它還「嘗試自我擴散」。依研究者分析,它鎖定 npm 與 GitHub token、SSH 金鑰、雲端憑證、Kubernetes 設定與 CI 秘密,會試著用偷到的 npm token 感染你能發布的其他套件,並在拿到對 repo 有寫入權限的 GitHub token 時,提交 VS Code 與 Claude Code 設定檔當作後門;Snyk 發文時只觀察到原本的四個套件受害。 |
| 現在該做什麼 | 升級到 @cap-js/db-service 2.11.0、@cap-js/postgres 2.3.0、@cap-js/sqlite 2.4.0 以上;mbt 改用 1.2.49,避開 1.2.48。曾經裝過惡意版本的話,單純升級不夠:把那台機器視為已遭入侵,從另一台電腦更換它能存取的所有登入金鑰(token)與密碼。 |
| 受影響版本 | @cap-js/sqlite 2.2.2、@cap-js/postgres 2.2.2、@cap-js/db-service 2.10.1(GHSA-pvw4-cvr4-97p8 / CVE-2026-46421);mbt 1.2.48(另列於 MAL-2026-3179) |
| 修好的版本 | @cap-js/db-service 2.11.0 以上、@cap-js/postgres 2.3.0 以上、@cap-js/sqlite 2.4.0 以上(維護者公告與 CVE 描述;GitHub 全域資料庫與 OSV 的結構化資料把 sqlite 寫成 2.3.0,但 npm 上沒有 sqlite 2.3.0);mbt 1.2.49(維護者在 issue #1224 表示未受感染,1.2.48 已由 npm 移除) |
| CVSS 向量 | 顯示完整向量CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N |
| 時間點 |
藍隊應對手冊
確認、修補 / 緩解、應變、強化。版本符合受影響條件不等於已被入侵;檢查沒有結果也不等於安全,每一項都有能證明與不能證明的範圍。標記的步驟對應下方攻擊流程裡可以擋下攻擊的那一步。
- 01檢查專案是否裝過惡意版本
在 lockfile(package-lock.json、npm-shrinkwrap.json、yarn.lock、pnpm-lock.yaml)與 CI 建置紀錄中搜尋 @cap-js/sqlite 2.2.2、@cap-js/postgres 2.2.2、@cap-js/db-service 2.10.1、mbt 1.2.48,包含間接相依。@cap-js/sqlite 2.2.2 宣告依賴 @cap-js/db-service ^2.10.0,可能帶進惡意的 2.10.1。
唯讀查詢npm ls @cap-js/sqlite @cap-js/postgres @cap-js/db-service mbt --all - 02找出套件資料夾裡的惡意檔案
惡意版本在套件資料夾中含有 setup.mjs 與 execution.js;另可留意 npm install 期間是否有從暫存目錄啟動的 Bun 程序。
唯讀查詢find node_modules/@cap-js node_modules/mbt -maxdepth 2 \( -name setup.mjs -o -name execution.js \) 2>/dev/null - 03檢查 GitHub 上的外洩與後門痕跡
尋找帳號或組織下描述為「A Mini Shai-Hulud has Appeared」的新公開 repo;任何分支上新增的 .claude/settings.json、.vscode/tasks.json;作者為 claude 且簽章未驗證的提交;模仿 Dependabot 名稱並新增 format-check.yml 的分支。
唯讀查詢git log --all --format='%h %an <%ae> %s' -- .claude/ .vscode/tasks.json .github/workflows/format-check.yml - 04檢查套件簽章與 provenance
只對 @cap-js 有用:依 SafeDep,三個 @cap-js 惡意版本沒有 npm provenance 證明,正式版本有,所以缺少 provenance 是警訊。mbt 的正式版本(包括 1.2.47、1.2.49)在 npm registry 上本來就沒有 provenance,這個檢查分辨不出 mbt 1.2.48。
唯讀查詢npm audit signatures
- 01升級 @cap-js 套件到修補版本
@cap-js/db-service 2.11.0、@cap-js/postgres 2.3.0、@cap-js/sqlite 2.4.0 以上。官方公告沒有列出替代緩解方式。升級不會清除已經執行過的惡意程式。
唯讀查詢npm ls @cap-js/sqlite @cap-js/postgres @cap-js/db-service --all - 02避開 mbt 1.2.48,改用 1.2.49
維護者在 issue
唯讀查詢npm ls mbt --all
- 01把機器視為已遭入侵,從另一台電腦輪替憑證
官方建議:裝過惡意版本就輪替該機器可存取的所有憑證。先處理 npm token(蠕蟲靠它擴散),再處理 GitHub PAT、雲端憑證、kubeconfig、Docker 設定、SSH 金鑰、密碼管理器與錢包。資料已加密,無法得知實際被偷了什麼,所以範圍要寬。移除套件不一定會移除惡意程式。
- 02清除後門與攻擊者留下的東西
從所有分支移除 IDE 與 AI 代理的後門檔案、刪除被注入的分支與攻擊者建立的 repo、檢查 npm 發布紀錄並下架非你發布的版本;隔離受影響的 CI agent 或工作環境。
唯讀查詢npm view YOUR_PACKAGE time --json
- 01預設停用安裝腳本並鎖定版本
安裝時預設關閉 lifecycle scripts,只對真正需要的套件放行;用 lockfile 鎖定版本,避免自動拉到剛上架的新版。
唯讀查詢npm config get ignore-scripts - 02收緊受信任發布:綁定需核准的部署環境
受信任發布指定確切的 workflow 檔名,並綁定需要核准、只允許受保護分支的 GitHub 部署環境;接著把套件設為「要求雙因素驗證並禁止 token」,可考慮以 2FA 核准的分階段發布。
- 03維護者帳號與提交的基本防護
使用 WebAuthn 雙因素驗證與最小權限 token,並驗證提交簽章,讓偽裝成 AI 助手的提交更容易被發現。
完整修復步驟與說明
- 確認有沒有裝過。 在 lockfile 與 CI 建置紀錄中搜尋上表的惡意版本,包含間接相依;也可以執行
npm ls @cap-js/sqlite @cap-js/postgres @cap-js/db-service mbt --all。檢查 node_modules 中這些套件資料夾裡有沒有setup.mjs、execution.js。 - 升級。 @cap-js/db-service 2.11.0、@cap-js/postgres 2.3.0、@cap-js/sqlite 2.4.0 以上;mbt 改用 1.2.49(維護者表示未受感染),不要使用 1.2.48。官方公告沒有列出替代緩解方式。
- 裝過就當作已遭入侵。 官方建議輪替該機器可存取的所有憑證,並且從另一台電腦操作;移除套件不一定會移除惡意程式。建議順序(Snyk):先 npm token(蠕蟲靠它擴散),再 GitHub PAT、雲端憑證、kubeconfig、Docker 設定、SSH 金鑰、密碼管理器與錢包。被偷的資料已加密,看不出拿走了什麼,範圍寧寬勿窄。
- 清理 GitHub(StepSecurity 建議)。 從所有分支移除
.claude/、.vscode/tasks.json等後門檔案;刪除被注入的分支(包括仿 Dependabot、含format-check.yml的分支)與描述為「A Mini Shai-Hulud has Appeared」的 repo;檢查 npm 發布紀錄,下架不是你發的版本。隔離受影響的 CI agent。 - 長期強化。
- 使用者:預設停用安裝腳本、用 lockfile 鎖版本;一向有 provenance 的套件(例如 @cap-js)新版突然沒有,當作警訊。本來就沒有 provenance 的套件(例如 mbt)無法用這招分辨。
- 發布者:受信任發布綁定確切 workflow 檔名與需要核准的部署環境,只允許受保護分支;之後把套件設為「要求雙因素驗證並禁止 token」,可考慮以 2FA 核准的分階段發布;使用 WebAuthn 2FA、最小權限 token 與提交簽章驗證。
SAP 的說明。 SAP 在 GitHub 公開的修補 PR 中說明:未授權者推送惡意 commit,劫持了發布流程,而當時發布前沒有任何人工核准;修補後,每一次發布到 npm 都必須由人核准(PR #1592)。在 StepSecurity 開立的 issue #1588 中,SAP 成員回覆說不到一小時就發布了乾淨版本,惡意版本已從 npm 刪除。mbt 的維護者則在 issue #1224 說明,1.2.49 未受感染,npm 已確認移除 1.2.48,GitHub release 與 Dockerfile 都沒有受影響。完整的客戶說明在 SAP Note 3747787,需要登入,本頁無法讀取。
攻擊流程
從左到右是攻擊發生的順序。藍色盾牌代表這一步可以被擋下,越早擋下越好。點圖示可看細節。
由上到下是攻擊發生的順序。藍色盾牌代表這一步可以被擋下,越早擋下越好。點圖示可看細節。
- 攻擊者
攻擊者取得發布權限
@cap-js:SAP 只說未授權者推送惡意提交、劫持發布 workflow 並觸發未經授權的 npm 發布(PR #1592);「攻擊者控制了一位 SAP 開發者的 GitHub 帳號」是 StepSecurity 與 SafeDep 的說法。mbt:依 StepSecurity,1.2.48 由 cloudmtabot 帳號以長期 npm token 發布,token 如何外洩尚未確認。
防禦: 維護者帳號使用 WebAuthn 雙因素驗證;淘汰長期 npm token,改用受限制的受信任發布。
- 攻擊者
劫持 @cap-js 的發布流程(發布方式各方說法不一)
SAP 在 PR
防禦: 受信任發布綁定需要人工核准、且只允許受保護分支的 GitHub 部署環境。
- 攻擊者
惡意版本上架 npm
在正常套件內容中加入 setup.mjs 與 execution.js,並修改 package.json。依 SafeDep,三個 @cap-js 惡意版本沒有 npm provenance 證明,前一版正式版本有(npm registry 可見 2.2.1、2.10.0 都有)。mbt 不適用:npm registry 上 mbt 從來沒有任何版本帶 provenance,1.2.47、1.2.49 也沒有。
防禦: 用 lockfile 鎖定版本;對一向有 provenance 的套件(例如 @cap-js),新版突然沒有就視為警訊。這招對 mbt 這種本來就沒有 provenance 的套件沒用。
- 你的系統
受害者執行 npm install,preinstall 腳本自動執行
不需要 import 或執行套件,安裝就會觸發。載入器下載正當的 Bun 執行環境,再用它執行約 11 MB 的混淆程式。
防禦: 預設停用 lifecycle scripts(例如 --ignore-scripts),只對真正需要的套件開放。
- 你的系統
竊取憑證並送出
官方公告說它會蒐集憑證。依研究者分析,範圍包括 npm/GitHub token、SSH 金鑰、雲端憑證、kubeconfig、CI 秘密等;在 GitHub Actions 上直接從 runner 記憶體讀秘密。加密後推到受害者帳號下新建的公開 repo。
防禦: 從另一台電腦輪替該機器可存取的所有憑證,優先處理 npm token。
- 外部
自我擴散並植入 AI 代理後門
官方公告只說它「嘗試自我擴散」。依 StepSecurity 的逆向分析,它會用偷來的 npm token 感染受害者能發布的其他套件,並用對 repo 有寫入權限的 GitHub token 提交 .claude/settings.json 與 .vscode/tasks.json,開啟專案或啟動 AI 程式代理時會再次執行,提交作者偽裝成 claude。Snyk 發文時只觀察到原本的四個套件受害。
防禦: 要求提交簽章驗證;審查所有分支上新增的 .claude/ 與 .vscode/ 檔案。
影響範圍
這不是程式寫錯的漏洞,而是 SAP 官方套件被換成了惡意版本(CWE-506,內嵌惡意程式碼)。同一天有兩起相關但不同的入侵:三個 @cap-js 套件(GHSA-pvw4-cvr4-97p8 / CVE-2026-46421),以及 mbt(另列為 MAL-2026-3179,不在這個 CVE 範圍內)。
| 套件 | 惡意版本 | 乾淨/修補版本 | 追蹤編號 |
|---|---|---|---|
| @cap-js/db-service | 2.10.1 | 2.11.0 以上 | GHSA-pvw4-cvr4-97p8 |
| @cap-js/postgres | 2.2.2 | 2.3.0 以上 | GHSA-pvw4-cvr4-97p8 |
| @cap-js/sqlite | 2.2.2 | 2.4.0 以上(維護者公告、CVE 描述;GitHub 全域資料庫與 OSV 寫 2.3.0,但 npm 上沒有這個版本) | GHSA-pvw4-cvr4-97p8、MAL-2026-3178 |
| mbt | 1.2.48 | 1.2.49(維護者在 issue #1224 表示未受感染;1.2.47 也未受感染) | MAL-2026-3179 |
| 情境 | 是否受影響 |
|---|---|
| 2026-04-29 起執行 npm install,解析到上表任一惡意版本(開發者電腦或 CI) | 受影響,視為已遭入侵 |
| 直接依賴 @cap-js/sqlite 2.2.2,因而間接裝到 @cap-js/db-service 2.10.1 | 受影響(sqlite 2.2.2 宣告依賴 db-service ^2.10.0) |
| 安裝時停用了 lifecycle scripts(例如 —ignore-scripts) | 依機制推論不會觸發,但沒有公告把它列為保證 |
| lockfile 鎖定在較早版本且未更新 | 依 npm 運作方式推論不會裝到新版,公告未明說 |
規模參考:Socket 估計每週下載量約為 db-service 26 萬、sqlite 25 萬、mbt 5.2 萬、postgres 1 萬;SafeDep 估計四個套件每月合計約 120 萬次安裝。
原理
攻擊者怎麼拿到發布權限。
- @cap-js:SAP 在 PR #1592 說明,未授權者推送惡意提交劫持了發布 workflow,並觸發未經授權的 npm 發布,而且 npm 發布前沒有人工核准。SAP 沒有說明這次發布用的是受信任發布(OIDC)還是某個 npm token,研究者的說法不一:
- StepSecurity 與 SafeDep 說攻擊者控制了一位 SAP 開發者的 GitHub 帳號,修改發布 workflow 讓它從非主分支執行,再用 CI 工作的 OIDC 身分透過受信任發布向 npm 換取發布憑證,把憑證編碼後印到建置紀錄,再拿去發布。
- Snyk 依 npm registry 資料指出,四個惡意版本(含三個 @cap-js)都由
cloudmtabot帳號發布;OSV 的 MAL-2026-3178、MAL-2026-3179 也寫由「cloudmtabot@gmail.com」發布。 - SAP 沒有證實或否認哪一種,本頁無法判定。
- mbt:依 StepSecurity,1.2.48 用的是
cloudmtabot帳號的長期 npm token,mbt 從未使用受信任發布。token 如何外洩尚未確認。BleepingComputer 引述資安工程師 Adnan Khan,說 SAP 的 npm 發布流程可能有 npm token 經設定錯誤的 CircleCI 工作外洩,但沒有指明是哪個套件;是否就是 mbt 的 token,目前沒有來源證實。
關鍵的設定缺口。 npm 的受信任發布(trusted publishing)會把發布權綁定到某個組織、某個 repo 和一個確切的 workflow 檔名;GitHub 部署環境(可以要求核准)則是選用。SafeDep 與 StepSecurity 指出,這裡的信任範圍沒有限定受保護分支或需核准的環境,所以攻擊者在自己的分支上執行 workflow,也能換到發布憑證。SAP 實際的設定內容本頁無法確認;如果 Snyk 與 OSV 所說的 cloudmtabot 發布才是實情,這個設定缺口就不是這次的直接原因,但 SAP 確實在事後加上了發布前的人工核准。
有問題的思路(概念示意,不是 SAP 的實際設定):
展開程式碼範例(yaml)
# npm 信任:這個 repo + release.yml 就可以發布
# 沒有綁定部署環境 → 任何分支上的 release.yml 都能換到發布憑證
jobs:
publish:
permissions:
id-token: write修好的思路:
展開程式碼範例(yaml)
# npm 信任:這個 repo + release.yml + 環境 "npm-release"
# 環境規則設在 repo 設定裡(改 workflow 檔改不到):
# 只允許受保護的 main 分支、需要維護者核准
jobs:
publish:
environment: npm-release
permissions:
id-token: write重點是:只在 workflow 檔裡寫「只在 main 執行」並不夠,因為攻擊者本來就能改那個檔案;限制必須放在攻擊者改不到的地方,例如部署環境的保護規則。
惡意程式做了什麼。 官方公告只說它會蒐集憑證並「嘗試自我擴散」;以下細節來自 StepSecurity、SafeDep、Snyk 等研究者的分析。
- 惡意版本在正常套件內容之外多了
setup.mjs與execution.js,並修改了package.json。依 SafeDep,三個 @cap-js 惡意版本沒有 npm provenance 證明,而前一版正式版本有;mbt 的所有版本在 npm registry 上本來就沒有 provenance,所以這一點只適用於 @cap-js。 setup.mjs以 preinstall 腳本執行,裝下去就會跑,不需要 import。它下載正當的 Bun 執行環境,用來執行約 11 MB 的混淆程式(OSV 寫 11.1 MB,StepSecurity 寫 11.6 MB)。- 竊取 npm/GitHub token、SSH 金鑰、AWS/Azure/GCP 憑證與秘密管理服務存取、Kubernetes 設定、CI/CD 秘密,另外還有 AI 工具設定與加密錢包。在 GitHub Actions 上會直接從 runner 程序的記憶體讀取秘密,繞過紀錄遮罩。
- 資料加密後提交到受害者帳號下新建的公開 repo,描述為「A Mini Shai-Hulud has Appeared」。SafeDep 另外描述了一個 HTTPS 指揮伺服器,各家報告的細節不一致。
- 自我擴散:依 StepSecurity 的逆向分析,它會用偷來的 npm token 發布受害者能發布的其他套件的感染版,並用對 repo 有寫入權限的 GitHub token 提交後門檔案(要注入 workflow 還需要有 workflow 權限的 token)。Snyk 發文時表示,只觀察到原本四個套件受害。
AI 程式代理被拿來當後門。 依 StepSecurity 與 SafeDep,蠕蟲拿到有權限的 GitHub token 時會提交 .claude/settings.json(含 SessionStart hook)與 .vscode/tasks.json(開啟資料夾時執行),讓開發者一打開專案或啟動 AI 程式代理,惡意程式就再跑一次。提交作者顯示為「claude」、簽章未驗證,看起來像例行的 AI 助手更新。StepSecurity 認為這是最早用這種方式濫用 AI 代理設定的供應鏈攻擊之一。攻擊者也推送了模仿 Dependabot 名稱的分支,裡面的 workflow 用來匯出 repo 秘密。StepSecurity 報告指出程式有「遇到俄語系統就停止」的機制。
時間軸
| 時間(2026,UTC) | 事件 |
|---|---|
| 04-29 09:55 | mbt 1.2.48 經由 cloudmtabot 發布 |
| 04-29 約 11:23 | cap-js/cds-dbs 的 update/releases 分支出現第一筆惡意提交 |
| 04-29 約 11:25–12:14 | 三個 @cap-js 惡意版本陸續發布,隨後 workflow 被取消、分支被強制還原(各套件的確切順序未確認) |
| 04-29 | StepSecurity、SafeDep、Socket、Snyk、BleepingComputer 發表報告;mbt repo 開出 issue #1224;OSV 發布 MAL-2026-3178、MAL-2026-3179 |
| 04-29 約 13:46 | 經 GitHub Actions 受信任發布推出乾淨版本(sqlite 2.4.0、postgres 2.3.0、db-service 2.11.0) |
| 04-29 16:15 | mbt 1.2.49 發布(維護者表示未受感染) |
| 04-30 | GHSA-2h7r-x9v2-q52f(「Malware in @cap-js/sqlite」)發布;mbt 維護者表示已收到 npm 確認移除 1.2.48 |
| 05-14 | 維護者在 repo 發布 GHSA-pvw4-cvr4-97p8 |
| 05-20 | 該公告進入 GitHub 全域資料庫與 OSV |
| 07-15 | GitHub(CNA)發布 CVE-2026-46421,NVD 同日收錄,狀態為 Deferred |
| — | 未列入 CISA KEV |
延伸閱讀
- 編號更正。 本頁輸入的事件紀錄寫著「沒有 CVE」,但 GitHub 已為 GHSA-pvw4-cvr4-97p8 指派 CVE-2026-46421。它仍然不在 CISA KEV 清單中。這個 CVE 只涵蓋三個 @cap-js 套件,mbt 是另一起、另一種手法的入侵。
- 評分。 唯一的分數是 GitHub(CNA)給的 CVSS 4.0 9.3(嚴重);NVD 沒有自行評分(Deferred),也找不到 CVSS 3.x 分數。CVE 紀錄中 CISA 的 SSVC 欄位寫著 Exploitation「none」,這只是資料欄位,不代表攻擊沒發生:研究者確實觀察到它在外擴散。
- 日期基準。 本頁的揭露日期取 2026-04-29,也就是第一個惡意版本(mbt 1.2.48,09:55 UTC)出現在 npm 的日子;本站對供應鏈入侵事件一律以惡意版本出現日為準。維護者公告(05-14)與 CVE(07-15)都比這晚。
- 來源間的差異。 @cap-js 惡意版本的發布方式:SAP 只說劫持的 workflow 觸發了未經授權的 npm 發布;StepSecurity 與 SafeDep 說是透過受信任發布(OIDC)換到憑證,Snyk 與 OSV 說是由 cloudmtabot 帳號發布。@cap-js/sqlite 的修補版本:維護者公告與 CVE 描述寫 2.4.0 以上,GitHub 全域資料庫與 OSV 的結構化資料寫 2.3.0,但 npm 上從未出現 sqlite 2.3.0。惡意 payload 大小有 11.1 MB 與 11.6 MB 兩種說法。資料外送管道,StepSecurity 說是 GitHub API,SafeDep 描述了 HTTPS 指揮伺服器。
- 系列背景。 Shai-Hulud 第一波(2025 年 9 月)是透過安裝腳本自我複製的 npm 蠕蟲;第二波(2025 年 11 月,Shai-Hulud 2.0)改用 preinstall 與 Bun 載入器,Unit 42 統計超過 25,000 個惡意 repo。StepSecurity 稱本次為第三波。
- 歸因只是研究者評估。 Socket 以中等信心連結到 TeamPCP(依據包括共用的加密方式、俄語系統停止機制、濫用 GitHub 當指揮通道),StepSecurity 則指向東歐或俄羅斯的操作者。官方沒有歸因。
- 檔案雜湊與更多網路指標 請見 StepSecurity 的報告;官方公告沒有公布這些內容,本頁不轉載。
- 相關弱點類型:CWE-506(內嵌惡意程式碼)。
驗證紀錄 AI 依審稿規則逐項核對來源,全部通過;未經人工審稿,也尚未在我們的環境重現
| AI 審稿 | 2026-09-30 · 審稿規則 |
|---|
驗證紀錄只寫環境與結果,不公開重現步驟或可攻擊他人系統的程式。詳見 政策.
來源
- 修補 commit / 版本ci: separate release-please from npm publish job(PR #1592) · cap-js / SAP(GitHub), 2026-05-04 · 查閱 2026-09-28SAP 自己說明根因:未授權的 commit 劫持發布流程,當時發布前沒有人工核准。
- 其他@cap-js/sqlite@2.2.2, @cap-js/db-service@2.10.1, and @cap-js/postgres@2.2.2 npm releases are compromised(issue #1588) · GitHub(cap-js/cds-dbs issue,由 StepSecurity 開立), 2026-04-29 · 查閱 2026-09-28StepSecurity 通報用的 issue,內有 SAP 成員(chgeo、patricebender)的回覆。
- 安全公告Supply chain compromise via malicious package versions (@cap-js/sqlite, @cap-js/postgres, @cap-js/db-service) · cap-js / SAP (GitHub), 2026-05-14 · 查閱 2026-09-23
- 安全公告GHSA-pvw4-cvr4-97p8 / CVE-2026-46421 · GitHub Advisory Database, 2026-05-20 · 查閱 2026-09-28全域資料庫的結構化資料把 @cap-js/sqlite 的修補版本寫成 2.3.0,與維護者公告的 2.4.0 不同。
- 安全公告GHSA-pvw4-cvr4-97p8 · OSV, 2026-05-20 · 查閱 2026-09-23
- 安全公告CVE-2026-46421 record · CVE Program (CNA: GitHub), 2026-07-15 · 查閱 2026-09-23
- CVE / NVD / OSVCVE-2026-46421 · NIST NVD, 2026-07-15 · 查閱 2026-09-23
- 安全公告MAL-2026-3178: @cap-js/sqlite · OSV / OpenSSF Malicious Packages, 2026-04-29 · 查閱 2026-09-23
- 安全公告MAL-2026-3179: Malicious code in mbt (npm) · OSV / OpenSSF Malicious Packages, 2026-04-29 · 查閱 2026-09-23
- 安全公告Malware in @cap-js/sqlite · GitHub Advisory Database, 2026-04-30 · 查閱 2026-09-23
- 其他mbt v1.2.48 is compromised · Issue #1224 · GitHub(SAP/cloud-mta-build-tool issue,由 StepSecurity 開立), 2026-04-29 · 查閱 2026-09-28維護者 kbarnold 在 2026-04-30 的回覆中說明 1.2.47、1.2.49 未受感染,1.2.48 已由 npm 移除。
- 其他mbt package metadata · npm registry · 查閱 2026-09-28
- 其他@cap-js/sqlite package metadata · npm registry · 查閱 2026-09-23
- 研究文章A Mini Shai-Hulud has Appeared · StepSecurity, 2026-04-29 · 查閱 2026-09-23
- 研究文章Mini Shai-Hulud and SAP Compromise · SafeDep, 2026-04-29 · 查閱 2026-09-28
- 研究文章TeamPCP-Linked Supply Chain Attack Hits SAP CAP and Cloud MTA npm Packages · Socket, 2026-04-29 · 查閱 2026-09-23
- 研究文章Bun-Based Stealer Hits SAP @cap-js and mbt npm Packages · Snyk, 2026-04-29 · 查閱 2026-09-23
- 新聞報導Official SAP npm packages compromised to steal credentials · BleepingComputer, 2026-04-29 · 查閱 2026-09-28
- 研究文章"Shai-Hulud" Worm Compromises npm Ecosystem in Supply Chain Attack · Palo Alto Networks Unit 42, 2025-11-26 · 查閱 2026-09-23
- 廠商說明Trusted publishing for npm packages · npm Docs · 查閱 2026-09-23
媒體簡報
一句話
2026 年 4 月 29 日,攻擊者在 npm 上發布了 SAP 官方三個 CAP 資料庫套件(@cap-js)與 MTA 建置工具 mbt 的惡意版本。只要安裝,程式就會竊取開發者與 CI 環境中的憑證;官方公告說它還嘗試自我擴散。研究者稱之為 Mini Shai-Hulud,是 Shai-Hulud npm 蠕蟲的第三波,並指出它會在拿到有權限的 GitHub token 時,在專案中植入 Claude Code 與 VS Code 設定檔,讓惡意程式在開啟專案或啟動 AI 程式代理時再次執行。@cap-js 部分已獲 CVE-2026-46421,並在當天發布乾淨版本。
關鍵數字
- 識別碼
- GHSA-pvw4-cvr4-97p8 / CVE-2026-46421(僅涵蓋三個 @cap-js 套件);mbt 另列 MAL-2026-3179 cveawg.mitre.org
- 嚴重度
- CVSS 4.0 9.3 嚴重(CNA:GitHub);NVD 未評分(Deferred) services.nvd.nist.gov
- 惡意版本
- @cap-js/sqlite 2.2.2、@cap-js/postgres 2.2.2、@cap-js/db-service 2.10.1 github.com
- 發生日期
- 2026-04-29(第一個惡意版本 mbt 1.2.48 於 09:55 UTC 上架;本頁以惡意版本出現日作為揭露日期) stepsecurity.io
- 歸因(研究者評估)
- Socket 以中等信心連結到 TeamPCP socket.dev
已確認
- @cap-js/sqlite 2.2.2、@cap-js/postgres 2.2.2、@cap-js/db-service 2.10.1 為惡意版本;維護者公告的修補版本為 sqlite 2.4.0、postgres 2.3.0、db-service 2.11.0 以上(GitHub 全域資料庫與 OSV 把 sqlite 寫成 2.3.0,npm 上沒有這個版本)。
- mbt 1.2.48 被列為惡意套件(MAL-2026-3179),現已從 npm 下架;維護者表示 1.2.49 未受感染。
- 惡意程式在安裝階段(preinstall)自動執行,官方建議輪替受影響機器可存取的所有憑證。
- 本事件未列入 CISA 已知遭利用漏洞(KEV)清單。
尚未確認 / 說法不一
- mbt 的 cloudmtabot npm token 如何被盜尚不清楚。BleepingComputer 引述資安工程師 Adnan Khan 的說法,指 SAP 的 npm 發布流程可能有 npm token 經設定錯誤的 CircleCI 工作外洩,但沒有指明是哪個套件的 token;是否與 mbt 有關未經證實。
- @cap-js 惡意版本的發布方式:StepSecurity 與 SafeDep 說是劫持的 workflow 透過受信任發布(OIDC)換到 npm 憑證;Snyk 依 npm registry 資料、OSV 的 MAL 紀錄則說是由 cloudmtabot 帳號發布。
- 惡意程式除了原本四個套件,是否真的感染了其他套件,沒有官方資料;Snyk 發文時只觀察到原本四個。
- SAP 的客戶說明(SAP Note 3747787)需要登入,無法讀取;mbt 的 token 如何外洩與後續處置未確認。
- 受害規模沒有官方數字;研究者在 GitHub 搜尋標記 repo,Snyk 在 04-29 15:17 UTC 數到 1,076 個,SafeDep 寫 04-29 當天超過 1,000 個。
可引用的一句話
SAP 的發布流程在推上 npm 之前沒有任何人工核准;未授權者推送的提交一劫持這個流程,惡意版本就直接發布了出去。
圖片
引用時請標示「PlainCVE」並附上本頁連結。 完整引用格式見下方「如何引用本頁」。有事實錯誤請回報.
SAP @cap-js 與 mbt npm 套件遭植入惡意版本(Mini Shai-Hulud):安裝後可能竊取登入金鑰並自我擴散 2026 年 4 月 29 日,攻擊者在 npm 上發布了 SAP 官方三個 CAP 資料庫套件(@cap-js)與 MTA 建置工具 mbt 的惡意版本。只要安裝,程式就會竊取開發者與 CI 環境中的憑證;官方公告說它還嘗試自我擴散。研究者稱之為 Mini Shai-Hulud,是 Shai-Hulud npm 蠕蟲的第三波,並指出它會在拿到有權限的 GitHub token 時,在專案中植入 Claude Code 與 VS Code 設定檔,讓惡意程式在開啟專案或啟動 AI 程式代理時再次執行。@cap-js 部分已獲 CVE-2026-46421,並在當天發布乾淨版本。 關鍵數字: - 識別碼:GHSA-pvw4-cvr4-97p8 / CVE-2026-46421(僅涵蓋三個 @cap-js 套件);mbt 另列 MAL-2026-3179(https://cveawg.mitre.org/api/cve/CVE-2026-46421) - 嚴重度:CVSS 4.0 9.3 嚴重(CNA:GitHub);NVD 未評分(Deferred)(https://services.nvd.nist.gov/rest/json/cves/2.0?cveId=CVE-2026-46421) - 惡意版本:@cap-js/sqlite 2.2.2、@cap-js/postgres 2.2.2、@cap-js/db-service 2.10.1(https://github.com/cap-js/cds-dbs/security/advisories/GHSA-pvw4-cvr4-97p8) - 發生日期:2026-04-29(第一個惡意版本 mbt 1.2.48 於 09:55 UTC 上架;本頁以惡意版本出現日作為揭露日期)(https://www.stepsecurity.io/blog/a-mini-shai-hulud-has-appeared) - 歸因(研究者評估):Socket 以中等信心連結到 TeamPCP(https://socket.dev/blog/sap-cap-npm-packages-supply-chain-attack) 已確認: - @cap-js/sqlite 2.2.2、@cap-js/postgres 2.2.2、@cap-js/db-service 2.10.1 為惡意版本;維護者公告的修補版本為 sqlite 2.4.0、postgres 2.3.0、db-service 2.11.0 以上(GitHub 全域資料庫與 OSV 把 sqlite 寫成 2.3.0,npm 上沒有這個版本)。 - mbt 1.2.48 被列為惡意套件(MAL-2026-3179),現已從 npm 下架;維護者表示 1.2.49 未受感染。 - 惡意程式在安裝階段(preinstall)自動執行,官方建議輪替受影響機器可存取的所有憑證。 - 本事件未列入 CISA 已知遭利用漏洞(KEV)清單。 尚未確認 / 說法不一: - mbt 的 cloudmtabot npm token 如何被盜尚不清楚。BleepingComputer 引述資安工程師 Adnan Khan 的說法,指 SAP 的 npm 發布流程可能有 npm token 經設定錯誤的 CircleCI 工作外洩,但沒有指明是哪個套件的 token;是否與 mbt 有關未經證實。 - @cap-js 惡意版本的發布方式:StepSecurity 與 SafeDep 說是劫持的 workflow 透過受信任發布(OIDC)換到 npm 憑證;Snyk 依 npm registry 資料、OSV 的 MAL 紀錄則說是由 cloudmtabot 帳號發布。 - 惡意程式除了原本四個套件,是否真的感染了其他套件,沒有官方資料;Snyk 發文時只觀察到原本四個。 - SAP 的客戶說明(SAP Note 3747787)需要登入,無法讀取;mbt 的 token 如何外洩與後續處置未確認。 - 受害規模沒有官方數字;研究者在 GitHub 搜尋標記 repo,Snyk 在 04-29 15:17 UTC 數到 1,076 個,SafeDep 寫 04-29 當天超過 1,000 個。 「SAP 的發布流程在推上 npm 之前沒有任何人工核准;未授權者推送的提交一劫持這個流程,惡意版本就直接發布了出去。」— PlainCVE https://plaincve.date/vulns/ghsa-pvw4-cvr4-97p8-sap-cap-js-npm-compromise
如何引用本頁
本文採 CC BY 4.0,轉載請保留署名與連結。
PlainCVE 團隊(2026)。《SAP @cap-js 與 mbt npm 套件遭植入惡意版本(Mini Shai-Hulud):安裝後可能竊取登入金鑰並自我擴散》。PlainCVE。https://plaincve.date/vulns/ghsa-pvw4-cvr4-97p8-sap-cap-js-npm-compromise(查閱日期:YYYY-MM-DD)BibTeX
@misc{ghsapvw4cvr497p8sapcapjsnpmcompromise2026,
title = {SAP @cap-js 與 mbt npm 套件遭植入惡意版本(Mini Shai-Hulud):安裝後可能竊取登入金鑰並自我擴散},
author = {PlainCVE 團隊},
year = {2026},
howpublished = {PlainCVE},
url = {https://plaincve.date/vulns/ghsa-pvw4-cvr4-97p8-sap-cap-js-npm-compromise},
note = {更新於 2026-09-30}
}