[Bug] Server crashes with anyio.ClosedResourceError when receiving raw invalid UTF-8 bytes

当 MCP Python SDK 服务器(如 mcp_server_fetch )通过 stdio 接收来自客户端的 JSON-RPC 请求时,如果请求参数中包含原始的无效 UTF-8 字节(如 b"http://x\xff\xfe" ),服务器会崩溃并抛出 anyio.ClosedResource

快速结论:此报错发生在 MCP Python SDK 服务器收到包含原始无效 UTF-8 字节的请求时。优先排查服务端版本是否已升级到 v1.27 或更高版本,该版本已修复此问题。

问题场景

当 MCP Python SDK 服务器(如 mcp_server_fetch)通过 stdio 接收来自客户端的 JSON-RPC 请求时,如果请求参数中包含原始的无效 UTF-8 字节(如 b"http://x\xff\xfe"),服务器会崩溃并抛出 anyio.ClosedResourceError。攻击者可以利用此漏洞通过单个恶意请求对任何使用该 SDK 的 MCP 服务器进行拒绝服务攻击。

报错原文

File "...\mcp\server\lowlevel\server.py", line 781, in _handle_request
    await message.respond(response)
File "...\mcp\shared\session.py", line 349, in _send_response
    await self._write_stream.send(session_message)
File "...\anyio\streams\memory.py", line 218, in send_nowait
    raise ClosedResourceError
anyio.ClosedResourceError

原因分析

服务器在处理无效 UTF-8 字节的请求时,json.loads 解析原始字节会失败。但问题并非解析失败本身,而是后续响应写入时,客户端连接已因解析异常而关闭,导致 _write_stream.send() 在写入已关闭的流时抛出 ClosedResourceError。服务器未捕获此异常,进而崩溃。

注意:字符串形式的无效 UTF-8(如 "http://x[0xff][0xfe]")会被正常处理并返回验证错误,不会触发此崩溃。

环境排查

  • MCP Python SDK 版本:确认是否低于 v1.27(受影响版本包括 v1.26.0 等)
  • Python 版本:已确认在 Python 3.13 上复现
  • 操作系统:已在 Windows 11 上复现

解决步骤

  1. 升级 MCP Python SDK 至 v1.27 或更高版本。该版本已通过 PR #2334 合并了修复,服务器在响应时捕获 ClosedResourceError/BrokenResourceError,并在传输关闭时取消正在处理的操作,而不是直接崩溃。
  2. 或者使用包含修复的 main 分支版本(PR #2306)。该版本还解决了 stdio 非 UTF-8 输入的优雅处理问题。
  3. 作为临时缓解措施,可考虑在服务器外层添加异常捕获逻辑,捕获 ClosedResourceError 后优雅关闭连接。

验证方法

升级后,使用 PoC 脚本重新测试:

python crash_poc.py | python -m mcp_server_fetch

如果服务器不再崩溃,且返回 JSON-RPC 错误响应(如无效参数错误),则修复生效。

参考来源

modelcontextprotocol/python-sdk #2328

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 18318

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注