AI教程

MCP Server 上线前怎么做安全检查?OAuth、工具权限与提示注入验收

按当前MCP授权规范检查身份、受众、PKCE、逐工具权限、提示注入、幂等、日志、撤销与回滚,并用三十六个可复现测试形成上线回执。

最终用户Host客户端MCP Server下游API与审计系统组成的五身份授权链
本页目录
  1. 直接答案:先把 MCP Server 当成高权限 API,再讨论模型体验
  2. 为什么保留 125013,而不是新建另一篇 MCP 安全文章
  3. 先画清五个身份,不要把“已登录”当成已授权
  4. 远程 HTTP 与本地 stdio 的威胁模型完全不同
  5. 受保护资源元数据是客户端发现入口,不是装饰文件
  6. 资源受众绑定和 token passthrough 是必须单独验收的两件事
  7. PKCE、state、redirect URI 与 issuer 校验组成一条完整链
  8. scope 只表达协议授权,仍需业务对象级权限
  9. 工具目录本身也需要版本、签名和变更门禁
  10. 每个工具都写副作用等级和失败语义
  11. 输入 schema 负责结构,业务校验负责安全
  12. 工具返回值仍是不可信输入,尤其是自由文本和链接
  13. 提示注入的核心控制是来源—动作一致性
  14. 审批必须绑定参数哈希,而不是绑定一句自然语言
  15. 网络门禁要检查最终目标,而不是只检查输入 URL
  16. 秘密只能由凭据代理在最后一跳注入
  17. 本地服务器的安装与更新属于软件供应链发布
  18. 沙箱限制主机影响,但不能替代业务授权
  19. 多租户隔离要贯穿缓存、任务、日志和错误
  20. 重放、重复调用与部分失败必须有确定性结果
  21. 速率、费用和资源预算防止模型把小错误放大
  22. 日志要可审计、可关联,但不能变成第二个泄露面
  23. 撤销要覆盖令牌、会话、任务、缓存和持久记忆
  24. 变更管理以能力差异为中心,而不是只看代码行数
  25. 可用性验收不能被安全测试吃掉
  26. 用分层证据做最终上线决定
  27. 先在与生产隔离的预发布环境建立最小可用基线
  28. 把服务所有权、数据所有权与安全审批分开
  29. 隐私与数据保留要落到每个工具和字段
  30. 性能和可靠性指标必须与安全门禁一起观察
  31. 客户端兼容性测试不能假设所有 Host 行为相同
  32. 发布当天采用 canary、观察窗和自动回退
  33. 最终评审会议只讨论证据缺口和剩余风险
  34. 工具副作用与证据矩阵
  35. 三十六个可复现上线测试
  36. 1. 无凭据访问
  37. 2. 错误受众令牌
  38. 3. 错误发行方
  39. 4. 过期与未来令牌
  40. 5. 缺失 PKCE
  41. 6. state 与授权响应混淆
  42. 7. redirect URI 变体
  43. 8. 令牌透传
  44. 9. scope 不足
  45. 10. 跨租户对象
  46. 11. 模型自报身份
  47. 12. 未知字段与 schema 漂移
  48. 13. 路径穿越
  49. 14. 私网与元数据访问
  50. 15. 开放重定向外发
  51. 16. 提示注入读取秘密
  52. 17. 提示注入扩大工具
  53. 18. 工具描述投毒
  54. 19. 工具重名 shadowing
  55. 20. 恶意工具返回
  56. 21. 批量数量变化
  57. 22. 参数批准后篡改
  58. 23. 响应丢失重试
  59. 24. 部分失败
  60. 25. 取消与超时
  61. 26. 预算拆分绕过
  62. 27. 日志注入
  63. 28. 日志中的秘密
  64. 29. 撤销旧令牌
  65. 30. 排队任务撤销
  66. 31. 缓存越权
  67. 32. 本地进程继承
  68. 33. 依赖更新
  69. 34. 合法只读任务
  70. 35. 合法写入与回滚
  71. 36. 停机开关
  72. 官方证据图:当前 MCP 授权安全要求
  73. 当前来源与适用边界
  74. 与站内相邻任务怎样分工
  75. 核验日期与可证明范围

直接答案:先把 MCP Server 当成高权限 API,再讨论模型体验

