MCP(Model Context Protocol)定义了AI Agent与外部工具的标准通信协议。理解MCP的安全边界,是构建安全Agent系统的基础。
┌──────────────┐ MCP Protocol ┌──────────────┐
│ │ ← tools/list │ │
│ AI Agent │ ← resources/read │ MCP Server │
│ (Client) │ ← prompts/get │ (Tool │
│ │ │ Provider) │
│ │ → tools/call │ │
│ │ → resources/subscribe │ │
└──────────────┘ └──────┬───────┘
│
┌────────▼───────┐
│ Tool Backend │
│ (Shell/DB/API) │
└────────────────┘
MCP采用Client-Server架构,使用JSON-RPC 2.0作为消息格式。支持多种传输层:stdio、HTTP+SSE、WebSocket。
| 消息 | 用途 | 安全风险 | 防护 |
|---|---|---|---|
| tools/list | Agent发现可用工具 | 信息泄露 — 攻击者探测所有Tool | 按Agent角色过滤Tool列表 |
| tools/call | Agent调用工具 | 工具滥用 — 参数注入 | 参数白名单 + Schema校验 |
| resources/read | 读取MCP资源 | 路径遍历 — 读取越权文件 | URI白名单 + 路径规范化 |
| prompts/get | 获取Prompt模板 | 模板注入 — 敏感信息嵌入 | 模板内容安全审查 |
| 传输方式 | 风险 | 适用场景 | 安全建议 |
|---|---|---|---|
| stdio | 本地进程通信,低风险 | 本地Agent+本地Server | 进程权限控制 |
| HTTP+SSE | 明文传输、中间人、重放攻击 | 远程MCP Server | TLS + Token认证 + Nonce防重放 |
| WebSocket | 长连接劫持、消息注入 | 实时双向通信 | WSS + 消息签名 + 心跳检测 |
# MCP Server 认证示例 (HTTP+SSE模式)
# 每个MCP请求都必须携带有效的Bearer Token
class MCPServerAuth:
def __init__(self):
self.sessions = {} # Agent → Token映射
def authenticate(self, agent_id: str, token: str) -> bool:
"""验证Agent身份"""
expected = self.sessions.get(agent_id)
if not expected:
return False
# 使用恒定时间比较防止时序攻击
return hmac.compare_digest(token, expected)
def authorize_tool(self, agent_id: str, tool_name: str) -> bool:
"""检查Agent是否有权调用特定Tool"""
policy = self.get_policy(agent_id)
return tool_name in policy.get('allowed_tools', [])
# MCP消息模板 — 每个请求都带认证头
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "execute_shell",
"arguments": {"command": "ls -la"}
},
"auth": {
"agent_id": "agent-001",
"token": "mcp_sk_live_xxxx",
"nonce": "random-nonce-2024",
"timestamp": "2024-01-01T00:00:00Z"
}
}
每个Agent有独立的权限配置,控制其可见的工具列表(tools/list只返回该Agent有权限的工具)
每个Tool定义细粒度的参数约束(max_args、allowed_values、regex_pattern),参数不合法直接拒绝
MCP资源(resources/*)按Agent进行命名空间隔离,Agent A不能读取Agent B的资源
全量记录MCP通信:谁、什么时间、调用了哪个工具、传了什么参数、返回了什么结果
| 攻击面 | 攻击方式 | 影响 | 缓解 |
|---|---|---|---|
| 工具发现 | 通过 tools/list 枚举所有可用工具 | 暴露攻击面信息 | 按Agent角色过滤 |
| 参数注入 | 在工具参数中注入恶意内容 | 命令执行、路径遍历 | Schema校验+白名单 |
| 消息篡改 | 中间人截获并修改MCP消息 | 工具调用被劫持 | TLS + 消息签名 |
| 资源泄露 | 通过 resources/read 读取越权资源 | 敏感数据泄露 | URI白名单 + 租户隔离 |
所有远程MCP通信必须使用TLS 1.3,拒绝明文连接
每个Agent分配独立Token,支持Token轮换和吊销
只暴露Agent实际需要的Tool,不暴露Server上所有Tool
每个Tool参数严格定义JSON Schema,拒绝非法参数
限制每个Agent的tools/call频率,防止滥用和探测
全量MCP消息日志,不可篡改存储,支持事后追溯
每次Tool调用设置合理超时,防止资源耗尽
错误信息不泄露内部细节,返回通用错误码