MCPwn (CVE-2026-33032):nginx-ui 的 MCP 接口拱手让出整个 Web 服务器
nginx-ui ≤ 2.3.3 的一个未鉴权 MCP 接口允许任意网络攻击者改写 nginx 配置并重启服务。CVSS 9.8,2026 年 4 月 15 日公开披露,补丁发布数小时内就在野利用。
这是什么?
CVE-2026-33032,被 Pluto Security 命名为 MCPwn,是 nginx-ui 中的一个关键身份验证绕过漏洞。nginx-ui 是用于管理 nginx 服务器的最流行的开源 Web 界面。该漏洞位于项目近期新增的 Model Context Protocol(MCP) 集成中:两个 MCP HTTP 接口中的一个在注册时缺少了保护其他所有管理路由的身份验证中间件。
该漏洞由 Pluto Security 于 2026 年 3 月 4 日发现,3 月 14 日报告给维护者,并于第二天的 2.3.4 版本(2026 年 3 月 15 日)中修复。Pluto 于 2026 年 4 月 15 日发布技术分析,该 CVE 于 2026 年 4 月 13 日被列入 VulnCheck KEV(已知被利用漏洞)目录,Recorded Future、BleepingComputer 和 eSentire 等多家厂商证实,自 3 月下旬起就观察到野外的主动利用,而那时大多数运维方还没来得及部署补丁。CVSS 评分为 9.8(严重)。
工作原理
nginx-ui 添加 MCP 支持以便向 LLM agent 暴露其管理操作时,在路由器上声明了两个 HTTP 接口:
POST /mcp—— 由 IP 白名单 和AuthRequired()中间件共同保护POST /mcp_message—— 仅由 IP 白名单保护
两个接口接受相同的 MCP 工具调用载荷。第二个接口仅仅是在路由注册时漏掉了一行:
// 易受攻击的路由注册概念示意,基于 2026 年 4 月 15 日的公开
// 披露和补丁提交 413dc63。此处不复现任何针对实际系统的
// payload。
// 易受攻击版本 (nginx-ui ≤ 2.3.3)
r.POST("/mcp", middleware.IPWhiteList(), middleware.AuthRequired(), mcp.Handle)
r.POST("/mcp_message", middleware.IPWhiteList(), mcp.Handle)
// ^^^^^^^^^^^^^^^^^^^^^^^^^
// 此处缺少 AuthRequired()
// 修复版本 (nginx-ui ≥ 2.3.4)
r.POST("/mcp", middleware.IPWhiteList(), middleware.AuthRequired(), mcp.Handle)
r.POST("/mcp_message", middleware.IPWhiteList(), middleware.AuthRequired(), mcp.Handle)
第二道防线 —— IP 白名单 —— 救不了部署,因为默认的 IP 白名单是空的,而中间件将空列表当作 允许全部 而非 拒绝全部。所有安装了 nginx-ui 却没有手动编辑白名单的运维人员,等于把未鉴权接口暴露给了服务能被访问到的所有网络。
由于 mcp_message 接受完整的 MCP 工具集,后果不止于信息泄露。未鉴权的调用方可以调用一系列工具来创建、修改或删除 nginx 配置文件,触发自动配置重载,并重启 nginx 服务 —— 教科书式的 Web 服务器完全接管。Pluto 用两个 HTTP 请求就演示了这条利用链。
为何重要
就公开报道所能见到的范围而言,MCPwn 是第一个被广泛利用、专门针对 Model Context Protocol 攻击面的 CVE —— 不是某个恰好落在 LLM 技术栈里的通用 Web 漏洞。这条易受攻击的路由之所以存在,正是因为项目决定通过 MCP 把管理操作开放给 AI agent;而身份验证缺口就坐落在 MCP 路由层本身。
这种模式将会反复出现。MCP 服务器正以远超其身份验证模型成熟度的速度,进入开发者工具、可观测性栈、工单系统、IDE 和基础设施仪表板。Anthropic 的 MCP 规范在传输、认证和发现方面留下了较多自由空间,具体实现必须自己把这些零件接起来。nginx-ui 项目在其历史管理路由上做得都没错 —— 回归只出现在后期添加、审查不那么仔细的 MCP 路由上。
另一个教训关乎默认值。一份把空值解释为”放行所有人”的 IP 白名单,是每一位管理员迟早都会踩到的雷。任何旨在限制访问的控制项,默认拒绝 都是唯一安全的选择。
防御
立刻将 nginx-ui 升级到 2.3.4 或更高版本。 补丁(commit 413dc63)为 /mcp_message 加上了 middleware.AuthRequired(),并附带回归测试,确保 /mcp 和 /mcp_message 在未鉴权时都返回 HTTP 403。自 2026 年 3 月下旬以来已确认存在主动利用;请假设任何未打补丁、可从公网访问的 nginx-ui 实例都已被触碰,并据此审计配置变更历史。
如果暂时无法升级,Pluto Security 的安全公告给出了两个临时方案:手动给 /mcp_message 路由加上 middleware.AuthRequired(),或调整 IP 白名单的语义,让空列表表示 拒绝全部。任何一种都比放任接口暴露要好。
在反向代理处屏蔽 MCP 接口,直到打完补丁。一条短短的 NGINX 或 Envoy 规则,对 POST /mcp 和 POST /mcp_message 返回 403,就足以在升级期间挡住几个小时。
审计您其他 MCP 服务器是否存在同类问题。 这种模式 —— 在历史路由旁新增管理性 MCP 路由,只有一部分加上鉴权中间件 —— 具有普遍性。逐条路由检查:对清单中的每一台 MCP 服务器,列出所有已注册的接口,确认每个都被身份验证中间件包裹,并写一条测试,要求未鉴权调用必须返回 401/403。把 MCP 路由当作生产级管理界面,而不是 debug 附加项。
把安全决策从可选启用的 IP 白名单上拿下来。 任何”缺省即放行”的控制都是迟早会出问题的回归。默认拒绝,显式放行。
监控您日志中针对 /mcp_message 的未鉴权 POST 请求,特别是载荷中引用了 config_file、restart_nginx 或 reload_config 等工具调用的情况。成功利用会在 nginx-ui 的请求日志和 nginx 自身的重载事件中留下明显痕迹。
状态
| 项目 | 参考来源 | 日期 | 备注 |
|---|---|---|---|
| 发现 | Pluto Security | 2026-03-04 | 内部 MCP 路由审计 |
| 上游报告 | 通知 nginx-ui 维护者 | 2026-03-14 | 协调披露 |
| 修复版本发布 | nginx-ui 2.3.4(commit 413dc63) | 2026-03-15 | 添加 AuthRequired() + 回归测试 |
| 观察到主动利用 | Recorded Future | 2026-03(下旬) | 补丁发布数日内 |
| 加入 VulnCheck KEV | VulnCheck | 2026-04-13 | 已知被利用 |
| 公开披露 | Pluto Security 公告 + Rapid7 ETR | 2026-04-15 | ”MCPwn”,CVSS 9.8 |
| 受影响版本 | nginx-ui ≤ 2.3.3(CVE 记录:≤ 2.3.5) | — | 请对照您所安装的版本 |
| 已修复版本 | nginx-ui ≥ 2.3.4 | — | 升级并审计历史配置 |
要点不是 MCP 本身不安全,而是 MCP 接口继承了承载它的主机所有 Web 应用安全义务,而 agent 集成的赶工正在那些尚未被人扫描的地方,生产出经典的 Web 漏洞。请先给 nginx-ui 打补丁,然后审视您 MCP 集群的其余部分,免得别人抢先动手。
Sources
- → https://thehackernews.com/2026/04/critical-nginx-ui-vulnerability-cve.html
- → https://www.rapid7.com/blog/post/etr-cve-2026-33032-nginx-ui-missing-mcp-authentication/
- → https://www.picussecurity.com/resource/blog/cve-2026-33032-mcpwn-how-a-missing-middleware-call-in-nginx-ui-hands-attackers-full-web-server-takeover
- → https://pluto.security/blog/mcp-bug-nginx-security-vulnerability-cvss-9-8/
- → https://www.bleepingcomputer.com/news/security/critical-nginx-ui-auth-bypass-flaw-now-actively-exploited-in-the-wild/
- → https://securityaffairs.com/190841/hacking/cve-2026-33032-severe-nginx-ui-bug-grants-unauthenticated-server-access.html