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 安全 / 漏洞分析 / 渗透测试

`

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