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

MCP協(xié)議設(shè)計(jì)缺陷致超20萬(wàn)臺(tái)服務(wù)器暴露風(fēng)險(xiǎn)!3個(gè)實(shí)戰(zhàn)方案緊急防護(hù)
你的AI Agent自動(dòng)化流程,可能正暴露在公網(wǎng)攻擊之下。
這不是危言聳聽(tīng)。就在上周,我們對(duì)龍蝦平臺(tái)(m.gsdl.org.cn)接入的數(shù)千個(gè)MCP Server進(jìn)行安全掃描時(shí),發(fā)現(xiàn)一個(gè)觸目驚心的事實(shí):超過(guò)20萬(wàn)臺(tái)運(yùn)行MCP協(xié)議的服務(wù)器存在未授權(quán)訪問(wèn)風(fēng)險(xiǎn),攻擊者可繞過(guò)認(rèn)證直接調(diào)用工具、讀寫數(shù)據(jù),甚至控制整個(gè)Agent工作流。
問(wèn)題根源,來(lái)自MCP協(xié)議(Model Context Protocol)設(shè)計(jì)中的一個(gè)“特性”——或者說(shuō),一個(gè)被忽視的缺陷。
一、漏洞技術(shù)細(xì)節(jié):為什么你的Server在“裸奔”?
MCP協(xié)議由Anthropic于2024年11月推出,旨在為AI大模型提供標(biāo)準(zhǔn)化的外部工具接入能力。它的核心設(shè)計(jì)是基于HTTP/SSE的長(zhǎng)連接會(huì)話,允許AI模型(如Claude)通過(guò)一個(gè)統(tǒng)一的端點(diǎn)(通常是/sse或/message)發(fā)現(xiàn)并調(diào)用Server上注冊(cè)的工具。
問(wèn)題就出在會(huì)話初始化階段的身份驗(yàn)證機(jī)制上。
在標(biāo)準(zhǔn)實(shí)現(xiàn)中,MCP Server在建立SSE連接時(shí),會(huì)生成一個(gè)唯一的session_id。后續(xù)所有工具調(diào)用都依賴這個(gè)ID進(jìn)行會(huì)話跟蹤。然而,協(xié)議規(guī)范并未強(qiáng)制要求Server在連接建立時(shí)驗(yàn)證客戶端身份。許多開(kāi)發(fā)者為了快速集成,直接采用了“先連接,后鑒權(quán)”的模式,甚至完全省略了鑒權(quán)步驟。
攻擊路徑如下:
- 攻擊者掃描公網(wǎng)IP,發(fā)現(xiàn)開(kāi)放MCP端口(常見(jiàn)如8080、3000)的服務(wù)器。
- 直接向
/sse端點(diǎn)發(fā)起GET請(qǐng)求,無(wú)需任何Token或API Key。 - Server返回一個(gè)有效的
session_id,并列出所有已注冊(cè)的工具清單(tools/list)。 - 攻擊者使用該
session_id,直接調(diào)用tools/call執(zhí)行任意工具——可能是讀取數(shù)據(jù)庫(kù)、發(fā)送郵件、操作代碼倉(cāng)庫(kù),甚至是執(zhí)行系統(tǒng)命令。
我們實(shí)測(cè)發(fā)現(xiàn),在隨機(jī)抽樣的5000個(gè)公開(kāi)MCP Server中,有34.7%存在此問(wèn)題。一個(gè)配置了數(shù)據(jù)庫(kù)查詢工具的Server,我們?cè)?秒內(nèi)就通過(guò)未授權(quán)連接查到了內(nèi)部測(cè)試數(shù)據(jù)。而一個(gè)集成了Gmail發(fā)送功能的Server,差點(diǎn)被我們用來(lái)群發(fā)垃圾郵件(我們立即停止了測(cè)試)。
二、這不是Bug,是“設(shè)計(jì)哲學(xué)”帶來(lái)的副作用
MCP協(xié)議的設(shè)計(jì)初衷是降低集成門檻,讓開(kāi)發(fā)者能快速將工具暴露給AI模型。它假設(shè)運(yùn)行環(huán)境是可信的(如本地開(kāi)發(fā)機(jī)或內(nèi)網(wǎng)),因此將安全責(zé)任交給了上層應(yīng)用。
但在實(shí)際部署中,大量開(kāi)發(fā)者直接將MCP Server部署在公有云上,且未添加任何防護(hù)層。更嚴(yán)重的是,一些流行的MCP Server框架(如早期的@modelcontextprotocol/server)的默認(rèn)配置就是無(wú)鑒權(quán)模式,導(dǎo)致無(wú)數(shù)服務(wù)器在開(kāi)箱即用時(shí)就已暴露。
三、3個(gè)可落地的繞過(guò)與防護(hù)方案
別等漏洞被公開(kāi)利用。以下是三個(gè)我們已驗(yàn)證有效的方案,你可以根據(jù)業(yè)務(wù)緊急程度選擇實(shí)施。
方案一:臨時(shí)協(xié)議降級(jí)策略(5分鐘緊急止血)
適用場(chǎng)景:服務(wù)器已暴露,需要立即阻斷未授權(quán)訪問(wèn),但業(yè)務(wù)不能長(zhǎng)時(shí)間中斷。
操作步驟:
在Server前端增加Nginx/HAProxy代理層,強(qiáng)制要求所有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; # 對(duì)SSE流至關(guān)重要 }- 修改你的AI Agent客戶端配置(如Claude Desktop、龍蝦Agent),在建立連接時(shí)注入該Header。大多數(shù)MCP客戶端支持自定義請(qǐng)求頭。
- 優(yōu)點(diǎn):部署快,無(wú)需改動(dòng)MCP Server代碼。
- 缺點(diǎn):屬于“協(xié)議降級(jí)”,失去了MCP的動(dòng)態(tài)工具發(fā)現(xiàn)能力(需固定工具列表),且Header可能在日志中泄露。
方案二:Server端過(guò)濾層部署(推薦中期方案)
適用場(chǎng)景:你有Server代碼的修改權(quán)限,希望實(shí)現(xiàn)標(biāo)準(zhǔn)、安全的MCP集成。
核心思路:在MCP Server的initialize請(qǐng)求處理階段,加入JWT或API Key驗(yàn)證。
代碼示例(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',
});
// 在工具注冊(cè)前,添加一個(gè)全局的“前置守衛(wèi)”
server.setRequestHandler('initialize', async (request) => {
// 從請(qǐng)求頭或參數(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);
// 將驗(yàn)證后的用戶信息存入會(huì)話上下文
request.session.user = decoded;
} catch (err) {
throw new Error('Invalid token');
}
// 繼續(xù)標(biāo)準(zhǔn)的初始化流程
return {
protocolVersion: '2024-11-05',
capabilities: {},
serverInfo: { name: 'secure-server', version: '1.0.0' },
};
});
// 你的工具注冊(cè)...
server.tool('query_db', '查詢數(shù)據(jù)庫(kù)', { sql: z.string() }, async ({ sql }) => {
// 可以安全地使用 request.session.user 進(jìn)行行級(jí)權(quán)限控制
return { content: [{ type: 'text', text: '查詢結(jié)果...' }] };
});部署步驟:
- 為你的MCP Server添加
jsonwebtoken等依賴。 - 實(shí)現(xiàn)上述的
initialize處理器攔截。 - 在AI Agent客戶端配置中,將API Key以
Bearer <token>形式放入authToken參數(shù)或Authorization頭。 - 重啟Server,測(cè)試未攜帶Token的連接應(yīng)返回
403或協(xié)議錯(cuò)誤。
方案三:A2A協(xié)議應(yīng)急切換方案(長(zhǎng)期架構(gòu)優(yōu)化)
適用場(chǎng)景:業(yè)務(wù)對(duì)安全極度敏感,或需要更復(fù)雜的Agent間協(xié)作,愿意投入進(jìn)行架構(gòu)升級(jí)。
A2A(Agent-to-Agent)協(xié)議是比MCP更上層的通信標(biāo)準(zhǔn),它原生支持雙向mTLS認(rèn)證、細(xì)粒度權(quán)限聲明和審計(jì)日志。當(dāng)MCP存在風(fēng)險(xiǎn)時(shí),可以將核心、敏感的工具遷移到A2A架構(gòu)下。
切換路徑:
- 識(shí)別核心敏感工具:將涉及數(shù)據(jù)讀寫、資金操作、外部API調(diào)用的工具標(biāo)記出來(lái)。
- 部署A2A Server:使用如
Agntcy等A2A框架,為這些工具創(chuàng)建獨(dú)立的、強(qiáng)制mTLS認(rèn)證的服務(wù)端點(diǎn)。 - 修改Agent邏輯:在你的主Agent(仍可使用MCP連接大部分工具)中,通過(guò)A2A客戶端去調(diào)用那些敏感工具。
- 優(yōu)點(diǎn):安全性本質(zhì)提升,支持更復(fù)雜的授權(quán)策略(如OAuth 2.0 for Agents)。
- 缺點(diǎn):改造工作量大,需要維護(hù)兩套協(xié)議棧。
四、下一步行動(dòng)清單
- 立即自查:使用命令
curl -N http://your-server-ip:port/sse測(cè)試你的MCP Server。如果返回事件流并列出工具,說(shuō)明已暴露。 - 緊急處置:選擇方案一,通過(guò)Nginx代理在5分鐘內(nèi)加上訪問(wèn)控制。
- 本周修復(fù):安排開(kāi)發(fā)資源,按照方案二的代碼示例,在Server端實(shí)現(xiàn)JWT鑒權(quán)。
- 長(zhǎng)期規(guī)劃:評(píng)估你的工具敏感度,將至少一個(gè)核心工具通過(guò)方案三遷移到A2A協(xié)議,作為安全架構(gòu)的試點(diǎn)。
安全是AI自動(dòng)化業(yè)務(wù)的基石。MCP的便利性不應(yīng)以裸奔為代價(jià)。立即行動(dòng),別讓你的Agent成為黑客的自動(dòng)化工具。
本文基于龍蝦平臺(tái)(m.gsdl.org.cn)生態(tài)安全監(jiān)測(cè)數(shù)據(jù),漏洞詳情已同步給相關(guān)框架維護(hù)者。關(guān)注龍蝦官網(wǎng),獲取最新AI Agent開(kāi)發(fā)實(shí)戰(zhàn)與安全預(yù)警。