直接答案:先把 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、是否过期和是否已撤销;下游调用还要区分服务器自身权限与用户委托权限。若服务器总用一个高权限服务账号执行,模型只要诱导出一个合法格式的请求,就可能越过用户原本没有的权限。身份表应记录主体、发行方、受众、资源、动作、租户、有效期和撤销入口,并在每次写操作回执中引用。

远程 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 的字段不能自动成为下一次调用指令。测试恶意网页要求读取密钥、工单正文伪造管理员批准、错误消息建议把令牌发送到诊断域名,以及一个工具返回诱导调用另一个高权限工具的跨服务器链。

提示注入的核心控制是来源—动作一致性
每次工具调用都回到用户原始任务:它要完成什么、允许读写哪些对象、允许把数据发到哪里、何时到期、哪些动作绝对禁止。外部内容只能提供事实候选,不能修改这些字段。策略层比较当前调用与任务合同,拒绝无因果关系的扩权。例如“总结一个网页”不需要读取本地密钥,“整理邮件”不需要向新域名上传附件,“查库存”不需要修改价格。模型给出的理由只是输入,最终裁决由确定性规则、身份系统和批准回执完成。
审批必须绑定参数哈希,而不是绑定一句自然语言
高风险工具先生成不可变预览:动作、最终资源、关键参数、将读取与发送的数据、预计副作用、回滚能力和到期时间。用户批准的回执包含参数规范化后的哈希、用户身份、客户端、服务器与工具版本。任何参数、重定向目标、数量、工具版本或数据摘要变化都使批准失效。不要把工具返回中的“管理员已批准”当作批准,也不要让模型自行勾选确认框。批量操作显示总数、筛选规则与代表样本;若实际匹配数变化,回到预览。
网络门禁要检查最终目标,而不是只检查输入 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 从可信身份上下文得到,所有数据库查询、对象存储路径、缓存键、任务队列、向量索引和日志关联都显式带租户边界。错误信息不能暴露另一个租户对象是否存在。后台任务在入队时固定租户与授权快照,执行时重新验证是否过期或撤销。工具列表如按角色过滤,调用时仍做同一权限检查,不能只靠隐藏工具名称。准备两个租户的相似对象与并发任务,验证读取、写入、搜索、缓存命中、导出、重试和回滚都不会跨界。
重放、重复调用与部分失败必须有确定性结果
写工具接收客户端生成或服务器颁发的幂等键,并把键与主体、工具、参数哈希和有效期绑定。重复请求返回原结果或明确冲突,不再次产生副作用。长任务使用可查询状态而不是让模型循环重试;取消语义说明是否仍可能完成。调用下游超时后,先查询业务状态再决定补偿或重试。测试在请求发送前、下游提交后、响应返回前和日志写入时分别注入故障,确认不会重复付款、发送、删除或创建,同时保留人工恢复入口。
速率、费用和资源预算防止模型把小错误放大
按用户、租户、工具和资源设置调用次数、并发、数据量、运行时间、外发字节与费用预算。预算由网关或服务器执行,不能只在提示中提醒模型。批量工具设单次上限和总任务上限,分页游标绑定任务与权限,防止模型拆分请求绕过。触发阈值后高风险动作拒绝,低风险读取可降级到缓存或人工队列。日志区分正常限流、异常循环、攻击探测和下游故障,避免自动重试在服务不可用时形成放大流量。

日志要可审计、可关联,但不能变成第二个泄露面
每次调用记录时间、关联 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 授权安全要求

这张证据图只证明当前官方规范明确讨论令牌受众绑定、资源参数、令牌透传等授权安全要求。它不能证明某个 SDK、客户端、服务器或身份提供商已经正确实现,也不能替代本文三十六项运行时测试。
当前来源与适用边界
- MCP 2026-07-28 授权规范:角色、受保护资源元数据、资源参数与发现流程。
- MCP 授权安全注意事项:受众绑定、PKCE、issuer、redirect URI 与通信安全。
- MCP 2026-07-28 规范发布说明:授权加固与迁移边界。
- Microsoft Learn:用 Entra ID 保护 MCP Server:HTTP 401、资源标识、aud 与令牌验证示例。
- OWASP MCP Security Cheat Sheet:最小权限、工具投毒、多服务器隔离、供应链、日志与提示注入。
- Zero-Trust Authorization and Discovery for Enterprise MCP:近期研究对逐工具发现与调用时权限执行的区分。
本文没有登录任何真实企业 MCP 环境,没有处理生产令牌、客户数据或医疗信息,也没有把规范或厂商页面写成本站实测。官方要求、第三方安全建议、论文实验和兰塞 AI 编辑推断均分别标明;读者应按自己的 SDK、身份提供商、代理、工具和下游系统复验。
与站内相邻任务怎样分工
- Agent 身份与授权指南负责工作负载身份、用户委托与逐工具权限设计。
- 间接提示注入威胁模型负责邮件、网页、文件和工具结果的来源—汇点测试。
- 智能体密钥保护指南负责沙箱、凭据代理、网络与命令审批。
- 模型 API 故障恢复指南负责请求 ID、有限重试、幂等、降级和回滚。
核验日期与可证明范围
本文于 2026 年 10 月 6 日复核公开资料。规范页面、GitHub pushed_at、页面哈希与监控信号只能帮助发现变化,不能证明任一部署已实现;HTTP 与浏览器回执只能证明当时指定身份取得指定页面;sitemap、llms.txt 与 IndexNow 只能证明站内成员关系或通知请求被接受。它们都不证明抓取完成、搜索收录、排名、展现、点击、CTR、真实访问、用户或转化。任何 MCP Server、SDK、身份提供商、工具、模型、提示、网络、代理、下游 API 或数据等级变化,都应重跑受影响的正常任务、负向用例、撤销与回滚。没有原始回执、版本和责任人的结论不得沿用到下一次发布,缺少依据就冻结。
