近日,开源 Nginx 管理工具 nginx-ui 中被发现存在一个评级为 9.8 的关键安全漏洞(CVE-2026-33032)。该工具在 GitHub 上已收获超过 11K 星标,Docker 拉取量超过 43 万次。漏洞目前已在野外被积极利用,攻击者能够借此完全控制 Nginx 服务器。
场景理解
nginx-ui 使用了 mcp-go 库中的 SSE 传输,涉及两个关键端点:
GET /mcp – 建立持久化的 Server-Sent Events 连接,用于接收 JSON-RPC 响应并启动会话。
POST /mcp_message – 用来向 MCP 服务器发送工具调用命令。
当客户端通过 GET /mcp 打开流时,服务器返回一个会话 ID:
data: /mcp_message?sessionId=9a7f3d21-6c5e-4b8a-9d72-3f1e8c4b2a11
之后,客户端向 /mcp_message 端点 POST 携带有效 sessionId 的请求来调用工具,响应则通过 SSE 流回传。这套流程中,nginx-ui 使用 node_secret 对 MCP 连接进行身份验证。
看上去一切正常?问题就出在这里。
理解安全漏洞
观察路由初始化代码可以发现端倪:
// Vulnerable Code
func InitRouter(r *gin.Engine) {
r.Any(
"/mcp",
middleware.IPWhiteList(),
middleware.AuthRequired(),
func(c *gin.Context) {
mcp.ServeHTTP(c)
},
)
r.Any(
"/mcp_message",
middleware.IPWhiteList(),
func(c *gin.Context) {
mcp.ServeHTTP(c)
},
)
}
/mcp 端点受到 middleware.AuthRequired() 保护,但 /mcp_message 却没有任何身份校验。而 mcp.ServeHTTP() 负责处理所有 MCP 工具调用,这就意味着任何人在未认证的情况下都能通过 /mcp_message 端点直接执行工具。
虽然 /mcp_message 套了一层 middleware.IPWhiteList(),但这一层唯一的保护自身也存在致命缺陷:
// internal/middleware/ip_whitelist.go:11-26 - Empty whitelist allows all
func IPWhiteList() gin.HandlerFunc {
return func(c *gin.Context) {
clientIP := c.ClientIP()
if len(settings.AuthSettings.IPWhiteList) == 0 || clientIP == "" || clientIP == "127.0.0.1" || clientIP == "::1" {
c.Next()
return
}
// ...
}
}
当 IPWhiteList 为空时,白名单校验彻底失效,所有请求都会被放行。而在默认安装中,IPWhiteList 正好就是空的——这是一个典型的“失效开放”设计。
综上,只要白名单为空,下面列出的 12 个 MCP 工具就可以在没有身份验证的情况下被攻击者随意调用。
可用的 MCP 工具
来自 mcp/nginx/:
restart_nginx – 重启 Nginx 进程
reload_nginx – 重新加载 Nginx 配置
nginx_status – 读取 Nginx 状态
来自 mcp/config/:
nginx_config_add – 创建新的 Nginx 配置文件
nginx_config_modify – 修改现有配置文件
nginx_config_list – 列出所有配置
nginx_config_get – 读取配置文件内容
nginx_config_enable – 启用/禁用站点
nginx_config_rename – 重命名配置文件
nginx_config_mkdir – 创建目录
nginx_config_history – 查看配置历史
nginx_config_base_path – 获取 Nginx 配置目录路径
影响
- 完全控制 Nginx 服务:攻击者可以在配置目录内任意创建、修改和删除 Nginx 配置文件,这些操作会立即触发重载或重启。
- 凭证窃取:通过将流量代理到攻击者控制的端点,可窃取凭证、会话令牌以及其他敏感数据。
- 拒绝服务:写入无效的配置文件会导致 Nginx 重启失败,服务完全中断。
- 权限提升:攻击者可以注入包含自定义
log_format 的 access_logs 指令来捕获 Authorization 头部,进而获取 REST API 的访问权限。
全球范围内暴露的 Nginx 实例数量如下,其中多数集中在中国、美国、印度尼西亚、德国和香港。

现在该怎么做?
CVE-2026-33032 已在野外被积极利用。如果你正在运行易受攻击的版本,务必立即采取行动。
如果你正在使用启用了 MCP 的 nginx-ui:
- 立即更新到
v2.3.4 或更高版本
- 若无法立即更新,请立刻禁用 MCP,或紧急将可信主机添加到 IP 白名单,切勿将白名单留空
修复
该漏洞在 2026 年 3 月 15 日发布的 v2.3.4 中得到修复——修复方式正是为 /mcp_message 端点补上缺失的身份验证。
修复后的代码长这样:
// Patched code
r.Any(
"/mcp_message",
middleware.IPWhiteList(),
middleware.AuthRequired(),
func(c *gin.Context) {
mcp.ServeHTTP(c)
},
)