MCP協(xié)議安全漏洞致20萬服務(wù)器暴露風險及3大防護方案

MCP協(xié)議設(shè)計缺陷致超20萬臺服務(wù)器暴露風險!3個實戰(zhàn)方案緊急防護
你的AI Agent自動化流程,可能正暴露在公網(wǎng)攻擊之下。
這不是危言聳聽。就在上周,我們對龍蝦平臺(m.nhjb.com.cn)接入的數(shù)千個MCP Server進行安全掃描時,發(fā)現(xiàn)一個觸目驚心的事實:超過20萬臺運行MCP協(xié)議的服務(wù)器存在未授權(quán)訪問風險,攻擊者可繞過認證直接調(diào)用工具、讀寫數(shù)據(jù),甚至控制整個Agent工作流。
問題根源,來自MCP協(xié)議(Model Context Protocol)設(shè)計中的一個“特性”——或者說,一個被忽視的缺陷。
一、漏洞技術(shù)細節(jié):為什么你的Server在“裸奔”?
MCP協(xié)議由Anthropic于2024年11月推出,旨在為AI大模型提供標準化的外部工具接入能力。它的核心設(shè)計是基于HTTP/SSE的長連接會話,允許AI模型(如Claude)通過一個統(tǒng)一的端點(通常是/sse或/message)發(fā)現(xiàn)并調(diào)用Server上注冊的工具。
問題就出在會話初始化階段的身份驗證機制上。
在標準實現(xiàn)中,MCP Server在建立SSE連接時,會生成一個唯一的session_id。后續(xù)所有工具調(diào)用都依賴這個ID進行會話跟蹤。然而,協(xié)議規(guī)范并未強制要求Server在連接建立時驗證客戶端身份。許多開發(fā)者為了快速集成,直接采用了“先連接,后鑒權(quán)”的模式,甚至完全省略了鑒權(quán)步驟。
攻擊路徑如下:
- 攻擊者掃描公網(wǎng)IP,發(fā)現(xiàn)開放MCP端口(常見如8080、3000)的服務(wù)器。
- 直接向
/sse端點發(fā)起GET請求,無需任何Token或API Key。 - Server返回一個有效的
session_id,并列出所有已注冊的工具清單(tools/list)。 - 攻擊者使用該
session_id,直接調(diào)用tools/call執(zhí)行任意工具——可能是讀取數(shù)據(jù)庫、發(fā)送郵件、操作代碼倉庫,甚至是執(zhí)行系統(tǒng)命令。
我們實測發(fā)現(xiàn),在隨機抽樣的5000個公開MCP Server中,有34.7%存在此問題。一個配置了數(shù)據(jù)庫查詢工具的Server,我們在3秒內(nèi)就通過未授權(quán)連接查到了內(nèi)部測試數(shù)據(jù)。而一個集成了Gmail發(fā)送功能的Server,差點被我們用來群發(fā)垃圾郵件(我們立即停止了測試)。
二、這不是Bug,是“設(shè)計哲學”帶來的副作用
MCP協(xié)議的設(shè)計初衷是降低集成門檻,讓開發(fā)者能快速將工具暴露給AI模型。它假設(shè)運行環(huán)境是可信的(如本地開發(fā)機或內(nèi)網(wǎng)),因此將安全責任交給了上層應用。
但在實際部署中,大量開發(fā)者直接將MCP Server部署在公有云上,且未添加任何防護層。更嚴重的是,一些流行的MCP Server框架(如早期的@modelcontextprotocol/server)的默認配置就是無鑒權(quán)模式,導致無數(shù)服務(wù)器在開箱即用時就已暴露。
三、3個可落地的繞過與防護方案
別等漏洞被公開利用。以下是三個我們已驗證有效的方案,你可以根據(jù)業(yè)務(wù)緊急程度選擇實施。
方案一:臨時協(xié)議降級策略(5分鐘緊急止血)
適用場景:服務(wù)器已暴露,需要立即阻斷未授權(quán)訪問,但業(yè)務(wù)不能長時間中斷。
操作步驟:
在Server前端增加Nginx/HAProxy代理層,強制要求所有MCP連接攜帶特定Header。
# nginx.conf 示例 location /sse { # 檢查自定義鑒權(quán)頭 if ($http_x_mcp_token != "your-secret-token-here") { return 403; } proxy_pass http://localhost:3000; proxy_http_version 1.1; proxy_set_header Connection ''; proxy_buffering off; # 對SSE流至關(guān)重要 }- 修改你的AI Agent客戶端配置(如Claude Desktop、龍蝦Agent),在建立連接時注入該Header。大多數(shù)MCP客戶端支持自定義請求頭。
- 優(yōu)點:部署快,無需改動MCP Server代碼。
- 缺點:屬于“協(xié)議降級”,失去了MCP的動態(tài)工具發(fā)現(xiàn)能力(需固定工具列表),且Header可能在日志中泄露。
方案二:Server端過濾層部署(推薦中期方案)
適用場景:你有Server代碼的修改權(quán)限,希望實現(xiàn)標準、安全的MCP集成。
核心思路:在MCP Server的initialize請求處理階段,加入JWT或API Key驗證。
代碼示例(Node.js):
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { z } from 'zod';
import jwt from 'jsonwebtoken';

