Open Source

TanStack npm 供應鏈攻擊解析:三個漏洞串出 84 個惡意版本

2026 年 5 月 11 日,攻擊者利用 pull_request_target、Actions cache 中毒與 OIDC 記憶體竊取,從 TanStack 的合法發佈管線推送 84 個惡意版本,竊取雲端憑證與 SSH 金鑰。本文拆解攻擊鏈與修補對策。

TanStack npm 供應鏈攻擊解析:三個漏洞串出 84 個惡意版本 — 文章封面
本頁內容6 個段落
  1. 事件範圍:42 套件、84 版本,只限 Router 與 Start
  2. 攻擊鏈:三個弱點缺一不可
  3. 惡意載荷:偷憑證、走 Session 外傳、還會繁殖
  4. 偵測與止血:外部研究員搶下的 26 分鐘
  5. 維護者該改掉的五件事
  6. 參考來源

2026 年 5 月 11 日 19:20 至 19:26(UTC),npm 出現 42 個 TanStack 套件、84 個版本的惡意更新。沒有 token 被偷:套件由 Router/Start 的 Release workflow 走 trusted publishing 發佈,registry 看來完全正常。postmortem 顯示:三個常見弱點串起來,就能接管大型開源專案的發佈管線——當 OIDC 憑證能從 runner 記憶體被掏出來,「誰能觸發 workflow」就等於「誰能發佈套件」。

事件範圍:42 套件、84 版本,只限 Router 與 Start

受害範圍集中在 Router/Start monorepo:@tanstack/history 1.161.9 與 1.161.12 在內的 42 個套件、每個兩版;query、table 等其余 repo 乾淨。惡意碼以偽造的 optional dependency「@tanstack/setup」在 install 時執行 2.3 MB 的混淆腳本 router_init.js。

攻擊鏈:三個弱點缺一不可

第一步是「pwn request」:bundle-size.yml 以 pull_request_target checkout fork 的 PR merge ref 再跑 build,等於在有 repo 權限的環境跑攻擊者程式碼,並繞過首貢審核。攻擊準備前一天就透過一個惡意 fork 展開,payload 約 3 萬行。

第二步是 cache 中毒:payload 寫入 pnpm store,對齊 release.yml 之後算出的 cache key;PR 與 push 共用 cache 又無 permissions 把關,11:29 一筆 1.1 GB 毒 cache 落地。攻擊者隨即把 PR revert 成 no-op 並刪分支——PR 乾淨了,毒還在。

第三步是 OIDC token 竊取:19:15 Release workflow 重跑還原毒 cache,惡意 binary 掃 /proc 找到 Actions Runner.Worker 行程,倒出記憶體裡的 OIDC token(trusted publishing 持有 id-token: write),直接 POST 到 npm registry。

惡意載荷:偷憑證、走 Session 外傳、還會繁殖

router_init.js 蒐集 AWS、GCP、K8s、Vault、GitHub token 與 SSH 私鑰,經 Session messenger 加密外傳——沒有 C2 可攔;並重發受害者維護的其他套件,自我繁殖。

偵測與止血:外部研究員搶下的 26 分鐘

最快警報來自外部:StepSecurity 的 ashishkurmi 在 19:46:46 開出 issue #7383,距首批版本上架約 26 分鐘;維護者 21:03 全數 deprecate、發佈 GHSA-g7cv-rxg3-hmpx(CVE-2026-45321,CVSS 9.6),npm 當晚移除 tarball,事件在 Hacker News 拿下 1,097 點。當天裝過受害版本的主機應視為淪陷,AWS、GCP、Vault、GitHub、npm 與 SSH 憑證全部輪替。

維護者該改掉的五件事

postmortem 的自省更值得讀:內部對「發佈」沒有告警,偵測全靠外部;所有 pull_request_target workflow 要審計並加 repository_owner 守衛;action 一律釘 commit SHA;cache 儲存要以 permissions 把關;最根本的是重新思考 trusted publishing——改短期 token 加人工審查或 provenance 驗證。

參考來源

本文由 AI 協助自上述來源整理,經人工審核後發布。

這篇內容對你有幫助嗎?

支持本站繼續整理實用的 AI 文章、教學與開發筆記。

請我喝杯咖啡
分享X電郵