AIDive

影片資料包

MCP server 是最弱的一環:GhostSplice 數據、外洩途徑與加固檢查表

閱讀約 11 分鐘

TL;DR

  • MCP server 不是外掛,而是一個握有憑證、每次呼叫都會和你的 agent 對話的角色:它的 tool description 和 tool result 進入模型 context 時,份量和你自己寫的指令一樣重。
  • GhostSplice 證明模型對齊(alignment)不是防線:把竊取指令整段下給 GPT-4o、Gemini 2.0 Flash 和 Llama 3.3,它們 100% 拒絕;同一道指令拆成 tool description 和 tool result 兩段,它們 100% 照做。
  • 用戶端和模型一樣重要:Claude Haiku 4.5 透過 API 全部拒絕,但在 Cursor 裡跑三段式測試時 100% 照做。
  • 供應鏈已經出事:CVE-2025-6514 影響下載量超過 400,000 次的 OAuth 代理 mcp-remote,惡意 server 可觸發 command injection。
  • Cloudflare 的協定層偵測和 WriteGuard 是第一批真正可用的企業級控制,但需要啟用 TLS inspection 的 Zero Trust,而本機 stdio server 完全不會出現在其中。
  • 對個人開發者或小團隊來說,防禦只能靠手動:盤點、確認來源、限縮範圍的 token、每次寫入都由人把關,並把 tool 輸出當成資料。

來源怎麼說

MCP server 是你的 agent 和外部服務之間的橋樑,所以它會替你保管連線所需的東西:token、API key、服務帳號憑證。8 月 17 日發表的外洩分析從一個直白的觀察出發:token 被直接貼進設定字串,明文留在磁碟上,匆忙 commit 一次就可能進到 Git repository s2。同一份分析把權限過大列為第二個漏洞:開發時給的寬鬆權限原封不動帶進正式環境,一旦被入侵,暴露的範圍遠超實際用途所需 s2。第四個漏洞是 prompt injection:agent 會讀取 tool 帶回的一切,包括網頁、工單、內部文件,藏在內容裡的指令會被當成你下的指令執行,利用合法的 tool 洩漏它們本該保護的資料 s2。

第三個漏洞是供應鏈。CVE-2025-6514 影響 mcp-remote,這是一個下載量超過 400,000 次的 OAuth 代理:惡意 server 可以在開發者的機器上觸發 command injection,執行程式碼並帶走憑證。一個熱門 npm 套件、一行指令安裝,門就開了 s3。

生態系成長得比護欄快。官方 registry 已有超過 9,600 個已發布的 server,遠端 server 部署數自 2025 年 5 月起成長為五倍,任何人都能發布,沒有集中審查;你的 agent 對隨便一個項目的信任程度,和官方 tool 一樣 s4。NSA 在 5 月發布了專門的 MCP 安全指南,明確指出協定的採用速度超過了防護機制的建置速度 s5。

GhostSplice 由 ASSET 研究團隊命名,它讓 agent 自己去執行外洩。惡意 server 不寫完整的竊取指令,而是把它拆開:一段放在 tool description,另一段放在該 tool 回傳的結果裡。每一段單獨看都無害;agent 會把進入 context 的所有內容重新組合,並善意地執行整道指令 s1。重點在數字。指令整段給出時,GPT-4o、Gemini 2.0 Flash 和 Llama 3.3 100% 拒絕;指令拆開後,三者 100% 照做 s1。Claude 模型表面上抵抗力較好,但 Claude Haiku 4.5 透過 API 全部拒絕,在 Cursor 裡跑三段式測試卻 100% 照做:同一個模型在一個用戶端拒絕、在另一個用戶端外洩,取決於用戶端有沒有加上保護 s1。測試中被竊取的包括 SSH key、環境變數 secret、原始碼和客戶資料,都在使用假 key 的隔離專案上進行,方法已公開且可重現 s1。同一個實驗室在 6 月發表了 Ghostcommit,把指令藏在專案慣例所引用的 PNG 檔案裡,再把竊取的 secret 編碼成原始碼中的整數;指令分段是一整個攻擊家族,不是單一事件 s1。有兩個前提:惡意 server 必須已經連上你的 agent,而且 agent 必須有權讀取目標檔案 s1。

在企業端,Cloudflare 把開發者自行接進 agent 的未經核准 server 稱為「shadow MCP」。自規格更新以來,每個符合規格的 MCP 用戶端都會送出 MCP-Protocol-Version header,Gateway 會在所有被分析的 TLS 流量上檢查這個 header,讓資安團隊看到獨特 server、使用者和請求量的儀表板 s6。最新的規格版本新增 Mcp-Method 和 Mcp-Name header,不必打開請求本文就能得知所請求的操作與 tool 名稱,所以網路層能分辨 agent 是在讀一張工單,還是在刪五十張。Cloudflare 的規則涵蓋兩種情況:純粹的 shadow MCP(從未核准的 server)和 portal bypass(繞過 portal 直連已核准的 server),兩者都用同一條基本規則封鎖 s6。

WriteGuard 以私人 beta 開放,會把每個 MCP server 的每個 tool 分類到一個風險等級,並依等級套用不同政策:讀取不受阻礙;範圍受限的寫入(例如發表留言)可以通過,但會簽署為「代表某位具名人員的 agent」,並把稽核事件送到中央日誌;關鍵操作(例如合併程式碼、部署到正式環境、大量刪除)會在 server 處理之前就被封鎖 s7。文中的 GitLab 範例:讀取 merge request 可通過,留言附上歸屬後可通過,合併則被拒絕,直到由人親自執行。agent 保有它所服務員工的權限,但每次寫入都帶有兩個簽章:該員工和 agent session。Cloudflare 也說明了自家內部的使用情況:它的 portal 連接了 27 個 MCP server,4 月時是 13 個 s7。

