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

MCP Go SDK 的 CSRF:一个网页就能触发你的本地工具(CVE-2026-33252)

官方 MCP Go SDK 接受浏览器的跨站 POST 请求却不校验 Origin 头。在无鉴权的本地服务器上,你访问的任何网站都可能调用你的工具。已在 1.4.1 修复。

2026-06-19 // 5 min affects: mcp-go-sdk, local-mcp-servers, tool-calling-agents

这是什么?

CVE-2026-33252Model Context Protocol 官方 Go SDKgithub.com/modelcontextprotocol/go-sdk)中的跨站请求伪造(CSRF,CWE-352)漏洞。GitHub 安全公告 GHSA-89xv-2j6f-qhc82026 年 3 月 19 日发布,该 CVE 于 2026 年 3 月 24 日录入 NVD,评分 7.1(高危)。修复随 v1.4.1 发布;漏洞由 Lê Minh Quân 报告。

简而言之:在 v1.4.1 之前,该 SDK 的 Streamable HTTP 传输会接受浏览器生成的跨站 POST 请求,既不校验 Origin 头,也不要求 Content-Type: application/json。在一个无鉴权运行的本地 MCP 服务器上——这在开发和桌面智能体场景中极为常见——用户访问的任何网站都能向该服务器发送 MCP 请求,并可能触发工具执行。我们报道它,是因为它是 2026 年一个系统性问题的干净且已修复的样本:本地 MCP 服务器把环回接口当作信任边界,而浏览器会悄无声息地穿透它。

工作原理

浏览器的同源策略通常会阻止 evil.example 上的页面读取 127.0.0.1 的响应。但所谓的「简单请求」——即 Content-Type 属于 CORS 安全列表(例如 text/plain)的请求——会在不触发 CORS 预检的情况下被发送出去。攻击者根本不需要读取响应,只需让请求到达即可。

受害者打开攻击者页面             ──►  fetch("http://127.0.0.1:<port>/mcp",
(普通浏览器)                         { method: "POST",
                                        headers: { "Content-Type": "text/plain" },
                                        body: <MCP JSON-RPC: tools/call ...> })

本地 MCP 服务器(1.4.1 之前):
  - 不校验 Origin                ──►  请求被接受
  - 不强制 Content-Type          ──►  请求体被解析为 MCP 消息
  - 不要求鉴权                   ──►  工具被调用

由于服务器不检查请求来源,跨站 POST 与合法的本地客户端无从区分。其影响被评为完整性高、机密性无CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:H/A:L):攻击者能引发动作(工具调用),但无法跨源直接读取响应。所需的用户交互仅仅是「访问一个页面」。本文不复现任何 payload——机制本身才是要点,它与普通 Web CSRF 形态完全一致,只是应用到了智能体的工具层。

这并非孤例。同样的「缺失来源校验」模式还催生了 CVE-2026-34742(同一 Go SDK 中的 DNS 重绑定)、CVE-2026-35568(MCP Java SDK),以及更早的微软 Playwright MCP 服务器 中的 CVE-2025-9611。传输不同,根因相同——参见我们关于针对 localhost MCP 服务器的 DNS 重绑定的分析。

为什么重要

本地 MCP 服务器很少是个空壳玩具。它通常连着文件系统、shell、云 CLI、代码仓库或数据库——这正是给智能体配工具的意义所在。当一个网站能够触达该服务器并调用这些工具时,浏览器就成了通往主机的外泄与动作通道。前置条件平淡无奇:服务器监听环回地址、无鉴权运行(在「只在我本机上」的配置里很常见),而开发者又在同一会话里上网。这一组合描述了 2026 年相当一部分智能体开发工作站的现状。

对任何部署或运营 MCP 的人来说,更普遍的教训是:环回不等于鉴权127.0.0.1 能挡住远程网络对端,但对运行在同一台机器上的浏览器毫无作用——浏览器是一个功能完备的 HTTP 客户端,攻击者页面让它指向哪里它就指向哪里。再叠加 MCP 暴露面的实测数据——40% 的远程 MCP 服务器无鉴权运行——来源校验就不再是可有可无的细节。

防御

打补丁是必要的,但真正保护你的是架构。

  1. 升级并启用保护。 迁移到 go-sdk v1.4.1+(要求 Go 1.25+)。修复为 POST 请求加入了 Content-Type 校验,以及一个可配置的来源校验——请把它打开。强制要求 Content-Type: application/json,并拒绝 Origin/Host 不在预期本地白名单内的请求。

  2. 即使在 localhost 也要鉴权。 不要运行无状态、无会话且无鉴权的 MCP 服务器。一个浏览器无法猜出的 bearer 令牌或会话密钥,能把顺手的偷渡式工具调用变成一次失败的请求。

  3. 既校验 Host 也校验 OriginHost 头的校验(拒绝任何与预期环回值不符的 Host)能化解相关的 DNS 重绑定变体——即使浏览器被诱导访问 127.0.0.1,服务器也会返回 403。

  4. 把浏览器当作近邻攻击者。 对开发用 MCP 服务器做网络隔离、监听随机高位端口,并把高影响工具(shell、写文件、部署、支付)置于显式的人工审批之后。一次「困惑代理」式的工具调用,应该在触及任何不可逆操作之前就撞上一堵墙。

状态

项目
CVECVE-2026-33252(GHSA-89xv-2j6f-qhc8)
组件官方 MCP Go SDK,Streamable HTTP 传输
受影响< 1.4.1
已修复1.4.1(要求 Go 1.25+);提交 a433a83
严重性7.1 高危 — CWE-352(CSRF)
披露公告 2026-03-19 · NVD 2026-03-24
相关CVE-2026-34742(Go DNS 重绑定)、CVE-2026-35568(Java SDK)、CVE-2025-9611(Playwright MCP)

Sources