返回趨勢情報
趨勢情報

TeamPCP 把可信發布與 CI 身份一起武器化後,AI 開發供應鏈已經沒有旁觀席

2026年5月25日
易賺Ai團隊
17 分鐘閱讀
#入門#資安#Mistral#供應鏈攻擊#GitHub Actions
TeamPCP 把可信發布與 CI 身份一起武器化後,AI 開發供應鏈已經沒有旁觀席

如果說過去幾年的供應鏈攻擊,重點還是「你有沒有裝到被下毒的套件」,那 TeamPCP 這一輪真正把問題推到另一個層級的地方,在於它攻擊的已經不是單一套件,而是整條開發信任鏈。從 TanStack 官方事後報告、Mistral 的安全公告、Checkmarx 的持續事件更新,到 SafeDep 與開發者社群整理出的技術拆解,拼起來的圖像非常一致:攻擊者不是只在 registry 裡偷塞惡意版本,而是開始把 GitHub Actions、OIDC trusted publishing、CI runner 記憶體、IDE 設定檔、雲端憑證與開發者本機環境一起納入攻擊設計。這代表 AI(人工智能) 工具與一般開發工具如今共用的那套供應鏈,正在失去大家原本以為理所當然的信任前提。

這條消息之所以值得在當下再拉出來寫一篇重稿,不是因為「又一個安全事件」而已,而是因為到這個時間點,這場攻擊的輪廓已經清楚到足以改變產業判斷。TanStack 已經公開承認,攻擊者是把 pull_request_target、GitHub Actions cache poisoning 與 runner 記憶體中的 OIDC token 萃取串成一條完整鏈路;Mistral 也已用官方公告確認,自己的 npm 與 PyPI SDK 都曾受到波及,雖然基礎設施本身沒有被攻破;Checkmarx 則在持續更新中說明,從 GitHub Actions 到 OpenVSX 擴充套件,再到後續 GitHub 倉庫資料外流,這不是單點事故,而是供應鏈入侵後的連鎖後果。當這三條線同時成立,市場就不能再把 TeamPCP 理解成一次單純的「惡意包上架事件」。它更像是 2026 年到目前為止,最具代表性的 CI/CD 信任模型崩口案例。