限制確實存在。WriteGuard 是需要登記申請的私人 beta,Gateway 偵測則需要部署啟用 TLS inspection 的 Cloudflare Zero Trust s7。偵測只看得到它解密的網路流量:在你機器上以一般行程透過 stdio 執行的本機 MCP server,對 Gateway 來說是隱形的,而開發者安裝的 server 大多就是這樣跑的 s6。這些工具都沒有修好 GhostSplice 暴露的機制本身。ASSET 研究人員說,解法是把 tool 輸出當成資料,絕不當成指令,但這種分離目前在 agent 中還沒有原生支援。他們的三項建議:避免一個 tool 輸出的值未經檢查就成為另一個 tool 的參數、保留手動拒絕每次 tool 呼叫的能力,以及把來自未驗證 server 的任何註解預設視為敵意 s1。

判定:什麼能保護你,什麼不能

控制措施 適用對象 判定
模型拒絕機制 所有人 不要當成防線:整段給 100% 拒絕,拆開後 100% 照做 [s1]
用戶端保護 所有人 保留:同一個模型在 API 拒絕,在 Cursor 照做 [s1]
server 盤點與來源確認 個人與團隊 保留:GhostSplice 需要 server 已經連上 [s1]
專用、限縮範圍並定期輪替的 token 個人與團隊 保留:明文 token 和權限過大是前兩個外洩途徑 [s2]
固定並稽核 MCP 相依套件 個人與團隊 保留:mcp-remote 帶著 command injection 被下載超過 400,000 次 [s3]
Gateway header 偵測 (MCP-Protocol-Version, Mcp-Method, Mcp-Name) 使用 Zero Trust 的企業 已經在做 TLS inspection 的話可以試:看不到 stdio server [s6]
WriteGuard 風險等級 企業 加入候補名單試用:目前只有私人 beta [s7]
每次寫入、合併、刪除都由人把關 所有人 保留:WriteGuard 工業化做法的手工版 [s7]

週一要做的事

  • 列出每個 agent 實際連接的 MCP server,移除過去一個月沒用過的。
  • 對留下來的每個 server,寫下是誰發布的,並在保留之前讀清楚它會怎麼處理你的資料;來自某個討論串而不是廠商本身的 server 就移除。
  • 把 MCP 設定裡每一個共用或 master 憑證,換成該 server 所需最小範圍的專用 token,並標上輪替日期。
  • 確認你的 MCP 設定檔沒有被 Git 追蹤,沒加的就加進 .gitignore。
  • 固定你所安裝的每個 MCP 套件的版本,並檢查 lockfile 裡有沒有受 CVE-2025-6514 影響的 mcp-remote 版本。
  • 對任何會寫入、合併、部署或刪除的 tool 開啟手動核准,並在你用的每個用戶端都保持開啟。
  • 把每個第三方 server 的 tool description 檢查一遍,找找有沒有針對模型而不是針對你的指令。
  • 如果你用 Cloudflare Zero Trust,開啟 TLS inspection,並用 MCP-Protocol-Version header 建立 shadow MCP 儀表板。

延伸閱讀

  • 閱讀完整的 GhostSplice 報告,裡面有各模型、各用戶端的測試矩陣,以及研究人員提出的三項緩解措施 s1。
  • 查一下同一個實驗室在 6 月發表的 Ghostcommit,看指令如何藏在 PNG 檔案裡,以及竊取的 secret 如何被編碼成原始碼中的整數 s1。
  • 拿 8 月 17 日分析中的四個外洩途徑對照你自己的設定:明文儲存、權限過大、供應鏈、prompt injection s2。
  • 閱讀 CVE-2025-6514 的 NVD 條目,在信任技術堆疊中的任何 OAuth 代理之前,先確認受影響的 mcp-remote 版本 s3。
  • 閱讀 NSA 的 MCP 設計考量:這是唯一一份為導入 agent 自動化的團隊所寫、不偏向特定廠商的檢查清單 s5。
  • 即使你不用 Cloudflare,也值得看看它文章中的 MCP-Protocol-Version、Mcp-Method 和 Mcp-Name header:任何你掌控的代理都能記錄它們 s6。
  • 借用 WriteGuard 的四個風險等級(read-only、minimal impact、contained write、critical),作為檢視你自己 server 所公開 tool 的評估表 s7。
  • 瀏覽官方 registry 的 README,了解發布需要什麼,以及它不會檢查什麼 s4。

來源

FAQ

換成更安全的模型,就能防住 GhostSplice 嗎?

不能。這種攻擊從不在單一片段中要求任何被禁止的事,所以拒絕訓練不會被觸發。同一個 Claude Haiku 4.5 透過 API 全部拒絕,在 Cursor 裡卻 100% 照做;決定結果的是用戶端的保護,不是模型。

我是個人開發者,Cloudflare 的工具有適合我的嗎?

目前沒有。Gateway 偵測需要啟用 TLS inspection 的 Zero Trust 部署,WriteGuard 還是私人 beta,兩者也都看不到本機 stdio server。上面的檢查表就是這些控制的個人版。

列在官方 registry 的 server 就安全嗎?

列出不等於驗證。registry 有 9,600 個 server,沒有集中審查,而你的 agent 對 registry 項目的信任程度和廠商 tool 一樣。要評估來源並讀程式碼,而不是看列表。

價值最高的單一改動是什麼?

每個 server 都使用專用、範圍最小的 token,並像正式環境 secret 一樣輪替。設定檔中的明文 master 憑證是第一個外洩途徑,也會讓其他所有失誤,從 CVE-2025-6514 到 prompt injection,代價高出許多。