视频加载失败

CVE-2026-33032:Nginx UI MCP 未授权访问漏洞详解 (CVSS 9.8)

1417 字
7 分钟
CVE-2026-33032:Nginx UI MCP 未授权访问漏洞详解 (CVSS 9.8)

💬 联系方式 & 交流群

微信二维码

联系方式 & 交流群

  • 微信: gzs-47

进微信群请联系博主,各位觉得文章对你有帮助的话可否打赏一些呀~


漏洞等级: 🔴 CRITICAL (CVSS 9.8)
影响版本: Nginx UI ≤ 2.3.5
CVE 编号: CVE-2026-33032
CWE 编号: CWE-306 (关键功能缺少认证)
披露日期: 2026-03-30
最后更新: 2026-04-16


漏洞概述#

CVE-2026-33032 是 Nginx UI(Nginx 服务器的 Web 管理界面)中的一个严重未授权访问漏洞。攻击者可以利用该漏洞在无需任何身份认证的情况下,通过 MCP (Model Context Protocol) 集成端点执行任意管理操作,包括:

  • 🔄 重启 Nginx 服务
  • 📝 创建/修改/删除 Nginx 配置文件
  • ⚡ 触发自动配置重载
  • 🎯 完全接管 Nginx 服务

该漏洞的 CVSS 3.1 基础评分为 9.8 (CRITICAL),攻击向量为网络 (AV),攻击复杂度低 (AC),无需权限 (PR),无需用户交互 (UI),对机密性、完整性、可用性均有高影响 (C/I/A)。


漏洞原理#

问题根源#

Nginx UI 的 MCP 集成暴露了两个 HTTP 端点:

端点认证要求状态
/mcpIP 白名单 + AuthRequired() 中间件✅ 安全
/mcp_message仅 IP 白名单❌ 存在漏洞

致命缺陷#

/mcp_message 端点的问题在于:

  1. 仅应用 IP 白名单检查,没有身份认证
  2. 默认 IP 白名单为空 ([])
  3. 空白的 IP 白名单被中间件解释为 “允许所有 IP”

这意味着任何能够访问 Nginx UI 的网络攻击者都可以:

任意攻击者 → /mcp_message → 调用所有 MCP 工具 → 完全控制 Nginx

代码层面分析#

根据 GitHub 安全公告 (GHSA-h6c2-x2m2-mwhf),问题出在中间件配置上:

// /mcp 端点 - 正确配置
app.use('/mcp', ipWhitelistMiddleware, AuthRequired(), mcpHandler);
// /mcp_message 端点 - 错误配置
app.use('/mcp_message', ipWhitelistMiddleware, mcpHandler);
// ⚠️ 缺少 AuthRequired() 中间件
// ⚠️ 默认 ipWhitelist = [] 被解释为允许所有

影响范围#

受影响版本#

软件受影响版本修复版本
Nginx UI≤ 2.3.5暂无公开补丁

CPE 标识#

cpe:2.3:a:nginxui:nginx_ui:*:*:*:*:*:*:*:* versions up to (including) 2.3.5

潜在影响#

如果 Nginx UI 暴露在公网或不受信任的网络中,攻击者可以:

  1. 服务中断: 重启 Nginx 导致网站下线
  2. 配置篡改: 修改 Nginx 配置植入恶意规则
  3. 反向代理滥用: 配置反向代理进行流量劫持
  4. SSRF 攻击: 利用 Nginx 的 proxy_pass 功能内网探测
  5. WebShell 部署: 通过配置写入恶意脚本

漏洞复现#

环境准备#

Terminal window
# 安装受影响的 Nginx UI 版本
docker run -d --name nginx-ui \
-p 8080:80 \
-p 9000:9000 \
0xjacky/nginx-ui:2.3.5

检测步骤#

步骤 1: 确认 Nginx UI 可访问

Terminal window
curl -I http://target-ip:9000/
# HTTP/1.1 200 OK 表示服务在线

步骤 2: 测试 /mcp_message 端点

Terminal window
curl -X POST http://target-ip:9000/mcp_message \
-H "Content-Type: application/json" \
-d '{"method":"tools/call","params":{"name":"nginx.restart"}}'

步骤 3: 如果返回成功响应,说明存在漏洞

{
"result": {
"status": "success",
"message": "Nginx restarted"
}
}

攻击利用链#

1. 信息收集
└─→ 扫描 9000 端口 (默认 Nginx UI 端口)
2. 漏洞验证
└─→ 访问 /mcp_message 端点测试未授权访问
3. 权限提升
└─→ 调用 MCP 工具读取/修改 Nginx 配置
4. 持久化控制
└─→ 修改配置植入后门或反向代理规则
5. 横向移动
└─→ 利用 Nginx 作为跳板探测内网

临时缓解方案#

⚠️ 截至 2026-04-17,官方尚未发布修复补丁。建议采取以下临时缓解措施:

方案 1: 网络隔离 (推荐)#

将 Nginx UI 限制在内部网络访问:

Terminal window
# 防火墙规则 (UFW 示例)
ufw deny 9000/tcp
ufw allow from 10.0.0.0/8 to any port 9000 proto tcp
ufw allow from 192.168.0.0/16 to any port 9000 proto tcp

方案 2: Nginx 反向代理认证#

