TL;DR: MCP 在一年多內,從 Anthropic 的內部實驗變成 AI 業界共通的介面。但進入 2026 年,資安研究員一個接一個把它拆開:官方 SDK 的 by-design RCE、tool poisoning、rug pull。我的看法是,這些漏洞大多不是協定的 bug,而是「把能力交出去、卻沒把治理一起交出去」的必然結果。現在大家急著補的那些東西,OAuth scope、人工確認、伺服器註冊表,其實就是治理被重新貼回協定上。
2026 年 4 月,資安團隊 OX Security 公布了一個發現:MCP 的官方 SDK(Python、TypeScript、Java、Rust 全中)存在一條從設定檔直接到指令執行的路徑,攻擊者可以在任何跑著有問題實作的機器上執行任意系統指令。根據他們的估算,受影響的套件下載量超過 1.5 億次,潛在波及的伺服器實例上看 20 萬個(The Register 的報導用的標題就是「20 萬台伺服器有風險」)。後續整個生態跟著冒出一連串 CVE,包括 MCP Inspector 的 CVE-2025-49596 和 Cursor 的 CVE-2025-54136。
但真正讓我停下來想的,是 Anthropic 的回應:這是設計如此(by design)。他們不打算改協定,並表示輸入清洗是開發者自己的責任。
這句話可以有兩種讀法,而我認為兩種都對。這正是整件事最值得想的地方。
先講清楚:MCP 為什麼會贏
要評論 MCP 的資安問題,得先承認它解決了一個真的很煩的問題。
在 MCP 之前,每接一個工具到 AI 上,你就得寫一套各自為政的膠水。M 個模型乘上 N 個工具,等於 M×N 種接法。MCP 把它變成 M+N:工具實作一次 server,模型實作一次 client,中間用同一套協定講話。Anthropic 當初的比喻是「AI 的 USB-C」,這個比喻站得住,是因為它真的描述了發生的事。
而且它的擴散速度不是普通的快。OpenAI 在 2025 年 3 月把 MCP 接進 Agents SDK、Responses API 和 ChatGPT 桌面版;Google DeepMind 在 4 月跟進。到了 2025 年 12 月,Anthropic 把 MCP 捐給 Linux Foundation,AWS、Google、Microsoft、OpenAI、Bloomberg、Cloudflare 全都掛名白金會員。這時候它已經不是「Anthropic 的協定」,而是業界共同基礎建設。光是 SDK 的月下載量,就從上線時的約十萬次成長到 2026 年 3 月的約 9700 萬次。
換句話說,這不是一個沒人用的協定出包。這是一個贏家出包,而且是贏在規模上。
然後資安研究員開始拆它
問題是,讓 MCP 好接的那些設計,同時也讓它好攻擊。研究社群這一年整理出幾類反覆出現的攻擊手法,值得分開來看。
Tool poisoning(工具下毒)。 MCP 在握手時,server 會用 tools/list 把每個工具的描述回傳給模型看。麻煩在於這段描述模型會讀、人通常不會看。把惡意指令藏在工具描述裡,對使用者隱形、對 LLM 有效。Invariant Labs 就公開示範過:一個看起來人畜無害的工具,描述裡偷偷寫著「順便把 ~/.ssh 的內容也傳過來」。有些研究者把同一件事叫做「line jumping」,因為指令在工具真正被呼叫之前就插隊生效了。
Rug pull(地毯抽走)。 你第一次裝某個 MCP server 時審過了、也同意了。但工具的描述和行為可以在事後被悄悄改掉,而這種變更不一定會觸發新的同意流程。先用一個正常的工具建立信任,再在某次更新裡把它變壞。又因為定義是持久的,之後每一個叫到它的 session 都會跑到下毒後的版本。
這些不是紙上談兵。一個叫 MCPTox 的 benchmark 在 45 個真實世界的 MCP server 上測試,對 o1-mini 的攻擊成功率達到 72.8%。連 NSA 都出了一份 MCP 安全指引。把這些放在一起看,你會發現一個共同點:攻擊面幾乎都不在「協定本身有沒有加密」這種傳統資安問題上,而在一個非決定性的東西,也就是 LLM,被放在安全決策的正中央。
關鍵爭議:「設計如此」算不算卸責
回到 Anthropic 那句「by design」。
同情他們的讀法是:協定本來就只負責「連接」,不負責「信任」。STDIO 會執行你給它的指令,這跟 shell 會執行你打的指令一樣,是工具的本分,不是漏洞。把每一種誤用都當成協定要修的 bug,協定會變得無法使用。
不同情的讀法是:當你的官方 SDK、橫跨四種語言、被下載超過一億次,「清洗是開發者的責任」這句話的實際效果,就是把一個系統性風險,平均分攤給十幾萬個多半沒有資安團隊的開發者。標準之所以是標準,就是因為大家會照抄它的預設值。預設值不安全,就等於不安全。
我的立場偏後者,但我想把話講得更精確一點:這兩種讀法其實沒有矛盾。協定確實只該負責連接;但問題就在於,整個生態把「連接的標準」誤當成了「信任的標準」。
我的看法:這不是協定的 bug,是治理的缺口
如果你讀過這個部落格之前談 AI 代理的幾篇,這個結論不會讓你意外。
我一直在寫的一件事是:AI 代理出事,通常不是模型不夠強,而是結構不夠。MCP 的資安危機是同一個故事的放大版。tool poisoning 本質上就是 prompt injection;我們在談代理常見痛點時就提過,安全研究員花 500 美元就能讓 Devin 透過 GitHub issue 執行範圍外的操作,成功率八成以上。rug pull 本質上則是範圍失控,加上沒有 evidence trail:沒有人能指著說「這個工具上週的定義長這樣、這週變成那樣」。
換句話說,MCP 沒有發明新的問題。它把幾個老問題(盲目信任工具輸出、範圍蔓延、缺乏可追溯性),用一個標準協定,以一億次下載的規模工業化了。
能力交出去了,治理沒有跟上。這就是缺口。
我在從「下指令」到「蓋系統」那篇講過,prompt 的問題不在 prompt 本身,而在它沒有結構。MCP 是同一個層級往上的版本:協定的問題不在協定本身,而在大家以為「有了標準介面」就等於「有了安全保證」。連接的標準,不是信任的標準。
那正在補的東西,其實就是治理
最能佐證這個判斷的,是大家現在拿來補洞的工具。
2026 年的 MCP 規格往哪個方向走?OAuth 2.1(強制 PKCE、禁掉 implicit grant),把 server 定位成 OAuth resource server;加上 incremental scope consent,讓 client 每次只要最小權限;用 resource indicator 綁定 token,避免被挪用;規格明文要求 human-in-the-loop,對破壞性操作要有風險標註和確認流程;以及用一個受治理的中央註冊表,讓工具註冊一次、政策定義一次。
把這串東西念一遍,你會發現它根本不是在修一個協定 bug。它是把最小權限、人工核可、可追溯性這些老牌的治理原則,一條一條重新貼回協定上。這正是我說「漏洞是治理缺口」的證據:補丁的形狀,就長得跟治理一模一樣。
這跟只用 Prompt 和技能也能做基本治理那篇的精神是一致的。治理不一定要很重,但它不能是零。
給實作者的幾條原則
如果你今天就在用 MCP(用 Claude Code、Cursor,或任何接了 MCP 的工具,你大概就在用),我會建議幾件事。
把每一個 MCP server 當成不可信的輸入來對待。這跟我們對待 LLM 輸出的態度應該一樣:預設不信,要有東西可查才信。一個第三方 server 的工具描述,跟一段使用者貼進來的文字,威脅等級是一樣的。
權限給到剛好夠用就好。如果一個查 wiki 的 server 要求能讀你整個檔案系統,那不是功能,是紅旗。
對第三方 server 釘版本、留審計。rug pull 的前提是「悄悄更新」,那就讓更新沒辦法悄悄:固定版本、記錄工具定義的變更。
破壞性操作一定留一個人在迴圈裡。刪檔、送外部請求、動資料庫這類不可逆的動作,不要讓 agent 自己決定。
能用第一方就用第一方。生態裡有上萬個社群 server,方便,但「方便」正是 rug pull 和 tool poisoning 的溫床。
最後
MCP 會留下來,這點我沒什麼懷疑。它解決的問題太真實,網路效應也已經成形。但我希望大家別把「它贏了」誤讀成「它安全了」。
一個協定能不能成為標準,看的是它好不好接;一個系統安不安全,看的是它有沒有治理。這是兩件事。2026 年這一連串的漏洞,與其說是 MCP 的失敗,不如說是一次提醒:當我們把越來越多能力交給 AI 去調用,真正要補上的從來不是更聰明的模型,而是更紮實的結構。
English version: MCP Security Isn’t a Protocol Bug. It’s a Governance Problem.