先把已經確認的核心事實排開來看。TanStack 官方 postmortem 說得非常直接:攻擊者在短短幾分鐘內,對 42 個 @tanstack/* 套件發出了 84 個惡意版本,並且不是靠偷到 npm token 直接發布,而是藉由 release workflow 中原本合法存在的 id-token: write 權限,從 runner 記憶體裡抽出 OIDC token,再直接對 registry 發送 publish 請求。TanStack 明說,npm token 沒有被偷,publish workflow 本身也不是被傳統意義上的「帳號入侵」打穿。真正被打穿的是大家近兩年很愛談的 trusted publishing 模型,也就是「只要 GitHub Actions 工作流是可信的,短期 token 發布就比較安全」這個假設。

這裡的警訊很大,因為很多團隊已經把 OIDC trusted publishing 視為比長期 token 更現代、更乾淨、更安全的解法。但 TanStack 這次公開揭露的鏈路剛好指出一個殘酷現實:如果攻擊者可以先進到 workflow 執行上下文裡,那這種短命 token 不是防線,反而會變成更自動化、更無感的發行通道。也就是說,風險並沒有消失,只是從「密鑰外洩」轉成「工作流內部被接管」。這對所有把供應鏈治理重心放在秘密管理、token 輪替與 provenance 標章的團隊來說,都不是小修小補就能略過去的問題。

Mistral 的官方安全公告,則補上了這場事件對 大型語言模型(LLM) 與 AI SDK 生態的直接影響。Mistral 明確列出受波及的 npm 與 PyPI 版本,並指出一台受影響的開發者裝置曾牽涉其中,但目前取證顯示 Mistral 基礎設施沒有被攻陷。更值得注意的是官方對兩條攻擊路徑的區分:npm 那幾個版本雖然被污染,但因 setup.mjs 指向不存在的檔案,實際上沒有成功跑起有效載荷;相對地,PyPI 版本 mistralai 2.4.6 則是 import-time 觸發,會在 Linux 環境下載 transformers.pyz/tmp/transformers.pyz 並背景執行。這個差異很關鍵,因為它說明攻擊者已經不是只會做「安裝即觸發」的老路,而是會根據不同語言生態與工具鏈特性,設計不同啟動方式。

換句話說,這場攻擊可怕的不只是規模,而是適配能力。npm 那邊可以走 optionalDependenciesprepare、Bun 執行與 GitHub commit 載入;PyPI 這邊則改走 __init__.py 注入與 import-time 下載第二階段載荷。這代表攻擊者理解的不只是某個單獨生態,而是整個多語言開發鏈如何實際被開發者使用。對做 AI(人工智能) 產品的公司尤其麻煩,因為 AI 團隊本來就常同時接 Node、Python、雲端 workflow、開發者 IDE、測試環境與代理工具,攻擊面本來就比傳統單語言專案更寬。

SafeDep 的分析把這件事說得更白。他們觀察到的不是零星污染,而是一場橫跨 npm 與 PyPI 的協調式攻擊:超過 170 個套件、404 個惡意版本,涉及 TanStack、Mistral、UiPath、OpenSearch、Guardrails AI 等多個高辨識度目標,而且兩個 registry 幾乎是同一波 campaign 在延展。這裡最值得記下來的,不只是數字夠大,而是攻擊模式的改變。SafeDep 指出,攻擊者採用的是整個 scope 一起掃的策略,不再只挑最有名的單一包,而是直接把一整排開發依賴當作分發平面。只要其中某些套件剛好位於熱門框架、企業自動化、搜尋基礎設施、AI SDK 或代理工具鏈上,感染半徑就會自然擴大。

而且這波攻擊和傳統「下載惡意包就中招」還有一個本質差別:它開始主動尋找下一個受害者的發布權限。TanStack 官方說明,惡意程式會枚舉受害者維護的其他套件並嘗試再發布;The Hacker News 與 SafeDep 則都提到,這批樣本會掃 GitHub token、npm token、雲端 metadata、Vault token、Kubernetes service account、SSH key,甚至還會往 .claude/settings.json.vscode/tasks.json 這類位置投放惡意設定與 hook。也就是說,這不是只偷資料而已,而是在找「下一個能替我發毒包的人」。供應鏈攻擊到了這一步,防守思路就必須跟著改,因為你面對的不是靜態惡意程式,而是會把信任鏈自己再長出來的感染機制。

這也是為什麼這場事件對 AI 開發圈格外敏感。SafeDep 的技術拆解顯示,惡意程式會往 .claude.vscode 相關檔案寫入內容,嘗試把 VS Code 與 Claude Code 的專案載入過程變成下一輪執行入口。這裡真正值得怕的,不是某一個品牌名稱被點到,而是今天最流行的 AI 開發方式,本來就越來越依賴「把模型助手與 IDE、repo、CI、測試環境接起來」這種工作流。如果攻擊者已經開始針對這種工作形態下手,那未來的供應鏈風險就不會只是 package manager 的事,而會變成整個 agentic 開發流程的事。當 MCP(模型上下文協議) 相關套件、AI SDK、IDE 設定與 GitHub Actions 都可能出現在同一條感染鏈上,所謂「開發便利性」本身就會變成攻擊者的加速器。

可以先把這場事件的威脅層次整理成一張表:

層次傳統認知裡的供應鏈風險TeamPCP 這輪實際示範的升級
套件層裝到惡意版本、跑了 preinstall惡意版本只是入口,真正目標是進入整個發布與開發鏈
CI 層GitHub Actions 設定錯、秘密外洩攻擊者利用 pull_request_target、cache poisoning、OIDC 記憶體萃取把合法 workflow 變成發毒工具
開發者層本機安裝被植入木馬IDE 設定、Claude Code / VS Code hook、repo commit 都可能變成再感染媒介
生態層單一 registry 或單一語言受影響npm、PyPI、GitHub Actions、OpenVSX、容器鏡像可能在同一 campaign 內彼此支援

這張表的重要性在於,它把一個很多人還當成資安新聞在看的事件,重新拉回產品與工程管理層應該理解的語言。過去大家講供應鏈治理,往往是問「要不要加簽章」「要不要 SBOM」「要不要套件掃描」「要不要把 token 換短一點」。這些都不是錯,但 TeamPCP 提醒了另一件事:如果你的工作流本身可以被借殼,那你再多的簽章與 provenance,也可能只是替惡意發布背書。TanStack 這次之所以震撼,就是因為它不是用假帳號發了一個看起來可疑的包,而是從專案自己的 workflow 表面下手,最後生出帶合法 provenance 的惡意內容。

這對企業採購與治理也有直接後果。Checkmarx 的持續更新就很能說明這點。它後來不得不公開告知客戶,哪些 GitHub Actions、哪些 OpenVSX 外掛、哪些 Docker 映像在特定窗口內可能受污染,並要求客戶改成 pin SHA、停用自動更新、限制 CI runner 的 outbound egress、重新檢查所有在受影響窗口執行過的工作流。這些建議聽起來像資安 best practice,但放在產品現場,它代表的是一個更現實的成本問題:只要團隊平常依賴的是浮動標籤、自動更新與方便快速整合,那在攻擊真的來時,清查成本就會暴增,因為你很難知道哪一台 runner、哪個開發者工作站、哪一條 pipeline 在哪個時間點曾經載入過什麼。

更麻煩的是,這種風險會開始改寫大家對「開發者友善」的看法。過去幾年整個工具市場都在追求 frictionless developer experience,像是一鍵安裝、信任雲端 workflow、預設自動更新、將 IDE 與 AI 助手深度整合、讓 package install 更聰明更自動化。這些設計本來是合理的,因為它們真的能讓團隊跑得更快。但 TeamPCP 讓一個新矛盾浮出來了:當每一層 friction 都被消掉時,攻擊者跨層移動的摩擦也一起被消掉。換句話說,未來工具若只比順不順手、不比可隔離性與可審計性,企業最後買到的可能不是效率,而是一條更平滑的感染高速公路。

從新聞判斷角度來看,這也是為什麼我認為這條題材在當下仍然是重大文章,而不是過氣資安回顧。因為到這個時間點,事件已經不只是「某一天爆出某個包被污染」,而是幾個結論都開始被官方和第三方一起坐實:

  1. TanStack 官方已把攻擊鏈條拆明,證明 trusted publishing 與 OIDC 並不是只要上了就能高枕無憂。
  2. Mistral 官方已確認 AI SDK 確實被捲入,而且 npm 與 PyPI 版本的風險特性不同。
  3. Checkmarx 的長篇更新顯示,這類入侵不是發完惡意 artifact 就結束,而可能延伸成長期存取、後續污染與資料外流風險。
  4. SafeDep 與 The Hacker News 等第三方分析指出,受影響對象已經遠超單一專案,波及多個企業與開發框架。
  5. 社群技術整理則把更大的圖畫畫出來:這不是孤立事件,而是 2026 年 CI/CD 與開源發布鏈最具代表性的連鎖入侵樣本之一。

如果把它再往 AI 產業推一層,這件事還有一個常被忽略的商業訊號。今天 AI 公司最常講的是模型能力、API 單價、推理吞吐、代理工作流、企業導入與部署速度,但這些產品價值最後都要穿過同一條軟體供應鏈才能落地。只要這條鏈的可信度下降,企業對 AI 導入的疑慮就不再只是「模型會不會胡說八道」,而會多一條更硬的問題:把 AI SDK、代理外掛、CI 整合與 IDE 助手接進來,會不會反而把整個工程環境暴露在更脆弱的信任鏈之上?當這種疑問開始進入大型企業採購會議時,AI 公司的競爭就不只是誰做出更好的模型,而是誰能證明自己的分發、整合與開發者路徑足夠可控。

這也意味著,未來真正成熟的供應鏈治理不會只是一張「我們有 SBOM」的投影片,而會更像幾個硬指標的組合:你是不是還依賴浮動 action ref;你是否允許 pull_request_target 去跑可能碰到不可信內容的 build;你的 cache scope 有沒有跨越 trust boundary;你的 publish 能力是否只要任何 workflow 內部程式碼拿到執行權就能被濫用;你的 IDE 與 AI agent 設定是否能在 repo 中被靜默傳播;你的 incident response 是否能在一小時內知道哪些 runner、哪些工作站和哪些 artifact 需要全面清查。這些問題以前多半被放在平台工程或安全工程師腦中,但 TeamPCP 之後,它們會越來越像每一家軟體與 AI 公司都得自己回答的董事會級問題。

簡單說,TeamPCP 這次把市場逼著承認一件事:供應鏈安全不再只是「別裝惡意包」這麼簡單,而是「你是否仍相信自己的自動化流程知道自己在替誰工作」。只要這條問題還沒有被正面回答,那麼不論你賣的是前沿模型、企業代理、開發者 SDK 還是安全工具,最終都還是在一條已被證明能被武器化的信任鏈上營運。

接下來最值得觀察的,不會只是又有多少惡意版本被下架,而是整個產業會不會真的從這件事學到三件事:第一,把 trusted publishing 從「預設更安全」改成「必須證明每一個能 mint token 的執行路徑都安全」;第二,把 IDE 與 AI agent 的 repo 內設定視為可被濫用的執行面,而不是純粹的便利工具;第三,把開發速度與供應鏈隔離一起設計,而不是等出事後才補條件。若這三件事沒有發生,那 TeamPCP 就不會只是 2026 年最嚴重的幾場供應鏈攻擊之一,而會成為下一輪更大規模事故的預告片。