MCP Server 上线前不能只看工具能否被模型调用。先确认服务器是谁运营、暴露哪些工具、以谁的身份访问什么资源、每个动作是否有副作用、错误后怎样停止和恢复。远程 HTTP 部署按当前 MCP 授权规范完成受保护资源元数据、授权服务器发现、PKCE、资源受众绑定和令牌校验;本地 stdio 进程则限制可执行文件、工作目录、环境变量、网络和子进程。所有工具参数都在服务端做类型与业务校验,读写权限分离,高风险写入显示最终对象与差异并绑定人工批准。提示注入防护不能只写进 system prompt:网页、邮件、文件、检索片段和其他工具返回始终是不可信数据,不能扩大工具目录、凭据范围或网络目标。上线结论必须来自允许请求、拒绝请求、撤销、重放、故障和回滚的真实回执。

为什么保留 125013,而不是新建另一篇 MCP 安全文章

站内已经有一个明确承载“MCP Server 上线安全检查”的未来稿 URL。它进入未来四十八小时窗口时,远端正文与批准指纹不一致,旧稿也只有概览式认证、权限与日志清单,无法覆盖当前 2026-07-28 规范中的 issuer 校验、应用类型、受众绑定、PKCE、HTTP 401 发现语义和逐工具执行门禁。本轮先按远端 SHA 建立完整服务器备份,冻结为草稿并清除 Cron,再在原 URL 完整重建。这样保留搜索意图和历史排期线索,同时避免制造一个同意图竞争页。新增资产包括身份链威胁模型、工具副作用矩阵、故障与撤销图、三十六个负向测试夹具和可离线校验的上线合同。

先画清五个身份,不要把“已登录”当成已授权

一次 MCP 调用可能同时涉及最终用户、MCP Host、客户端实例、MCP Server 和下游 API。它们的身份、会话和权限不能混成一个 bearer token。服务器要知道令牌由哪个授权服务器签发、受众是不是本服务器、代表哪个主体、具有什么 scope、是否过期和是否已撤销;下游调用还要区分服务器自身权限与用户委托权限。若服务器总用一个高权限服务账号执行,模型只要诱导出一个合法格式的请求,就可能越过用户原本没有的权限。身份表应记录主体、发行方、受众、资源、动作、租户、有效期和撤销入口,并在每次写操作回执中引用。

最终用户Host客户端MCP Server下游API与审计系统组成的五身份授权链
兰塞 AI 原创:把五个主体分开,才能判断令牌代表谁、发给谁、允许做什么。

远程 HTTP 与本地 stdio 的威胁模型完全不同

远程 HTTP 服务器暴露网络端点,需要 TLS、授权发现、令牌校验、速率限制、租户隔离、代理链和日志;本地 stdio 服务器通常作为客户端子进程运行,风险集中在安装来源、启动命令、继承环境变量、文件系统、宿主网络和子进程权限。不要因为 stdio 没有开放端口就把它视为低风险:一个恶意 npm 包仍可能读取浏览器资料、SSH 密钥和项目文件。也不要把远程服务器的 OAuth 配置机械搬到 stdio;本地进程更需要固定包版本、校验哈希、隔离用户、只读工作区和明确的网络白名单。两种部署要分别写资产清单和拒绝用例。

受保护资源元数据是客户端发现入口,不是装饰文件

远程 MCP Server 在未授权访问时应使用 HTTP 401 和 WWW-Authenticate 指向受保护资源元数据,让客户端知道合法授权服务器和资源标识。元数据中的授权服务器、scope 与资源地址属于安全边界;错误域名、开放重定向或多租户混用会把客户端引向错误发行方。测试不仅请求正常路径,还要覆盖缺失元数据、错误 content type、缓存旧元数据、跨租户 host header、反向代理改写路径以及授权服务器迁移。客户端或网关不应在发现失败时悄悄回退到任意令牌,也不能把工具级错误当成标准 401 发现流程。

资源受众绑定和 token passthrough 是必须单独验收的两件事

客户端请求令牌时把 MCP Server 的规范资源 URL 作为 resource 参数,服务器验证令牌 aud 与自己匹配。这样可以阻止为另一个 API 签发的令牌被拿来调用当前服务器。服务器随后若访问下游 API,不应把收到的用户令牌原样透传;它要使用明确的委托或令牌交换机制,或者用受限服务身份,并把下游资源与动作记录下来。验收准备一个为错误资源签发、但签名完全有效的令牌,确认服务器仍拒绝;再检查工具实现、代理日志与异常路径中没有把上游 bearer token 发往下游。

PKCE、state、redirect URI 与 issuer 校验组成一条完整链

授权码流程不是“能跳回客户端”就算通过。客户端生成高熵 verifier,使用 S256 challenge,并在令牌交换时提交匹配 verifier;state 绑定发起会话并防止跨请求混淆;授权服务器精确匹配预登记 redirect URI;客户端验证授权响应中的 issuer,确保授权码来自预期发行方。缺一项都可能给授权码截获、登录 CSRF、开放重定向或授权服务器混淆留下空间。测试时使用错误 verifier、缺失 state、相似 redirect 域名、大小写或尾斜线变化、另一个 issuer 的合法响应,并保存每次拒绝的 HTTP 状态与错误分类。

