現在 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-sdaf-155d4584b133" ] }, "MasterMCP": { "command": "/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),感興趣的讀者可點擊文末的閱讀原文直接跳轉。
内容來源:PANews