MCP Go SDK 的 CSRF:一个网页就能触发你的本地工具(CVE-2026-33252)
官方 MCP Go SDK 接受浏览器的跨站 POST 请求却不校验 Origin 头。在无鉴权的本地服务器上,你访问的任何网站都可能调用你的工具。已在 1.4.1 修复。
这是什么?
CVE-2026-33252 是 Model Context Protocol 官方 Go SDK(github.com/modelcontextprotocol/go-sdk)中的跨站请求伪造(CSRF,CWE-352)漏洞。GitHub 安全公告 GHSA-89xv-2j6f-qhc8 于 2026 年 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 服务器无鉴权运行——来源校验就不再是可有可无的细节。
防御
打补丁是必要的,但真正保护你的是架构。
-
升级并启用保护。 迁移到 go-sdk v1.4.1+(要求 Go 1.25+)。修复为 POST 请求加入了
Content-Type校验,以及一个可配置的来源校验——请把它打开。强制要求Content-Type: application/json,并拒绝Origin/Host不在预期本地白名单内的请求。 -
即使在 localhost 也要鉴权。 不要运行无状态、无会话且无鉴权的 MCP 服务器。一个浏览器无法猜出的 bearer 令牌或会话密钥,能把顺手的偷渡式工具调用变成一次失败的请求。
-
既校验
Host也校验Origin。 对Host头的校验(拒绝任何与预期环回值不符的Host)能化解相关的 DNS 重绑定变体——即使浏览器被诱导访问127.0.0.1,服务器也会返回 403。 -
把浏览器当作近邻攻击者。 对开发用 MCP 服务器做网络隔离、监听随机高位端口,并把高影响工具(shell、写文件、部署、支付)置于显式的人工审批之后。一次「困惑代理」式的工具调用,应该在触及任何不可逆操作之前就撞上一堵墙。
状态
| 项目 | 值 |
|---|---|
| CVE | CVE-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
- → https://vulnerability.circl.lu/vuln/cve-2026-33252
- → https://nvd.nist.gov/vuln/detail/CVE-2026-33252
- → https://github.com/modelcontextprotocol/go-sdk/security/advisories/GHSA-89xv-2j6f-qhc8
- → https://www.vulncheck.com/advisories/microsoft-playwright-mcp-server-dns-rebinding-via-missing-origin-header-validation