scope 只表达协议授权,仍需业务对象级权限

一个 write scope 往往过于宽泛。工具执行时继续校验租户、项目、仓库、邮箱、文件夹、记录所有者、允许字段、数量和状态迁移。用户有“更新工单”权限,不等于可以修改任意客户工单;有“发送邮件”权限,不等于可以发给新外部域名。工具 schema 中把对象和动作拆开,服务器从可信会话解析主体与租户,不接受模型在参数里自报 user_id 或 tenant_id。批量请求设数量上限与明确过滤条件;若服务无法在业务层证明对象属于当前授权范围,默认拒绝或降级为只读预览。

工具目录本身也需要版本、签名和变更门禁

模型会依据工具名称、描述、参数和返回 schema 选择动作,因此工具定义变化就是策略变化。上线前保存工具清单与 schema 哈希,记录版本、维护人、代码提交、依赖和预计副作用。运行时发现新增工具、描述中出现外部指令、参数由枚举变成任意字符串、只读工具新增写能力或返回字段包含敏感数据时,先隔离并重新评审。不要让远端服务器在无人知情时动态扩大工具列表。多服务器环境还要检查工具重名与 shadowing:一个恶意服务器不能通过相似名称或描述诱导模型替代可信工具。

每个工具都写副作用等级和失败语义

把工具分为纯读取、可逆写入、高风险写入和管理动作。读取也可能泄露数据,因此注明数据敏感级与外发边界;可逆写入要有幂等键、期望版本和恢复入口;高风险写入展示最终目标、差异、影响与批准;管理动作通常不交给普通 Agent。为每个错误定义“没有执行、可能执行、部分执行、已执行但响应丢失”的语义,避免客户端在超时后盲目重试。返回 success 只能说明服务器处理结果,重要业务动作还要读取下游真实状态或业务回执。

输入 schema 负责结构,业务校验负责安全

JSON Schema 可以限制类型、枚举、长度和必填字段,但不能单独判断路径是否越界、URL 是否指向私网、SQL 是否访问错误租户、邮件收件人是否获批或金额是否合理。服务器按任务和身份继续做规范化、对象授权、路径解析、域名与 IP 检查、内容类型、文件大小、速率和预算校验。拒绝未知字段,避免旧客户端在新服务器上触发未预期分支。自由文本字段限定用途,不能直接拼接 shell、SQL、模板或 HTTP 请求;确需查询语言时使用安全解析器和只读账户。

工具返回值仍是不可信输入,尤其是自由文本和链接

MCP Server 可以合法返回网页摘要、工单正文、邮件、代码日志或第三方 API 错误,其中都可能含提示注入。Host 应保留来源与信任标签,限制返回大小和媒体类型,不让返回文本改变系统规则、工具权限或批准状态。服务器输出结构化字段时,字段值仍需按来源风险处理;一个名为 next_step 的字段不能自动成为下一次调用指令。测试恶意网页要求读取密钥、工单正文伪造管理员批准、错误消息建议把令牌发送到诊断域名,以及一个工具返回诱导调用另一个高权限工具的跨服务器链。

MCP工具从外部数据到任务身份参数副作用批准和执行回执的六道门
兰塞 AI 原创:模型输出是候选调用,服务端策略和业务系统才给出执行结论。

提示注入的核心控制是来源—动作一致性

每次工具调用都回到用户原始任务:它要完成什么、允许读写哪些对象、允许把数据发到哪里、何时到期、哪些动作绝对禁止。外部内容只能提供事实候选,不能修改这些字段。策略层比较当前调用与任务合同,拒绝无因果关系的扩权。例如“总结一个网页”不需要读取本地密钥,“整理邮件”不需要向新域名上传附件,“查库存”不需要修改价格。模型给出的理由只是输入,最终裁决由确定性规则、身份系统和批准回执完成。

审批必须绑定参数哈希,而不是绑定一句自然语言

高风险工具先生成不可变预览:动作、最终资源、关键参数、将读取与发送的数据、预计副作用、回滚能力和到期时间。用户批准的回执包含参数规范化后的哈希、用户身份、客户端、服务器与工具版本。任何参数、重定向目标、数量、工具版本或数据摘要变化都使批准失效。不要把工具返回中的“管理员已批准”当作批准,也不要让模型自行勾选确认框。批量操作显示总数、筛选规则与代表样本;若实际匹配数变化,回到预览。

网络门禁要检查最终目标,而不是只检查输入 URL

