Model Context Protocol(MCP) 把 LLM 应用连接外部工具和数据的标准化——Host 跑模型,Client 连 Server,Server 暴露 tools、resources、prompts。从安全视角,MCP 解决的是工具供应链问题:谁认证 Server、谁授权 tool 调用、transport 上 secret 如何走。
本文以 MCP Specification(截至 2026-06 的公开版本 2025-03-26,A 级)为准,标注与 OAuth 2.1 草案 的衔接点。旧版 HTTP+SSE transport(2024-11-05)已被 Streamable HTTP 取代——部署时需核对 Server 协议版本。
一、Host / Client / Server 三角
flowchart TD
HOST["MCP Host<br/>IDE / Agent 运行时"]
LLM["LLM"]
CLIENT["MCP Client"]
S1["Server: Git"]
S2["Server: Postgres"]
HOST --> LLM
HOST --> CLIENT
CLIENT -->|"stdio 或 Streamable HTTP"| S1
CLIENT -->|"stdio 或 Streamable HTTP"| S2
| 角色 | 职责 | 信任假设 |
|---|---|---|
| Host | UI、模型推理、聚合多个 Client | 用户直接交互;Host 策略是最后防线 |
| Client | 协议会话、capability 协商、JSON-RPC | Host 内嵌;须受 Host 策略约束 |
| Server | tools / resources / prompts | 默认不可信第三方 |
MCP 基于 JSON-RPC 2.0
消息(UTF-8)。生命周期:initialize →
initialized → 能力交换 →
tools/list、tools/call 等。
关键架构事实:一个 Host 可连多个 Server。每个 Server 的 OAuth token、API key 必须隔离——Client 不得把 Server A 的 credential 泄漏给 Server B(第 07 篇 展开供应链)。
二、Transport:stdio vs Streamable HTTP
MCP spec 2025-03-26 定义两种标准 transport(A 级):
2.1 stdio
| 属性 | 规范要求 |
|---|---|
| 启动方式 | Client 以子进程启动 Server |
| 消息通道 | stdin / stdout,newline 分隔 JSON-RPC |
| stderr | Server 可写日志;Client 可忽略 |
| stdout 约束 | 仅合法 MCP 消息——禁止 printf 调试污染 |
sequenceDiagram
participant Client
participant Server as Server Process
Client->>+Server: Launch subprocess
loop Message Exchange
Client->>Server: Write JSON-RPC to stdin
Server->>Client: Write JSON-RPC to stdout
Server--)Client: Optional logs on stderr
end
Client->>Server: Close stdin, terminate
deactivate Server
安全含义:
- 无网络暴露——攻击面从远程变为本地进程。
- 恶意 Server 二进制 = 本地代码执行(RCE)——与安装未签名 npm 包同级。
- 缓解:签名验证、最小文件系统权限、容器隔离(联动 零信任供应链)。
2.2 Streamable HTTP(取代 HTTP+SSE)
2025-03-26 spec 用 Streamable HTTP 替代 2024-11-05 的 HTTP+SSE transport。
| 属性 | 要求 |
|---|---|
| 端点 | 单一 MCP endpoint,支持 POST + GET |
| POST | 每个 JSON-RPC 消息一次 POST;可返回 JSON 或 SSE stream |
| GET | 可选 SSE stream,Server 主动推送 |
| Session | Mcp-Session-Id header(初始化后) |
Security Warning(spec 原文意图,A 级):
- Server 必须验证
Originheader——防 DNS rebinding。 - 本地 Server 应只 bind
127.0.0.1,非0.0.0.0。 - Server 应对所有连接做认证。
无上述保护时,远程网页可通过 DNS rebinding 调用用户本机 MCP Server——与 CSRF 变体同类。
2.3 Transport 对比表
| 维度 | stdio | Streamable HTTP |
|---|---|---|
| 部署 | 本地子进程 | 独立 HTTP 服务 |
| 认证 | 进程边界 + OS 用户 | OAuth / mTLS / API Key |
| 多租户 | 单用户机器 | 团队共享 Server |
| 主要威胁 | 恶意二进制、本地提权 | 网络攻击、Origin 绕过、会话劫持 |
| TLS | 不适用 | 必须 HTTPS |
stdio 不是”更安全”——只是攻击面不同。企业远程 MCP 服务必须用 Streamable HTTP + 完整认证栈。
2.4 向后兼容
Spec 定义:新 Client 应对 Server URL POST
InitializeRequest;若 4xx 则 fallback 旧
HTTP+SSE。生产环境应显式配置 transport
版本,避免静默降级到旧协议。
三、MCP 能力与攻击面
3.1 Tools
tools/list 返回 tool 名 + JSON Schema
description。tools/call 执行 tool。
| 方法 | 数据流 | 风险 |
|---|---|---|
tools/list |
Server → Client → 可能进入 LLM context | 恶意 description = indirect prompt injection 入口 |
tools/call |
LLM → Client → Server → 外部系统 | 越权调用、参数注入 |
3.2 Resources
resources/read
返回只读数据——内容可能含隐藏指令(安全侧见 第 07
篇)。credential 角度:resource URI
不得嵌入 token。
3.3 Prompts
Server 提供的 prompt 模板——同样进入模型 context,需 Host 侧 allowlist。
四、认证:OAuth 2.1 for MCP
MCP Authorization 扩展(截至 2026-06 仍为草案演进中,以 modelcontextprotocol.io 当前 spec 为准)描述:
- MCP Server 作为 OAuth 2.0 Resource Server
- Host/Client 作为 Public Client,走授权码 + PKCE
- 与 IAM OAuth 2.1 + PKCE 一致
4.1 推荐 token 模型
| 反模式 | 推荐 |
|---|---|
| 用户主 session token 注入 MCP Server | per-Server scoped token |
| 全 scope access token 共享给所有 Server | 每 Server 独立 resource /
audience |
| refresh token 存 MCP Server | refresh 仅存 Host/Gateway;Server 拿短期 access token |
与 Token
Exchange 衔接:Host 经 Gateway 用 RFC 8693 换
audience=git-mcp-server 的 delegated
token。
4.2 授权序列
sequenceDiagram
participant User
participant Host as MCP Host
participant IdP as Authorization Server
participant MCPS as MCP Server
User->>Host: 连接 Git MCP Server
Host->>IdP: PKCE authorize scope=mcp:tools:git
IdP->>User: consent UI
User->>IdP: 批准
IdP->>Host: authorization code
Host->>IdP: code + PKCE verifier
IdP->>Host: access_token aud=git-mcp
Host->>MCPS: Initialize + Bearer token
MCPS->>MCPS: 验证 aud + scope + exp
Host->>MCPS: tools/list, tools/call
4.3 Session 与 MCP HTTP Session
Streamable HTTP 的 Mcp-Session-Id:
- 初始化响应 header 返回
- 后续 POST/GET 必须携带
- Server 可随时 404 终止 session
安全:Session ID 应密码学随机(spec 建议 UUID/JWT/hash)。泄露 Session ID = 劫持 MCP 会话——须与 Bearer token 绑定或短期轮换。
五、Tool 暴露面 = 攻击面
| 风险 | 说明 | 缓解 |
|---|---|---|
| Tool poisoning | 恶意 description 诱导模型越权 | Host 展示 tool 列表供用户批准;策略引擎过滤 |
| Over-privileged tool | run_sql 无 WHERE 限制 |
OPA/Cedar 在 Host 层 |
| Indirect injection | Resource 含隐藏指令 | 清洗 resource;本文只谈 credential 与授权 |
| Cross-server leak | Server A 的 token 出现在 Server B 请求 | 凭据隔离清单 §六 |
Host 应在 tools/call
发出前做策略检查——不能假设 LLM
输出参数安全。
六、Secret 隔离清单
七、JSON-RPC 与错误处理
MCP 错误通过 JSON-RPC error 对象返回。Host
应区分:
| 错误类 | 安全动作 |
|---|---|
| 401 / 认证失败 | 不自动重试 user password;走 OAuth refresh |
| 403 / scope 不足 | 提示用户 re-consent 或缩小 tool |
| Server 内部错误 | 不将 stack trace 注入 LLM context |
八、多 Server 拓扑
flowchart LR
subgraph Host Process
C1[Client A]
C2[Client B]
POL[Policy Engine]
end
C1 -->|token_A| SA[Server A]
C2 -->|token_B| SB[Server B]
POL --> C1
POL --> C2
Policy Engine 统一拦截所有 tools/call——与 零信任策略引擎
同构:默认拒绝、显式允许。
九、与 llm-infra 系列边界
llm-infra/ 讲框架选型、网关、部署。本系列讲
identity + policy + audit。MCP 工程实现见
llm-infra;安全基线以本文与 spec 为准。
十、部署检查表(Streamable HTTP)
| 检查项 | 通过标准 |
|---|---|
| HTTPS | 生产强制 |
| Origin 验证 | 实现 spec Security Warning |
| OAuth PKCE | Public Client 无 secret |
| Token audience | 每 Server 独立 |
| Session ID 熵 | ≥ 128 bit |
| Rate limit | 防 brute force / DoS |
| 日志 | 不含 Bearer token 明文 |
十一、边界
- 不预测 MCP spec 最终 IETF RFC 号
- 不复现 prompt injection 攻击全文
- Multi-Agent(A2A)不在本系列首批范围
- OAuth 2.1 for MCP 截至 2026-06 为草案演进——以 spec 发布日期为准
十二、MCP Initialize 与安全
Initialize 前 HTTP 层须已完成 OAuth。Capability 协商应 disable 不需要的能力减攻击面。
十三、stdio 沙箱
专用低权用户、seccomp、网络 egress allowlist——恶意 Server 等同本地 RCE。
十四、DNS Rebinding
Spec Security Warning:验证 Origin、localhost bind、认证——缺任一项可被远程网页调用本地 MCP。
十五、OAuth Scope 命名
mcp:server:<id>:tools:invoke
per-server——与 Token
Exchange 组合。
十六、安全检查总表
| # | 项 | stdio | HTTP |
|---|---|---|---|
| 1 | 来源可信 | ✓ | ✓ |
| 2 | per-server 凭据 | ✓ | ✓ |
| 3 | TLS | N/A | ✓ |
| 4 | Origin | N/A | ✓ |
| 5 | Policy on tools/call | ✓ | ✓ |
下一篇:MCP 供应链
参考资料
- Model Context Protocol, Specification 2025-03-26, Transports / Authorization(阅读日期 2026-06)
- IETF OAuth 2.1 Draft, The OAuth 2.1 Authorization Framework(截至 2026-06 draft 状态)
- Token Exchange — 本系列第 02 篇
- 零信任供应链
读完这篇,下一步读什么
优先读同系列或同问题的下一篇,把单篇消费变成主题集群。
【Agent 身份与安全】AI Agent 的身份、委托与审计
IAM 系列(人)与零信任系列(边界)的自然延伸:当 LLM Agent 代表用户调用 API、执行 SQL、读写邮件时,传统 OAuth 模型如何扩展?拆解 Token Exchange、MCP 安全模型、工具级授权、持续验证与审计归因。
【Agent 身份与安全】Agent 身份谱系:从 API Key 到委托 Token
四代 Agent 身份模型:API Key、OAuth 用户 token、Service Account、RFC 8693 Token Exchange 委托链。拆解 subject_token、actor_token、act claim,以及与 JWT/JWKS 系列的交叉引用。
【Agent 身份与安全】细粒度 Scope 与 UMA 2.0 启示
从 coarse scope 到 resource-specific consent:UMA 2.0 Permission Ticket 模型、Google incremental auth 对照,以及 Agent 场景下的动态授权边界。
【Agent 身份与安全】MCP Server 隔离与供应链
多 MCP Server 并存时的 secret 隔离、恶意 tool description 注入、SBOM 与签名验证,以及与零信任软件供应链的联动。