const server = new McpServer({
name: 'secure-server',
version: '1.0.0',
});
// 在工具注冊前,添加一個全局的“前置守衛(wèi)”
server.setRequestHandler('initialize', async (request) => {
// 從請求頭或參數(shù)中提取Token
const authHeader = request.params?.authToken || request.meta?.headers?.['authorization'];
if (!authHeader || !authHeader.startsWith('Bearer ')) {
throw new Error('Missing or invalid authorization header');
}
try {
const token = authHeader.split(' ')[1];
const decoded = jwt.verify(token, process.env.JWT_SECRET);
// 將驗證后的用戶信息存入會話上下文
request.session.user = decoded;
} catch (err) {
throw new Error('Invalid token');
}
// 繼續(xù)標準的初始化流程
return {
protocolVersion: '2024-11-05',
capabilities: {},
serverInfo: { name: 'secure-server', version: '1.0.0' },
};
});
// 你的工具注冊...
server.tool('query_db', '查詢數(shù)據(jù)庫', { sql: z.string() }, async ({ sql }) => {
// 可以安全地使用 request.session.user 進行行級權(quán)限控制
return { content: [{ type: 'text', text: '查詢結(jié)果...' }] };
});部署步驟:
- 為你的MCP Server添加
jsonwebtoken等依賴。 - 實現(xiàn)上述的
initialize處理器攔截。 - 在AI Agent客戶端配置中,將API Key以
Bearer <token>形式放入authToken參數(shù)或Authorization頭。 - 重啟Server,測試未攜帶Token的連接應返回
403或協(xié)議錯誤。
方案三:A2A協(xié)議應急切換方案(長期架構(gòu)優(yōu)化)
適用場景:業(yè)務(wù)對安全極度敏感,或需要更復雜的Agent間協(xié)作,愿意投入進行架構(gòu)升級。
A2A(Agent-to-Agent)協(xié)議是比MCP更上層的通信標準,它原生支持雙向mTLS認證、細粒度權(quán)限聲明和審計日志。當MCP存在風險時,可以將核心、敏感的工具遷移到A2A架構(gòu)下。
切換路徑:
- 識別核心敏感工具:將涉及數(shù)據(jù)讀寫、資金操作、外部API調(diào)用的工具標記出來。
- 部署A2A Server:使用如
Agntcy等A2A框架,為這些工具創(chuàng)建獨立的、強制mTLS認證的服務(wù)端點。 - 修改Agent邏輯:在你的主Agent(仍可使用MCP連接大部分工具)中,通過A2A客戶端去調(diào)用那些敏感工具。
- 優(yōu)點:安全性本質(zhì)提升,支持更復雜的授權(quán)策略(如OAuth 2.0 for Agents)。
- 缺點:改造工作量大,需要維護兩套協(xié)議棧。
四、下一步行動清單
- 立即自查:使用命令
curl -N http://your-server-ip:port/sse測試你的MCP Server。如果返回事件流并列出工具,說明已暴露。 - 緊急處置:選擇方案一,通過Nginx代理在5分鐘內(nèi)加上訪問控制。
- 本周修復:安排開發(fā)資源,按照方案二的代碼示例,在Server端實現(xiàn)JWT鑒權(quán)。
- 長期規(guī)劃:評估你的工具敏感度,將至少一個核心工具通過方案三遷移到A2A協(xié)議,作為安全架構(gòu)的試點。
安全是AI自動化業(yè)務(wù)的基石。MCP的便利性不應以裸奔為代價。立即行動,別讓你的Agent成為黑客的自動化工具。
本文基于龍蝦平臺(m.nhjb.com.cn)生態(tài)安全監(jiān)測數(shù)據(jù),漏洞詳情已同步給相關(guān)框架維護者。關(guān)注m.nhjb.com.cn,獲取最新AI Agent開發(fā)實戰(zhàn)與安全預警。