
Ambiente di laboratorio basato su Docker per verificare e sfruttare due vulnerabilità API non autenticate (CVE-2026-42221, CVE-2026-42238) in nginx-ui, con confronto con la versione patchata e write-up didattico.
Repository per verificare realmente, in ambiente Docker, due CVE segnalate per nginx-ui (strumento di gestione GUI Web per Nginx).
Disclaimer
Le verifiche contenute in questo repository sono rivolte esclusivamente a un ambiente locale isolato di mia proprietà.
Utilizzare tecniche simili su sistemi di terze parti senza autorizzazione viola la legge contro l'accesso non autorizzato.
Il processo di verifica, le riflessioni e gli insegnamenti tratti sono raccolti in un articolo Qiita.
| CVE | Panoramica | Versioni interessate | Versione corretta |
|---|
| CVE-2026-42221 | /api/install è accessibile senza autenticazione prima del setup. Un attaccante può registrare per primo un account amministratore | v2.3.7 e precedenti | v2.3.8 |
| CVE-2026-42238 | /api/restore è accessibile senza autenticazione prima del setup. Iniettando un app.ini malevolo è possibile eseguire comandi arbitrari come root | v2.3.7 e precedenti | v2.3.8 |
Le due CVE condividono la stessa causa principale (l'API pre-setup era lasciata senza protezione); nella v2.3.8 entrambe sono state corrette con l'aggiunta di un singolo middleware tramite l'introduzione del segreto di installazione.
.
├── nginx_lab/ # 脆弱バージョン (v2.3.7) の検証環境 → port 8080
│ ├── Dockerfile # 起動ループ回避のための初期設定を含むイメージ定義
│ ├── docker-compose.yml
│ ├── nginx.conf # sites-enabled / stream ブロック修正済みの設定
│ ├── init-app.ini # app.ini の初期テンプレート
│ └── entrypoint.sh # コンテナ起動時の初期化スクリプト
├── nginx_lab_patched/ # 修正済みバージョン (v2.3.8) の検証環境 → port 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 (port 8081) でパッチ適用を確認するスクリプト
├── Qiita.md # Qiita 投稿原稿
└── 学習プラン.md
pycryptodomepip install pycryptodome
cd nginx_lab
docker compose build
docker compose up -d
Verifica dell'avvio:
curl http://localhost:8080/api/install
# → {"lock":false,"timeout":false} が返れば OK
Punto critico: l'immagine base
uozi/nginx-ui:v2.3.7entra in un loop di avvio se usata così com'è, perché mancano directory comesites-enabled. Nel Dockerfile di questo repository queste vengono predisposte in anticipo.
cd scripts
python exploit_42221.py
Se l'exploit riesce, si può accedere a http://localhost:8080 con l'account attacker.
cd nginx_lab_patched
docker compose build
docker compose up -d
Nella v2.3.8 per il primo setup è necessario un segreto di installazione. Dopo l'avvio del container, verificare il segreto.
docker exec nginx-ui-patched cat /etc/nginx-ui/.install_secret
Nella schermata di setup http://localhost:8081, usare questo valore per registrare l'amministratore.
cd scripts
python test_patched.py
Se viene stampato [OK] 攻撃失敗(修正済み), la patch funziona correttamente.
# 脆弱バージョン
cd nginx_lab
docker compose down -v
# 修正済みバージョン
cd nginx_lab_patched
docker compose down -v