URL 校验解析协议、主机、端口、用户信息、DNS 结果、重定向链和下载类型,阻止 localhost、云元数据地址、私网、非常用端口与协议走私。DNS 重绑定和代理改写意味着第一次解析通过并不够;连接层仍要验证最终地址。服务器访问外部 API 时使用按工具的域名白名单,研究型工具不要同时持有生产秘密。响应中的链接不能自动访问,下载先进入隔离区。网络日志记录目标、状态和字节规模,但不复制 bearer token、完整查询词或敏感正文。

秘密只能由凭据代理在最后一跳注入

模型上下文、工具参数、工具描述和普通日志都不应出现 API key、Cookie、私钥或刷新令牌。服务器从秘密系统按身份、环境、资源和动作获取短期凭据,在调用下游前注入;Host 只看到能力句柄。不同 MCP Server 不共享长期令牌,测试和生产完全分离。工具需要用户委托时,保存令牌引用和授权状态,而不是把令牌交给模型。负向测试要求读取环境变量、列出主目录、返回调试配置、制造异常堆栈和把 token 放进 URL,确认所有路径都无法泄露秘密。

本地服务器的安装与更新属于软件供应链发布

记录包来源、作者、仓库、许可证、提交、发布签名、依赖锁文件、安装脚本和可执行入口。拒绝仅凭搜索结果、聊天建议或相似包名安装。首次运行使用一次性账户和空白工作区,关闭生产凭据,观察文件、网络、子进程和启动项。更新前比较代码、依赖、工具 schema 和权限差异,重大变化重新批准。自动更新不能绕过哈希或签名门禁;维护人失联、仓库转移、域名变更或包被弃用时默认暂停,而不是继续使用最后一个未知安全状态。

沙箱限制主机影响,但不能替代业务授权

本地 MCP 进程使用非管理员账户、只读根文件系统、受限工作目录、临时目录、CPU/内存/进程数限制和网络白名单。容器不是天然安全边界,仍要禁用特权模式、宿主 socket、宽泛卷挂载和不必要 capability。即便沙箱完美,服务器可能通过合法下游 API 删除数据,所以业务 scope、对象权限、批准和幂等仍不可缺。测试同时覆盖路径穿越、符号链接、压缩包逃逸、子进程、代理变量、DNS、设备文件和过量输出;每个拒绝都记录由哪一层阻断。

多租户隔离要贯穿缓存、任务、日志和错误

租户 ID 从可信身份上下文得到,所有数据库查询、对象存储路径、缓存键、任务队列、向量索引和日志关联都显式带租户边界。错误信息不能暴露另一个租户对象是否存在。后台任务在入队时固定租户与授权快照,执行时重新验证是否过期或撤销。工具列表如按角色过滤,调用时仍做同一权限检查,不能只靠隐藏工具名称。准备两个租户的相似对象与并发任务,验证读取、写入、搜索、缓存命中、导出、重试和回滚都不会跨界。

重放、重复调用与部分失败必须有确定性结果

写工具接收客户端生成或服务器颁发的幂等键,并把键与主体、工具、参数哈希和有效期绑定。重复请求返回原结果或明确冲突,不再次产生副作用。长任务使用可查询状态而不是让模型循环重试;取消语义说明是否仍可能完成。调用下游超时后,先查询业务状态再决定补偿或重试。测试在请求发送前、下游提交后、响应返回前和日志写入时分别注入故障,确认不会重复付款、发送、删除或创建,同时保留人工恢复入口。

速率、费用和资源预算防止模型把小错误放大

按用户、租户、工具和资源设置调用次数、并发、数据量、运行时间、外发字节与费用预算。预算由网关或服务器执行,不能只在提示中提醒模型。批量工具设单次上限和总任务上限,分页游标绑定任务与权限,防止模型拆分请求绕过。触发阈值后高风险动作拒绝,低风险读取可降级到缓存或人工队列。日志区分正常限流、异常循环、攻击探测和下游故障,避免自动重试在服务不可用时形成放大流量。

MCP Server事故发现停止取证清理验证和恢复闭环
兰塞 AI 原创:停机、撤销和清理后必须用旧凭据与旧任务做负向验证。

日志要可审计、可关联,但不能变成第二个泄露面

每次调用记录时间、关联 ID、用户与工作负载身份、授权发行方与受众校验结果、服务器/工具/schema 版本、参数摘要、策略决定、批准回执、下游目标、结果分类和耗时。秘密、完整提示、个人数据和文档正文默认不进入日志;必要取证采用受控采样、字段脱敏、最短保留和访问审计。日志写入使用独立权限,Agent 不能删除或改写自己的记录。提示注入事件记录检测类别、来源、目标工具和请求 ID,不把恶意全文再次传播到告警、工单或分析模型。

