
Ambiente de laboratório baseado em Docker para verificar e explorar duas vulnerabilidades de API não autenticadas (CVE-2026-42221, CVE-2026-42238) no nginx-ui, com comparação de versão corrigida e material educacional.
Repositório para verificar, em um ambiente Docker, duas CVEs reportadas no nginx-ui (uma ferramenta de gerenciamento de GUI web para Nginx).
Aviso de isenção
O conteúdo de verificação deste repositório destina-se apenas ao ambiente local isolado que você gerencia.
Usar técnicas semelhantes em sistemas de terceiros não autorizados viola as leis de acesso não autorizado.
O processo de verificação, reflexões e aprendizados estão resumidos em um artigo do Qiita.
| CVE | Descrição | Versão afetada | Versão corrigida |
|---|---|---|---|
| CVE-2026-42221 | O endpoint /api/install antes da configuração é acessível sem autenticação. Um atacante pode registrar uma conta de administrador primeiro. | v2.3.7 e anteriores | v2.3.8 |
| CVE-2026-42238 | O endpoint /api/restore antes da configuração é acessível sem autenticação. Ao injetar um app.ini malicioso, é possível executar comandos arbitrários como root. | v2.3.7 e anteriores | v2.3.8 |
As duas CVEs têm a mesma causa raiz (janela da API desprotegida antes da configuração), e na v2.3.8 ambas foram corrigidas com a adição de um middleware que implementa o método de segredo de instalação.
.
├── nginx_lab/ # Ambiente de verificação da versão vulnerável (v2.3.7) → porta 8080
│ ├── Dockerfile # Definição da imagem com configuração inicial para evitar loop de inicialização
│ ├── docker-compose.yml
│ ├── nginx.conf # Configuração corrigida dos blocos sites-enabled / stream
│ ├── init-app.ini # Template inicial do app.ini
│ └── entrypoint.sh # Script de inicialização ao iniciar o contêiner
├── nginx_lab_patched/ # Ambiente de verificação da versão corrigida (v2.3.8) → porta 8081
│ ├── Dockerfile
│ ├── docker-compose.yml
│ ├── nginx.conf
│ ├── init-app.ini
│ └── entrypoint.sh
├── scripts/
│ ├── exploit_42221.py # Script de ataque para CVE-2026-42221
│ ├── encrypt_password.py # Utilitário de criptografia RSA
│ └── test_patched.py # Script para verificar a aplicação do patch na v2.3.8 (porta 8081)
├── Qiita.md # Manuscrito para publicação no Qiita
└── 学習プラン.md
pycryptodomepip install pycryptodome
cd nginx_lab
docker compose build
docker compose up -d
Verificação de inicialização:
curl http://localhost:8080/api/install
# → {"lock":false,"timeout":false} se retornar, está OK
Ponto crítico: A imagem pura
uozi/nginx-ui:v2.3.7entra em loop de inicialização sozinha, porque diretórios comosites-enablednão existem. O Dockerfile deste repositório prepara esses diretórios antecipadamente.
cd scripts
python exploit_42221.py
Se bem-sucedido, será possível fazer login em http://localhost:8080 com a conta attacker.
cd nginx_lab_patched
docker compose build
docker compose up -d
Na v2.3.8, um segredo de instalação é necessário para a configuração inicial. Após iniciar o contêiner, verifique o segredo.
docker exec nginx-ui-patched cat /etc/nginx-ui/.install_secret
Na tela de configuração em http://localhost:8081, use esse valor para registrar um administrador.
cd scripts
python test_patched.py
Se for exibido [OK] Ataque falhou (corrigido), o patch está funcionando corretamente.
# Versão vulnerável
cd nginx_lab
docker compose down -v
# Versão corrigida
cd nginx_lab_patched
docker compose down -v