57 个 MCP 服务探测揭示匿名访问边界
作者称对官方注册表中57个 Streamable HTTP 服务进行被动探测,发现37%允许匿名握手,其中76%无需初始化即可列出工具。文章提供原始数据和复现脚本,但工具清单可见本身不能证明敏感操作也可匿名执行。
AI 深度解读
57 个在官方 MCP registry 中声明提供 Streamable HTTP 端点的服务器,有 37% 在零认证条件下完成了握手。这是 Correctover 作者 Guigui Wang 于 2026-11-12 发布的审计结果。但文章更想追问的是:即使加了认证,服务器是否真的知道当前会话属于谁?
作者把问题分成两层:公开端点没有认证,以及会话没有绑定认证身份。前者是部署缺口,后者涉及协议与 SDK 的设计。对正在接入 MCP 的程序员,这个区分比一个吓人的百分比更有用。
37% 没有认证,究竟暴露了什么
作者对 57 个服务器进行了被动探测,每个端点只发送一次无害的 initialize 请求,不做注入、不改变状态。所有请求都带有 X-Audit-By: Correctover 请求头,并提供原始数据与可重放脚本。
其中,37% 无需认证即可完成握手。在这些无需认证的端点中,76% 还会向根本没完成协议握手的调用方返回完整工具清单。注意分母:76% 指向前面那组端点,并非全部 57 个服务器。
一个广告技术端点公开了 35 个账户级工具,涉及邮箱列表、账户查询、营销活动管理,通过一条 curl 请求就能发现。
工具清单不同于普通网页目录:它是 Agent 可以读取并据此发起调用的接口说明。不过,发现工具清单,不等于已经证明所有工具都能越权执行。 原文公开探测证明了握手和工具发现缺少认证,没有逐一展示这些账户工具的执行结果。
有了 token,为什么还可能进入别人的会话
作者随后在自建目标上,使用自己的 token 和会话,对官方 TypeScript SDK 做了受控实验。这部分与前面的公开端点探测应分开看。
实验中,攻击方持有一个有效 token,再配上泄露的受害者 session ID,就能让工具在受害者会话内执行;发送 DELETE 还能终止该会话,此后受害者使用自己的有效 token,也只会得到 404。
这里有两个前提:攻击方已有有效 token,并且拿到了受害者 session ID。原文没有说明真实环境中 session ID 的泄露频率。
作者称之为 Session-as-Identity antinomy,即「把会话当作身份」的矛盾。session ID 原本回答「请求进入哪个上下文」,认证主体回答「请求是谁发的」。只检查会话字符串是否存在,却不核对它归谁所有,就可能允许合法登录者进入别人的上下文。
认证通过,只能证明调用方有身份;会话归属还需要单独验证。
修复方向分两层,不能只等协议升级
作者指出,2025-06-18 版规范没有要求把会话绑定到认证主体,参考实现则通过字符串相等来验证会话。文章还援引 Ruby SDK 的一个 CVE,以及已合并并进入 Final 状态的 SEP-2567,说明上游已经认识到这类问题;但没有给出 CVE 编号和受测 SDK 版本。
两项协议提案走的是不同路线:SEP-2567 移除会话,采用 sessionless MCP;SEP-1299 保留会话并绑定身份。按作者的判断,两条路线都能处理上述矛盾。
对运营方,文章建议在 MCP 端点前配置 OAuth,并提供 RFC 9728 发现机制;保留会话时,把 session ID 当作绑定认证主体的能力凭证处理。
作者也发现了一个正确实现:它能妥善验证伪造和缺失的 session ID。因此,问题并非无法修复。只是无论移除会话还是绑定身份,都不能替运营方把认证真正打开。
我的判断
这篇最有价值的地方,是把「有没有认证」和「认证后有没有核对会话归属」拆开了。常见的只测一次 token 能否访问接口,覆盖不了后一个问题。
但 37% 只能描述这批受测端点,不能直接推广到所有 MCP 服务。原文没有交代抽样代表性、各端点是否原本就打算公开,也没有提供足够信息让读者判断 SDK 实验覆盖了哪些版本。公开只读工具与账户操作工具,风险也需要分别评估。
作者销售审计判定服务,存在商业动机;公开数据、重放脚本和错误日志则有助于外部核验。文章提出的机制问题有具体实验支撑,但不能据此认定所有使用官方 SDK 的部署都可以被相同方式利用。
能拿来做什么
- 维护 MCP 端点时,分别检查匿名 initialize、未握手获取工具清单、实际工具调用的认证要求,避免只验证正常客户端流程。
- 自建 Node MCP 服务时,用两组自己的测试身份交叉提交 token 与 session ID,同时检查工具执行和 DELETE 是否验证会话归属。
- 审查 Agent 接入的 MCP 服务时,把账户查询、邮箱和活动管理等工具列为重点,继续核实执行权限,别停在工具清单可见性上。
- 作者提供了号称 30 秒即可运行的 GitHub Action,可用于检查自己的服务;原文未贴出配置或命令,采用前应先核对脚本及判定规则。