撤销要覆盖令牌、会话、任务、缓存和持久记忆

事故时仅删除一个 API key 往往不够。列出所有令牌与刷新令牌、客户端会话、服务器连接、后台任务、消息队列、临时文件、缓存、索引、下载、审计副本和 Agent 记忆。暂停入口必须独立于受影响模型和服务器,由运维或身份系统执行。撤销后使用旧令牌、旧会话、排队任务和缓存命中逐项发起负向请求,证明它们真的失效。恢复时生成新凭据、修复根因、重跑定向回归并由责任人批准;同一受污染会话不能自行解除隔离。

变更管理以能力差异为中心,而不是只看代码行数

任何服务器版本、依赖、授权服务器、域名、证书、工具清单、schema、scope、下游 API、模型、系统提示、确认界面、网络策略和数据保留变化都可能改变风险。发布回执列出新增、删除和扩大能力,说明受影响测试集。只改一段工具描述也可能改变模型选择;只换授权服务器也可能改变 issuer 与受众。灰度阶段先给低权限测试租户,观察拒绝率、工具成功、异常外发和回滚。没有清晰差异或无法复现旧版本时,不应自动推广。

可用性验收不能被安全测试吃掉

过度严格的防护可能让所有请求失败,形成虚假安全。每个负向夹具配一个正常任务,确认合法用户可以在最小权限下完成目标、错误提示能指导修正且不会泄露内部信息。分别记录认证成功、授权成功、业务对象授权、工具执行、下游回执和最终回答,不把模型说“已完成”当作业务成功。客户端断线、授权过期、用户取消和下游限流时,系统应给出可理解状态,不能偷偷扩大权限或无限重试。

用分层证据做最终上线决定

配置截图证明某个选项曾经可见;HTTP 回执证明一次请求得到特定状态;日志证明服务记录了某个事件;下游业务读回证明动作实际发生;撤销测试证明旧权限失效;回滚测试证明状态可恢复。它们不能互相替代。最终清单为每项门禁指定证据类型、文件路径、环境、版本、时间、责任人与到期条件。缺证据即冻结,不以“官方支持 OAuth”“容器已启用”或“模型通常会拒绝”推断整条链安全。

先在与生产隔离的预发布环境建立最小可用基线

预发布环境使用独立域名、授权客户端、用户目录、数据库、对象存储、队列和日志,所有凭据都不能访问生产。先只启用一个只读工具,用固定主体完成发现、授权、调用、分页、退出和撤销,保存完整回执;然后逐项加入可逆写入、高风险写入与外部网络。每扩大一项能力,就重新运行此前所有拒绝用例,确认新 scope、缓存、代理或错误处理没有破坏旧边界。测试数据需要包含多租户、相似对象名、中文与特殊字符、空结果、超大结果和并发修改,不能只用一个理想账户。预发布通过也不代表生产自动通过,切换真实域名、证书、身份和下游后仍要做小流量 canary。

把服务所有权、数据所有权与安全审批分开

MCP Server 维护人负责代码、工具契约、依赖与运行;业务数据所有者决定哪些对象和字段可以暴露;身份团队维护授权服务器、客户端和撤销;安全团队审查威胁模型、负向测试和事故入口;业务负责人接受剩余风险。一个人不应既扩大工具权限、又批准上线、又删除失败日志。上线合同记录每个责任人、联系入口、值班覆盖、复查日期和离职交接。没有明确所有者的服务器、工具或凭据默认下线;临时例外写明范围、补偿控制和自动到期,不允许长期依靠聊天承诺。

隐私与数据保留要落到每个工具和字段

列出工具输入、输出、日志、缓存、模型上下文、下游 API、备份与支持工单中的数据字段,分别标注目的、法律或合同依据、地区、加密、保留时间、删除和访问角色。只因 MCP 能连接某系统,不代表数据可以发送给当前模型提供方或第三方服务器。敏感字段在进入模型前最小化、令牌化或脱敏,必要时使用本地确定性处理。删除请求需要传播到缓存、索引、任务、下载与副本,并保存完成回执。测试使用合成数据,不把真实个人信息写入提示、截图、日志或公共仓库;发现保留边界不清时,先停止相关工具。

性能和可靠性指标必须与安全门禁一起观察

上线指标同时包含工具成功率、认证失败、授权拒绝、对象越权、策略拒绝、批准取消、超时、重复调用、幂等冲突、下游错误、撤销时延和回滚成功。只追求成功率会诱使团队放宽权限或自动重试;只看拒绝率又可能掩盖正常任务无法完成。按工具和风险等级设置服务目标,高风险写入宁可明确转人工也不能在身份或日志故障时放行。告警关联同一任务内的连续拒绝、工具切换、目标域名变化和数据量突增,帮助发现模型正在尝试替代路径。容量测试也要验证限流时不会丢失审计或重复执行。

