← 返回AI安全专项

🔗 MCP协议安全

MCP(Model Context Protocol)定义了AI Agent与外部工具的标准通信协议。理解MCP的安全边界,是构建安全Agent系统的基础。

1. MCP协议安全分析

1.1 协议架构

┌──────────────┐         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。

1.2 核心消息类型与安全考量

消息 用途 安全风险 防护
tools/list Agent发现可用工具 信息泄露 — 攻击者探测所有Tool 按Agent角色过滤Tool列表
tools/call Agent调用工具 工具滥用 — 参数注入 参数白名单 + Schema校验
resources/read 读取MCP资源 路径遍历 — 读取越权文件 URI白名单 + 路径规范化
prompts/get 获取Prompt模板 模板注入 — 敏感信息嵌入 模板内容安全审查

2. 通信层安全风险

2.1 传输层风险矩阵

传输方式 风险 适用场景 安全建议
stdio 本地进程通信,低风险 本地Agent+本地Server 进程权限控制
HTTP+SSE 明文传输、中间人、重放攻击 远程MCP Server TLS + Token认证 + Nonce防重放
WebSocket 长连接劫持、消息注入 实时双向通信 WSS + 消息签名 + 心跳检测

2.2 认证与授权

# 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"
    }
}

3. MCP权限控制模型

Agent级权限

每个Agent有独立的权限配置,控制其可见的工具列表(tools/list只返回该Agent有权限的工具)

工具级权限

每个Tool定义细粒度的参数约束(max_args、allowed_values、regex_pattern),参数不合法直接拒绝

资源级隔离

MCP资源(resources/*)按Agent进行命名空间隔离,Agent A不能读取Agent B的资源

调用链审计

全量记录MCP通信:谁、什么时间、调用了哪个工具、传了什么参数、返回了什么结果

4. MCP攻击面全景

攻击面 攻击方式 影响 缓解
工具发现 通过 tools/list 枚举所有可用工具 暴露攻击面信息 按Agent角色过滤
参数注入 在工具参数中注入恶意内容 命令执行、路径遍历 Schema校验+白名单
消息篡改 中间人截获并修改MCP消息 工具调用被劫持 TLS + 消息签名
资源泄露 通过 resources/read 读取越权资源 敏感数据泄露 URI白名单 + 租户隔离

5. MCP Server安全加固清单

✅ 强制TLS

所有远程MCP通信必须使用TLS 1.3,拒绝明文连接

✅ Agent认证

每个Agent分配独立Token,支持Token轮换和吊销

✅ 工具白名单

只暴露Agent实际需要的Tool,不暴露Server上所有Tool

✅ 参数Schema

每个Tool参数严格定义JSON Schema,拒绝非法参数

✅ 速率限制

限制每个Agent的tools/call频率,防止滥用和探测

✅ 审计日志

全量MCP消息日志,不可篡改存储,支持事后追溯

✅ 超时控制

每次Tool调用设置合理超时,防止资源耗尽

✅ 错误处理

错误信息不泄露内部细节,返回通用错误码