在 Nginx UI 前部署认证层:

server {
listen 80;
server_name nginx-ui.example.com;
location / {
auth_basic "Nginx UI Admin";
auth_basic_user_file /etc/nginx/.htpasswd;
# 仅允许受信任 IP 访问 MCP 端点
location /mcp_message {
allow 10.0.0.0/8;
allow 192.168.0.0/16;
deny all;
}
proxy_pass http://127.0.0.1:9000;
}
}

方案 3: 禁用 MCP 功能#

如果不需要 MCP 集成,可以在配置中禁用:

# Nginx UI 配置文件
mcp:
enabled: false

方案 4: 修改 IP 白名单#

在 Nginx UI 配置中显式设置 IP 白名单:

mcp:
ip_whitelist:
- 127.0.0.1
- 10.0.0.1 # 仅允许可信 IP

检测与监控#

日志审计#

检查 Nginx UI 访问日志中的可疑请求:

Terminal window
# 搜索 /mcp_message 端点访问
grep "/mcp_message" /var/log/nginx-ui/access.log
# 检测异常 POST 请求
grep "POST /mcp_message" /var/log/nginx-ui/access.log | \
awk '{print $1}' | sort | uniq -c | sort -rn

SIEM 规则#

# Splunk 检测规则
index=nginx_ui
uri_path="/mcp_message"
http_method=POST
status=200
| stats count by src_ip, user_agent
| where count > 5

网络监控#

监控对 Nginx UI 端点的异常访问:

Terminal window
# 使用 tcpdump 捕获可疑流量
tcpdump -i eth0 'port 9000 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354'
# 过滤 POST 请求

时间线#

日期事件
2026-03-30GitHub 收到漏洞报告,分配 CVE-2026-33032
2026-03-30GitHub 发布安全公告 (GHSA-h6c2-x2m2-mwhf)
2026-04-01NIST NVD 收录该漏洞
2026-04-16NVD 更新漏洞记录,添加参考链接
2026-04-17暂无官方补丁发布

参考资源#


总结#

CVE-2026-33032 是一个典型的认证缺失漏洞,根源在于开发者错误地认为 IP 白名单可以替代身份认证。这个案例提醒我们:

  1. 防御深度: 单一安全措施(IP 白名单)不足以保护敏感功能
  2. 默认安全: 默认配置应该是安全的(空名单应解释为”拒绝所有”)
  3. 及时更新: 使用 Nginx UI 的管理员应密切关注官方补丁发布

🔔 建议: 如果你正在使用 Nginx UI ≤ 2.3.5,请立即实施上述缓解措施,并监控官方仓库获取补丁更新。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

相关文章智能推荐
1
虚拟发卡系统回调伪造漏洞全链路拆解 — 从备份文件泄露到批量盗取卡密
漏洞分析深度分析一起针对 ACG-Faka + BEpusdt 的真实攻击事件:攻击者通过两条路径窃取支付密钥——下载 Web 根目录残留的备份文件,或利用 Nginx 配置错误直读 Config.php 源码——进而伪造合法回调通知批量盗取卡密。附官方安全公告、五站实测审计结果与完整防御方案。
2
哪吒监控路径穿越漏洞分析:一个 `/dashboard..` 拿下全站 JWT 密钥
漏洞分析Nezha Dashboard v2.0.13 以下存在未授权路径穿越(CVE-2026-53519,CVSS 9.1),通过构造 /dashboard../data/config.yaml 即可越权读取配置文件,获取 JWT 签名密钥,进而伪造任意用户令牌拿下面板控制权。
3
一次 Nginx Lua 木马应急响应实录:从移动端跳转博彩站到 root 级入侵溯源
应急响应某电商站点移动端用户反馈访问时被重定向到博彩风格页面,排查后发现这是一起已落证的服务器侧入侵事件——攻击者通过 root SSH 植入 Nginx Lua 恶意模块,配合服务脚本持久化和日志清洗,形成完整的持久化攻击链。本文完整记录从用户报障到根因定位、证据固定、恶意代码清理、认证面收敛的全流程应急响应过程。
4
提链 — ChatGPT 跨区支付链接提取的完整技术拆解
漏洞分析完整拆解 ChatGPT 提链技术:从 Session Token 出发,通过 12 步协议流程构造 Stripe Checkout Session,最终提取 iDEAL/UPI/PIX/Kakao Pay 等本地支付链接。附带八种支付方式的技术对比和完整代码分析。
5
0 PHP 白嫖 ChatGPT Plus — 跨区定价混淆攻击的完整技术拆解
漏洞分析深度拆解最近在群里疯传的 ChatGPT Plus 0 PHP 开通方法:日区注册 → 美区提 Token → 第三方工具生成 Checkout → 菲律宾 BIN 完成支付。跨区信号碎片化制造歧义,第三方工具利用异常路径注入零元参数。三种假说的完整技术分析。
随机文章随机推荐
Profile Image of the Author
47工作室
47工作室:记录技术实践与安全研究。
公告
欢迎来到 47工作室!微信:gzs-47
分类
标签
最新动态
站点统计
文章
39
分类
16
标签
165
总字数
121,285
运行时长
0
最后活动
0 天前
站点信息
构建平台
Local
博客版本
站点 vunknown
文章许可
CC BY-NC-SA 4.0