【漏洞】CVE-2026-33032:nginx-ui MCP 接口未授权接管深度分析
nginx-ui 是一个为 Nginx Web 服务器提供图形化管理界面的开源项目。本次漏洞出在 nginx-ui 的MCP(Model Context Protocol)集成模块。端点认证要求/mcpIP 白名单 + 身份认证(AuthRequired) ✅仅 IP 白名单 ⚠️缺少中间件。问题二:IP 白名单默认值为空,代码将空列表视为"允许所有"。两个端点最终调用同一个处理器——攻击者绕过了
CVE-2026-33032:nginx-ui MCP 接口未授权接管深度分析
CVE ID:CVE-2026-33032
严重程度:严重(CVSS 9.8)
CWE:CWE-306(关键功能缺失认证)
影响版本:nginx-ui ≤ 2.3.5
披露时间:2026-04-16
利用门槛:低,网络可达即可
补丁状态:截至披露时尚无公开补丁
一、漏洞概述
nginx-ui 是一个为 Nginx Web 服务器提供图形化管理界面的开源项目。
本次漏洞出在 nginx-ui 的 MCP(Model Context Protocol)集成模块。该模块暴露了两个 HTTP 端点:
| 端点 | 认证要求 |
|---|---|
| /mcp | IP 白名单 + 身份认证(AuthRequired) ✅ |
| /mcp_message | 仅 IP 白名单 ⚠️ |
问题一:/mcp_message 缺少 AuthRequired() 中间件。
问题二:IP 白名单默认值为空,代码将空列表视为"允许所有"。
两个端点最终调用同一个 mcp.ServeHTTP(c) 处理器——攻击者绕过了 /mcp 的身份认证,直接通过 /mcp_message 调用所有高权限 MCP 工具。
最终效果:任何网络可达的攻击者,无需任何凭据,即可接管整台服务器的 Nginx 服务。
二、漏洞根因分析
2.1 代码层面:路由注册不对称
来自 mcp/router.go:
func InitRouter(r *gin.Engine) {
// /mcp 有两层保护
r.Any("/mcp", middleware.IPWhiteList(), middleware.AuthRequired(),
func(c *gin.Context) { mcp.ServeHTTP(c) })
// /mcp_message 缺少 AuthRequired()
r.Any("/mcp_message", middleware.IPWhiteList(),
func(c *gin.Context) { mcp.ServeHTTP(c) })
}
两个路由都指向同一个 mcp.ServeHTTP(),但安全保护层级完全不同。典型的认证不对称漏洞模式。
2.2 白名单设计:Fail-Open 陷阱
来自 internal/middleware/ip_whitelist.go:
func IPWhiteList() gin.HandlerFunc {
return func(c *gin.Context) {
clientIP := c.ClientIP()
// 空列表 → 放行所有请求
if len(settings.AuthSettings.IPWhiteList) == 0
|| clientIP == "127.0.0.1" || clientIP == "::1" {
c.Next()
return
}
}
}
初始化时 AuthSettings.IPWhiteList 为 nil(空切片),默认策略变成"全部放行"。正确的设计应该是:空白名单 = 拒绝所有(Fail-Closed)。
2.3 可被未授权调用的 MCP 工具清单
| 工具 | 功能 |
|---|---|
| restart_nginx | 重启 Nginx 进程 |
| reload_nginx | 重新加载 Nginx 配置 |
| nginx_status | 读取 Nginx 状态 |
| 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 | 获取配置目录路径 |
三、攻击路径与危害场景
3.1 攻击前提
- 攻击者网络可达 nginx-ui 管理端口(默认 9000)
- 服务器未修改 IP 白名单配置(默认状态)
- 无需任何账号密码
3.2 攻击流程
步骤1: POST /mcp_message(无需认证)
步骤2: 调用 nginx_config_add 写入恶意配置文件
步骤3: nginx 自动 reload(代码内置 reload 逻辑)
步骤4: Nginx 被攻击者完全控制
配置文件写入部分代码(mcp/config/config_add.go):
err := os.WriteFile(path, []byte(content), 0644) // 写入配置
res := nginx.Control(nginx.Reload) // 立即 reload
写文件 + 自动 reload 在同一流程中,无需攻击者额外触发。
3.3 实际危害场景
① 流量劫持(最高危)
攻击者可写入配置,将所有经过 Nginx 的请求代理到自己的服务器,截获 Authorization Token、Cookie、用户凭据等敏感数据。
② 服务中断(DoS)
写入无效配置并触发 reload,直接让 Nginx 下所有站点下线。
③ 配置信息泄露
通过 nginx_config_get 读取 nginx.conf,获取后端拓扑、上游服务器地址、证书路径、内部认证 Header 配置。
④ 凭据窃取升级
通过注入 access_log 指令,捕获管理员访问 nginx-ui 时的 Authorization Header,实现对 REST API 的进一步凭据窃取。
四、漏洞复现原理(无害检测思路)
⚠️ 以下为漏洞原理说明,请勿用于未授权渗透测试
攻击者向 /mcp_message 发送如下 JSON-RPC 请求即可触发配置写入:
POST /mcp_message HTTP/1.1
Host: target:9000
Content-Type: application/json
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "nginx_config_add",
"arguments": {
"name": "evil.conf",
"content": "# malicious config",
"base_dir": "conf.d",
"overwrite": true
}
},
"id": 1
}
无需任何 Authorization Header,响应成功后 Nginx 已自动 reload。
五、修复方案
5.1 临时缓解措施
① 配置 IP 白名单(只允许可信 IP 访问管理端口):
// settings/auth.go
AuthSettings: {
IPWhiteList: ["10.0.0.0/8", "192.168.0.0/16"] // 仅内网 IP
}
② 网络层隔离:将 nginx-ui 管理端口 9000 仅对内网暴露,禁止公网访问。
③ 添加认证保护(推荐):为 /mcp_message 路由补上 AuthRequired() 中间件:
r.Any("/mcp_message", middleware.IPWhiteList(), middleware.AuthRequired(),
func(c *gin.Context) { mcp.ServeHTTP(c) })
5.2 根本修复建议
- IP 白名单改为 Fail-Closed 逻辑:空白名单应默认拒绝,而非允许所有
- 建议官方在后续版本中将
AuthRequired()补全到/mcp_message路由 - 配置文件写入操作建议加入二次确认机制
六、检测与排查
资产排查:是否在用 nginx-ui,版本是否 ≤ 2.3.5
# 查看 nginx-ui 版本
nginx-ui --version
# 查看进程
ps aux | grep nginx-ui
日志排查(检查是否已被利用):
# 检查 conf.d 目录异常文件
ls -la /etc/nginx/conf.d/
# 检查 nginx 访问日志异常来源
tail -n 1000 /var/log/nginx/access.log | grep ":9000"
七、总结
| 项目 | 详情 |
|---|---|
| 漏洞本质 | MCP 接口 /mcp_message 缺少身份认证(+ IP 白名单默认全放行) |
| 严重程度 | 严重(CVSS 9.8),可未授权完全接管 Nginx 服务 |
| 影响范围 | nginx-ui ≤ 2.3.5 |
| 利用难度 | 极低,无需任何凭据,网络可达即可 |
| 修复难度 | 低,官方仅需补一行中间件 |
| 是否已有补丁 | 截至披露时尚无公开补丁,建议手动修复 |
安全建议:这是典型的"功能优先、安全靠后"设计问题。MCP 工具设计得越强大,安全边界就越需要严密。此类管理接口应始终默认使用 Fail-Closed 策略,并强制所有端点路径应用相同的认证要求。
标签:nginx-ui、CVE、安全漏洞、认证绕过、Nginx
分类:Web 安全 / 漏洞分析 / 渗透测试
`
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)