nginx-ui(Nginx 的 Web GUI 管理工具)报告的两个 CVE 在 Docker 环境中进行实际验证的仓库。
免责声明
本仓库的验证内容仅针对自己管理的隔离本地环境。
未经许可对第三方系统使用类似手法将违反不正访问禁止法。
验证过程、考察及学习内容已总结在 Qiita 文章中。
实际尝试 nginx-ui 的 CVE:「漏洞」认为是设计问题
| CVE | 概要 | 影响版本 | 修复版本 |
|---|
| CVE-2026-42221 | 安装前的 /api/install 可在无认证下访问。攻击者可先注册管理员账户 | v2.3.7 及之前 | v2.3.8 |
| CVE-2026-42238 | 安装前的 /api/restore 可在无认证下访问。通过注入恶意 app.ini 以 root 权限执行任意命令 | v2.3.7 及之前 | v2.3.8 |
两个 CVE 根本原因相同(安装前的 API 入口无防护),v2.3.8 中通过引入安装密钥方式,仅添加一个中间件就同时修复了两者。
.
├── nginx_lab/ # 漏洞版本 (v2.3.7) 的验证环境 → 端口 8080
│ ├── Dockerfile # 包含避免启动循环的初始设置的镜像定义
│ ├── docker-compose.yml
│ ├── nginx.conf # 已修正 sites-enabled / stream 块配置
│ ├── init-app.ini # app.ini 初始模板
│ └── entrypoint.sh # 容器启动时的初始化脚本
├── nginx_lab_patched/ # 已修复版本 (v2.3.8) 的验证环境 → 端口 8081
│ ├── Dockerfile
│ ├── docker-compose.yml
│ ├── nginx.conf
│ ├── init-app.ini
│ └── entrypoint.sh
├── scripts/
│ ├── exploit_42221.py # CVE-2026-42221 的攻击脚本
│ ├── encrypt_password.py # RSA 加密工具
│ └── test_patched.py # 在 v2.3.8 (端口 8081) 上确认补丁生效的脚本
├── Qiita.md # Qiita 投稿原稿
└── 学习计划.md
pycryptodome 库pip install pycryptodome
cd nginx_lab
docker compose build
docker compose up -d
启动确认:
curl http://localhost:8080/api/install
# → 返回 {"lock":false,"timeout":false} 则正常
注意点:原生的
uozi/nginx-ui:v2.3.7镜像直接使用会进入启动循环。因为缺少sites-enabled等目录。本仓库的 Dockerfile 已提前准备了这些目录。
cd scripts
python exploit_42221.py
成功后,可使用 attacker 账户登录 http://localhost:8080。
cd nginx_lab_patched
docker compose build
docker compose up -d
v2.3.8 首次安装需要安装密钥。容器启动后查看密钥。
docker exec nginx-ui-patched cat /etc/nginx-ui/.install_secret
在安装界面 http://localhost:8081 使用该值注册管理员。
cd scripts
python test_patched.py
输出 [OK] 攻击失败(已修复) 则表示补丁正常工作。
# 漏洞版本
cd nginx_lab
docker compose down -v
# 已修复版本
cd nginx_lab_patched
docker compose down -v