系统:运行中
← 返回所有攻击
DATA LEAK MEDIUM NEW

复用 MCP 服务器实例会在客户端之间泄露数据

Model Context Protocol 官方 TypeScript SDK 的一处设计缺陷,会使共享的服务器或传输实例把某个客户端的工具结果、通知和 sampling 请求路由到另一个客户端。已在 1.26.0 修复。

2026-07-15 // 5 min affects: mcp-servers, modelcontextprotocol-sdk, llm-agents, multi-tenant-ai-platforms

这是什么?

2026 年 2 月 4 日,Model Context Protocol(MCP)官方 TypeScript SDK 的一位维护者发布了一则安全公告,披露 @modelcontextprotocol/sdk 中存在跨客户端数据泄露问题。这既不是恶意载荷,也不是注入,而是 SDK 在路由响应时的并发缺陷。当单个服务器实例或单个 HTTP 传输实例被多个已连接的客户端共享时,一个客户端可能收到本应发给另一个客户端的数据:工具结果、资源内容、进度通知,以及 sampling 或 elicitation 请求,都可能被投递到错误的连接上。

该公告影响 SDK 的 1.10.0 至 1.25.3 版本,并已在 1.26.0 中修复。它的评分为 7.1(高危),归类为竞态条件(CWE-362)。我们在此提示,是因为这种易受影响的写法——用单个服务器对象处理所有请求——恰恰是许多开发者初次搭建 MCP 服务器的方式,而 MCP 如今已成为 LLM 智能体与企业工具之间的连接组织。本文是防御性摘要,不复现任何漏洞利用,因为理解这一缺陷并不需要利用代码。

工作原理

公告描述了两个彼此相关但不同的问题,一次部署可能只受其一影响,也可能两者兼有。

第一个是传输复用。SDK 的流式 HTTP 传输在内部维护一张表,把 JSON-RPC 请求 ID 映射到等待该响应的 HTTP 流。MCP 客户端使用从零开始递增的计数器生成请求 ID。因此,两个各自独立连接的客户端都会发送 ID 012。若由单个传输实例为两者服务,第二个客户端的表项会覆盖第一个,响应便被写入错误的流。所有请求类型都会暴露——工具调用、资源读取、提示获取——且无需任何由服务器发起的功能即可触发。

第二个是服务器(协议)复用。当单个服务器对象连接到多个传输(每个客户端一个)时,协议层只保留一个指向”当前传输”的引用,每次新连接都会悄然将其覆盖。最终响应通常能正确路由,因为该引用在请求到达时即被捕获;但在处理过程中发送的一切——进度通知、发往模型的 sampling 调用、elicitation 提示,或服务器自发的通知——都经由这个共享引用发出,可能落到另一个客户端的连接上。

共同根因是缺乏按客户端隔离的共享可变状态,只有在并发下才会显现。最易暴露的配置是无状态(stateless)模式:服务器在不设会话生成器的情况下实例化,并在多次请求间复用以节省分配开销——这是一种常见的性能捷径,一旦两个用户同时活跃,就变成了数据边界的破裂。

为何重要

MCP 服务器越来越多地位于真实数据之前:文件存储、数据库、工单系统、内部 API,以及这些工具所携带的凭据。因此,一次错误路由的响应绝非表面瑕疵——它可能把某个租户的查询结果、文档内容或含敏感上下文的错误信息交给另一个租户。在多用户部署中,这跨越了运营方本以为由框架强制保障的安全边界。

暴露面之所以广,正是因为该缺陷位于参考 SDK 之中,而非某个单一产品。任何基于受影响版本、且服务并发客户端的托管 MCP 服务器都可能受影响,触发条件是普通负载,而非精心构造的攻击。所测得的利用概率较低,反映出攻击者无法可靠地选择自己能收到哪份数据;但在正常流量下租户之间的意外泄露,本身就是保密性与合规问题,与是否有人主动尝试利用无关。

防御

将 SDK 升级到 1.26.0 或更高版本。该修复并不掩盖竞态,而是把静默的错误路由转化为响亮而即时的错误——对已连接的协议再次连接会抛出异常,无状态传输拒绝处理超过一次请求——从而使错误配置以”失败即关闭”的方式暴露,而非泄露数据。

若无法立即升级,请为每个连接创建全新的服务器与传输实例。在无状态模式下,在请求处理函数内部实例化二者并在结束后销毁;在有状态模式下,以会话 ID 为键创建新的服务器与传输并按会话保存。如果你的工具在执行过程中会发送进度通知、sampling 或 elicitation,切勿在会话之间共享同一个服务器对象。

审查你的部署拓扑。请具体自问:是否有单个服务器或传输对象在请求间被复用,两个客户端是否可能同时在处理中?若是,则无论 SDK 版本如何,你都符合易受影响的写法,应确认运行时防护是否到位。

把租户间隔离当作需要验证的事项,而非默认假设。添加集成测试,让两个并发客户端穿过同一个服务器,并断言各自只收到属于自己的响应;同时加入遥测,以检测响应到达非预期会话的情况。这条通用教训超越了这一个 CVE:在智能体基础设施中,按客户端的状态必须在设计上就按客户端划分,而”复用对象以求更快”是一项数据边界决策,而不仅仅是性能决策。

状态

项目详情
组件@modelcontextprotocol/sdk(MCP TypeScript SDK)
公告GHSA-345p-7cg4-v4c7 / CVE-2026-25536,发布于 2026 年 2 月 4 日
受影响版本1.10.0 至 1.25.3
已修复1.26.0
类别竞态条件(CWE-362),跨客户端响应错误路由
严重程度7.1(高危);保密性影响高,利用概率低
在野利用无公开利用证据

Sources