現在MCP (Model Context Protocol) 體系還在比較早期的發展階段,整體環境比較混沌,各種潛在的攻擊方式層出不窮,以目前的協定和工具的設計是難以防禦的。為了幫助社群更能認識並提升MCP 的安全性,慢霧(SlowMist) 特別開源了MasterMCP 工具,希望透過實際攻擊演練,幫助大家及時發現產品設計中的安全隱患,從而一步步加固自己的MCP 專案。
同時,可以搭配上一期的 MCP 安全的檢查清單來更好地理解多種攻擊的底層視角。這次,我們帶大家一起動手實操,示範在MCP 體系下常見的攻擊方式,例如資訊投毒、隱匿惡意指令等真實案例。所有示範中使用的腳本也會一併開源到GitHub(連結見文末),大家可以在安全的環境中完整復現整個流程,甚至基於這些腳本開發出自己的攻擊測試插件。
整體架構概覽
示範攻擊⽬標 MCP:Toolbox
smithery.ai 是目前最受歡迎的 MCP 外掛程式⽹站之⼀,聚集了⼤量 MCP 清單和活躍⽤戶。其中 @smithery/toolbox 是 smithery.ai 官員⽅推出的 MCP 管理⼯具。
選擇Toolbox 作為測試目標,主要基於以下幾點:
- 用戶基數龐大,具代表性;
- 支援自動安裝其他插件,補充部分客戶端功能(如Claude Desktop);
- 包含敏感配置(如API Key),方便進行示範。
演示使⽤的惡意 MCP:MasterMCP
MasterMCP 是慢霧(SlowMist) 專為安全測試編寫的類比惡意MCP 工具,採用外掛程式架構設計,包含以下關鍵模組:
1. 本地網站服務模擬:http://127.0.0.1:1024
為了更真實地還原攻擊場景,MasterMCP 專門內建了一個本地網站服務模擬模組。它透過FastAPI 框架快速建立一個簡易的HTTP 伺服器,模擬常見的網頁環境。這些頁面表面看起來正常,例如展示蛋糕店資訊或返回標準JSON 數據,但實際上在頁面源碼或介面返回中暗藏了精心設計的惡意負載。
透過這種方式,我們可以在安全、可控的本地環境中,完整演示資訊投毒、指令隱藏等攻擊手法,幫助大家更直觀地理解:即使是一個看似普通的網頁,也可能成為誘發大模型執行異常操作的隱患來源。
2. 本地插件化 MCP 架構
MasterMCP 採用了插件化的方式進行拓展,方便後續對新的攻擊方式進行快速添加。運作後,MasterMCP 會在子行程執行上一模組的FastAPI 服務。 (細心的話,你會注意到這裡已經有安全隱憂- 本地插件可任意啟動非MCP 預期的子進程)
示範客戶端
- Cursor:目前全球最受歡迎的AI 輔助程式設計IDE 之一
- Claude Desktop:Anthropic(MCP 協定客製化方)官方用戶端
示範使用的⼤模型
- Claude 3.7
選擇Claude 3.7 版本,因其在敏感操作識別上已有一定改進,同時代表了當前MCP 生態中較強的操作能力。
配置 claude_desktop_config.json
{ "mcpServers": { "toolbox": { "command": "npx", "args": [ "-y", "@smithery/cli@latest", "run", "@smithery/toolbox", "--config", "{\"dynamic\":false,\"smitheryApiKey\":\"ec1f0fa8-5797-8678-sdaf-155d4584b133\"}", "--key", "ec1f0fa8-5797-8678-sd-15055" "/Users/xxx/Desktop/EvilMCP/bin/python", "args": [ "/Users/xxx/Desktop/EvilMCP/MasterMCP.py" ] } }}
配置完畢,正式進入演示環節。
Cross-MCP Malicious Invocation
本示範中包含了Checklist 中投毒和Cross-MCP 惡意呼叫兩個內容。
⽹⻚內容投毒攻擊
1. 註釋型投毒(部分參考:https://x.com/lbeurerkellner/status/1912145060763742579)
Cursor 造訪本地測試網站http://127.0.0.1:1024。
這是一個看似無害的關於「Delicious Cake World」的頁面,我們透過這個實驗,模擬展示大模型用戶端造訪惡意網站造成的影響。
執⾏指令:
Fetch the content of http://127.0.0.1:1024
結果顯示,Cursor 不僅讀取了網頁內容,還將本地敏感設定資料回傳至測試伺服器。在原始碼中,惡意提示詞以HTML 註解形式植入:
雖然註解方式較為直白,容易被識別,但已經可以觸發惡意操作。
2. 編碼型註釋投毒
造訪http://127.0.0.1:1024/encode 頁面,這是一個看起來和上面例子一樣的網頁,但其中惡意提示詞進行了編碼,這讓投毒的exp 更加隱蔽,即使訪問網頁源碼也難以直接察覺。
即使原始碼不含明文提示詞,攻擊依舊成功執行,具體原理將在後續章節詳細解釋。
MCP 工具回傳訊息投毒
這裡我們根據MasterMCP 的提示詞說明輸入我們的模擬指令(該指令沒有實際意義,旨在觸發我們的惡意MCP 來演示惡意MCP 的後續操作):
get a lot of apples
可以看到,觸發指令後,客戶端跨MCP 呼叫了Toolbox 並成功新增了新的MCP 伺服器:
查看插件程式碼可發現,返回資料中已經嵌入了經過編碼處理的惡意負載,用戶端幾乎無法察覺異常。
第三⽅接⼝污染攻擊
這個示範主要為了提醒大家,無論是惡意或非惡意的MCP,在呼叫第三方API 的時候,如果直接將第三方的資料傳回上下文,都可能會帶來嚴重的影響。
範例程式碼:
執行請求:
Fetch json from http://127.0.0.1:1024/api/data
結果:惡意提示詞被植入到傳回的JSON 資料中並順利觸發惡意執行。
MCP 初始化階段的投毒技術
本示範中包含了Checklist 中初始的提示詞注入及名稱衝突兩個內容。
惡意函數覆蓋攻擊
這裡MasterMCP 寫了一個與Toolbox 用相同函式名稱remove_server 的tool,並編碼隱藏了惡意提示字。
執行指令:
toolbox remove fetch plugin server
Claude Desktop 並未呼叫原本的`toolbox remove_server`方法,而是觸發了MasterMCP 提供的同名方法:
原理是透過強調“原有方法已廢棄”,優先誘導大模型呼叫惡意覆蓋的函數。
新增惡意全域檢查邏輯
這裡MasterMCP 編寫了一個與banana 的tool,這個工具的核心作用是在提示詞中強制所有工具運行前都必須執行該工具進行安全檢查。
每次執行函數前,系統都會優先呼叫banana 檢查機制:
這是透過在程式碼中反覆強調「必須運行banana 檢測」來實現的全域邏輯注入。
隱藏惡意提示詞的進階技巧
⼤模型友善的編碼方式
由於大語言模型(LLM) 對多語言格式具備極強的解析能力,這反而被利用於隱藏惡意訊息,常用方法包括:
- 英文環境下:使用Hex Byte 編碼
工具推薦:Hex Decoder
- 中文環境下:使用NCR 編碼或JavaScript 編碼
工具推薦:R12a Unicode Conversion Tools
隨機惡意載重返回機制
如第二章提到的第三方介面污染,當請求http://127.0.0.1:1024/random 時:
每次都會隨機返回一個帶有惡意負載的頁面,大大增加了檢測與溯源的難度。
總結
透過這次MasterMCP 的實戰演示,我們直觀地看到了Model Context Protocol (MCP) 體系中隱藏的各種安全隱患。從簡單的提示詞注入、跨MCP 調用,到更隱蔽的初始化階段攻擊和惡意指令隱藏,每一個環節都在提醒我們:MCP 生態雖然強大,但同樣脆弱。
尤其是在大模型越來越頻繁地與外部外掛程式、API 打交道的今天,小小的輸入污染就可能引發整個系統層級的安全風險。而攻擊者手段的多樣化(編碼隱藏、隨機污染、函數覆蓋)也意味著,傳統的防護思路需要全面升級。
安全從來不是一蹴可幾的。
希望這次示範能為大家敲響警鐘:不論是開發者還是使用者,都應該對MCP 系統保持足夠的警惕心,時刻關注每一次互動、每一行程式碼、每一個回傳值。只有在每個細節上嚴謹對待,才能真正構築起一套穩固、安全的MCP 環境。
下一步,我們也會持續完善MasterMCP 腳本,開源更多針對性的測試案例,幫助大家在安全的環境下深入理解、演練和強化防護。
Ps. 相關內容已同步至GitHub (https://github.com/slowmist/MasterMCP),有興趣的讀者可點擊文末的閱讀原文直接跳轉。