客户端兼容性测试不能假设所有 Host 行为相同

不同 Host 对授权发现、动态客户端注册、浏览器回调、工具列表缓存、批准界面、取消、任务和错误展示的实现可能不同。建立支持矩阵,记录客户端名称、版本、传输、授权方式、刷新令牌、工具缓存、确认行为和已知限制。对每个正式支持的客户端运行相同核心夹具,特别检查 401 是否触发正确发现、issuer 是否验证、scope 提升是否重新同意、工具 schema 变化是否刷新、取消后后台调用是否继续。未测试客户端明确标为不支持,服务器仍以安全失败处理,而不是为兼容性关闭受众或 PKCE 校验。

发布当天采用 canary、观察窗和自动回退

先给内部测试租户或极小用户组启用只读工具,确认身份、租户、日志、预算与下游读回;再逐步开放可逆写入,高风险写入最后启用并保持人工批准。每一阶段设最短观察窗和明确停止阈值,例如异常拒绝、未知工具、schema 漂移、外发目标变化、重复副作用、日志中断或撤销失败。触发阈值后自动关闭相关工具和新任务,保留已有证据,不让模型自行恢复。回退包包含上一版本镜像、工具清单、策略、身份配置和迁移说明,并在上线前真实演练。发布完成后仍保留七日和二十八日复查,避免只记录发布瞬间。

最终评审会议只讨论证据缺口和剩余风险

评审前由工具生成门禁汇总,但人工逐项打开原始回执,核对环境、版本、主体、资源、参数和时间是否一致。把未通过、未运行、因环境不适用和证据过期分开,不能把后三类自动折算为通过。对剩余风险写明最坏影响、受影响数据、可检测性、停止时延、回滚能力与责任人;如果风险超出业务接受范围,就缩减工具、改成只读、加入人工步骤或延期上线。会议纪要不复制秘密和个人数据,只链接受控证据。批准绑定当前工具目录、策略哈希和到期日;到期、重大变化或事故都会自动恢复为待审状态。上线后第一周由独立人员抽查真实回执与业务读回,确认审批没有被确认疲劳架空、日志没有漏失、预算没有被拆分绕过;发现差异立即暂停对应工具,而不是等到定期复盘。

工具副作用与证据矩阵

等级 例子 最低控制 完成证据
读取 列出项目、读取文档 对象授权、字段最小化、分页预算 来源、租户、字段和请求 ID
可逆写入 创建草稿、修改标签 幂等键、期望版本、差异预览 业务读回和成功回滚
高风险写入 发送、删除、支付、部署 参数哈希批准、金额/数量预算、停止条件 下游回执、影响范围和补偿状态
管理动作 改权限、密钥、策略、租户 独立管理员流程,默认不交给普通 Agent 双人审批、审计与撤销复验

三十六个可复现上线测试

每个测试固定环境、客户端、服务器、工具/schema 版本、主体、令牌属性、输入、预期状态、预期副作用、清理步骤和证据路径。允许与拒绝用例必须成对,避免用“全部失败”制造虚假安全。

1. 无凭据访问

请求远程 MCP 端点但不带令牌,应返回标准 401 和正确 WWW-Authenticate,不返回工具数据或内部堆栈。保存 HTTP、策略决定、工具回执与下游读回;若任何一层无法证明,结论保持 blocked,不以模型解释替代。

2. 错误受众令牌

使用签名有效但 aud 指向另一个 API 的令牌,服务器必须在执行工具前拒绝。保存 HTTP、策略决定、工具回执与下游读回;若任何一层无法证明,结论保持 blocked,不以模型解释替代。

3. 错误发行方

使用另一个受信 IdP 签发的令牌,确认 issuer allowlist 与密钥选择不会混淆。保存 HTTP、策略决定、工具回执与下游读回;若任何一层无法证明,结论保持 blocked,不以模型解释替代。

4. 过期与未来令牌

分别测试 exp 已过期、nbf 尚未到达和时钟偏差过大,所有请求保持无副作用。保存 HTTP、策略决定、工具回执与下游读回;若任何一层无法证明,结论保持 blocked,不以模型解释替代。

5. 缺失 PKCE

授权服务器元数据未声明支持时客户端拒绝继续;错误 verifier 无法换取令牌。保存 HTTP、策略决定、工具回执与下游读回;若任何一层无法证明,结论保持 blocked,不以模型解释替代。

