土法炼钢 · 系统与基础设施

【Agent 身份与安全】MCP 架构与安全基线

文章导航

分类入口
architecturesecurity
标签入口
#mcp#model-context-protocol#oauth#agent#tool-calling#stdio#sse#security

目录

Model Context Protocol(MCP) 把 LLM 应用连接外部工具和数据的标准化——Host 跑模型,Client 连 Server,Server 暴露 toolsresourcesprompts。从安全视角,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)。生命周期:initializeinitialized → 能力交换 → tools/listtools/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

安全含义

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 级):

  1. Server 必须验证 Origin header——防 DNS rebinding。
  2. 本地 Server 只 bind 127.0.0.1,非 0.0.0.0
  3. 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 为准)描述:

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

安全: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 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

上一篇Human-in-the-Loop

下一篇MCP 供应链


参考资料

  1. Model Context Protocol, Specification 2025-03-26, Transports / Authorization(阅读日期 2026-06)
  2. IETF OAuth 2.1 Draft, The OAuth 2.1 Authorization Framework(截至 2026-06 draft 状态)
  3. Token Exchange — 本系列第 02 篇
  4. 零信任供应链

读完这篇,下一步读什么

优先读同系列或同问题的下一篇,把单篇消费变成主题集群。

2026-06-18 · architecture / security

【Agent 身份与安全】AI Agent 的身份、委托与审计

IAM 系列(人)与零信任系列(边界)的自然延伸:当 LLM Agent 代表用户调用 API、执行 SQL、读写邮件时,传统 OAuth 模型如何扩展?拆解 Token Exchange、MCP 安全模型、工具级授权、持续验证与审计归因。


By .