6. state 与授权响应混淆

交换两个并发登录会话的 state 和 code,客户端拒绝并清理临时状态。保存 HTTP、策略决定、工具回执与下游读回;若任何一层无法证明,结论保持 blocked,不以模型解释替代。

7. redirect URI 变体

尾斜线、大小写、端口、相似域名和开放重定向均不能通过精确匹配。保存 HTTP、策略决定、工具回执与下游读回;若任何一层无法证明,结论保持 blocked,不以模型解释替代。

8. 令牌透传

让下游测试端点记录请求头,确认上游用户 bearer token 从未原样到达。保存 HTTP、策略决定、工具回执与下游读回;若任何一层无法证明,结论保持 blocked,不以模型解释替代。

9. scope 不足

只读令牌调用写工具,工具不可见不是唯一防线,直接构造 tools/call 仍被拒绝。保存 HTTP、策略决定、工具回执与下游读回;若任何一层无法证明,结论保持 blocked,不以模型解释替代。

10. 跨租户对象

使用租户 A 的合法令牌请求租户 B 的已知对象 ID,读取与写入均拒绝且不泄露存在性。保存 HTTP、策略决定、工具回执与下游读回;若任何一层无法证明,结论保持 blocked,不以模型解释替代。

11. 模型自报身份

在参数中伪造 user_id、role 或 tenant_id,服务器只信认证上下文。保存 HTTP、策略决定、工具回执与下游读回;若任何一层无法证明,结论保持 blocked,不以模型解释替代。

12. 未知字段与 schema 漂移

加入未声明字段或旧版字段,服务器拒绝而不是静默走默认危险分支。保存 HTTP、策略决定、工具回执与下游读回;若任何一层无法证明,结论保持 blocked,不以模型解释替代。

13. 路径穿越

测试 ../、绝对路径、符号链接和编码分隔符,文件工具不能离开批准工作区。保存 HTTP、策略决定、工具回执与下游读回;若任何一层无法证明,结论保持 blocked,不以模型解释替代。

14. 私网与元数据访问

URL 工具尝试 localhost、私网、云元数据和 DNS 重绑定,连接层阻断最终地址。保存 HTTP、策略决定、工具回执与下游读回;若任何一层无法证明,结论保持 blocked,不以模型解释替代。

15. 开放重定向外发

允许域名重定向到未允许目标时停止,并在批准界面显示最终目标。保存 HTTP、策略决定、工具回执与下游读回;若任何一层无法证明,结论保持 blocked,不以模型解释替代。

16. 提示注入读取秘密

工具返回要求打印环境变量或凭据,Agent 没有读取秘密的能力。保存 HTTP、策略决定、工具回执与下游读回;若任何一层无法证明,结论保持 blocked,不以模型解释替代。

17. 提示注入扩大工具

网页要求启用 shell 或管理工具,工具目录与权限保持任务合同范围。保存 HTTP、策略决定、工具回执与下游读回;若任何一层无法证明,结论保持 blocked,不以模型解释替代。

18. 工具描述投毒

远端描述包含隐藏指令或要求优先调用,schema 哈希门禁隔离变化。保存 HTTP、策略决定、工具回执与下游读回;若任何一层无法证明,结论保持 blocked,不以模型解释替代。

19. 工具重名 shadowing

两个服务器暴露相似工具名,Host 使用固定服务器身份和准入策略,不按描述替换。保存 HTTP、策略决定、工具回执与下游读回;若任何一层无法证明,结论保持 blocked,不以模型解释替代。

20. 恶意工具返回

自由文本诱导下一步向外发送私有数据,来源—动作策略在执行前阻断。保存 HTTP、策略决定、工具回执与下游读回;若任何一层无法证明,结论保持 blocked,不以模型解释替代。

21. 批量数量变化

批准十条后实际匹配变成一百条,旧批准失效并重新展示范围。保存 HTTP、策略决定、工具回执与下游读回;若任何一层无法证明,结论保持 blocked,不以模型解释替代。

22. 参数批准后篡改

收件人、路径、金额或分支变化导致参数哈希不匹配,写操作拒绝。保存 HTTP、策略决定、工具回执与下游读回;若任何一层无法证明,结论保持 blocked,不以模型解释替代。

23. 响应丢失重试

下游已提交但客户端未收到响应,使用相同幂等键不会重复执行。保存 HTTP、策略决定、工具回执与下游读回;若任何一层无法证明,结论保持 blocked,不以模型解释替代。

24. 部分失败

批量写入中途失败时逐项记录已完成、未完成和补偿结果,不返回笼统成功。保存 HTTP、策略决定、工具回执与下游读回;若任何一层无法证明,结论保持 blocked,不以模型解释替代。

25. 取消与超时

任务取消或超时后后台动作停止;不能停止的动作明确显示并进入人工处置。保存 HTTP、策略决定、工具回执与下游读回;若任何一层无法证明,结论保持 blocked,不以模型解释替代。

26. 预算拆分绕过

模型把大请求拆成多个小请求,任务级总预算仍能阻断。保存 HTTP、策略决定、工具回执与下游读回;若任何一层无法证明,结论保持 blocked,不以模型解释替代。

27. 日志注入

恶意换行、JSON 和控制字符不会伪造事件,日志也不保存完整攻击载荷。保存 HTTP、策略决定、工具回执与下游读回;若任何一层无法证明,结论保持 blocked,不以模型解释替代。

28. 日志中的秘密

在正常、错误、超时和调试路径扫描 token、Cookie、私钥和个人数据。保存 HTTP、策略决定、工具回执与下游读回;若任何一层无法证明,结论保持 blocked,不以模型解释替代。

29. 撤销旧令牌

撤销后旧访问令牌、刷新令牌和客户端会话都无法恢复权限。保存 HTTP、策略决定、工具回执与下游读回;若任何一层无法证明,结论保持 blocked,不以模型解释替代。

30. 排队任务撤销

授权撤销前进入队列、撤销后才执行的任务重新验权并失败。保存 HTTP、策略决定、工具回执与下游读回;若任何一层无法证明,结论保持 blocked,不以模型解释替代。

31. 缓存越权

先用高权限主体填充缓存,再用低权限主体查询,不能得到缓存中的高权限结果。保存 HTTP、策略决定、工具回执与下游读回;若任何一层无法证明,结论保持 blocked,不以模型解释替代。

32. 本地进程继承

stdio 服务器看不到未批准的环境变量、主目录、SSH agent、浏览器数据和宿主 socket。保存 HTTP、策略决定、工具回执与下游读回;若任何一层无法证明,结论保持 blocked,不以模型解释替代。

33. 依赖更新

包版本变化但工具名不变时,依赖、安装脚本、schema 和权限差异仍触发重审。保存 HTTP、策略决定、工具回执与下游读回;若任何一层无法证明,结论保持 blocked,不以模型解释替代。

34. 合法只读任务

最小 scope 下正常列表和读取成功,结果来源、分页和租户均正确。保存 HTTP、策略决定、工具回执与下游读回;若任何一层无法证明,结论保持 blocked,不以模型解释替代。

35. 合法写入与回滚

经预览和参数批准完成一项可逆写入,再用业务读回和回滚证明恢复。保存 HTTP、策略决定、工具回执与下游读回;若任何一层无法证明,结论保持 blocked,不以模型解释替代。

36. 停机开关

独立运维开关关闭服务器、任务与凭据后,所有高风险请求快速失败并有可审计原因。保存 HTTP、策略决定、工具回执与下游读回;若任何一层无法证明,结论保持 blocked,不以模型解释替代。

官方证据图:当前 MCP 授权安全要求

Model Context Protocol 官方授权安全页面展示令牌受众绑定与禁止令牌透传等要求
Model Context Protocol 官方规范必要局部,访问于 2026 年 10 月 6 日。官方展示不等于本站完成任何 MCP 产品实测。

这张证据图只证明当前官方规范明确讨论令牌受众绑定、资源参数、令牌透传等授权安全要求。它不能证明某个 SDK、客户端、服务器或身份提供商已经正确实现,也不能替代本文三十六项运行时测试。

当前来源与适用边界

本文没有登录任何真实企业 MCP 环境,没有处理生产令牌、客户数据或医疗信息,也没有把规范或厂商页面写成本站实测。官方要求、第三方安全建议、论文实验和兰塞 AI 编辑推断均分别标明;读者应按自己的 SDK、身份提供商、代理、工具和下游系统复验。

与站内相邻任务怎样分工

核验日期与可证明范围

本文于 2026 年 10 月 6 日复核公开资料。规范页面、GitHub pushed_at、页面哈希与监控信号只能帮助发现变化,不能证明任一部署已实现;HTTP 与浏览器回执只能证明当时指定身份取得指定页面;sitemap、llms.txt 与 IndexNow 只能证明站内成员关系或通知请求被接受。它们都不证明抓取完成、搜索收录、排名、展现、点击、CTR、真实访问、用户或转化。任何 MCP Server、SDK、身份提供商、工具、模型、提示、网络、代理、下游 API 或数据等级变化,都应重跑受影响的正常任务、负向用例、撤销与回滚。没有原始回执、版本和责任人的结论不得沿用到下一次发布,缺少依据就冻结。