
Environnement de laboratoire basé sur Docker pour vérifier et exploiter deux vulnérabilités API non authentifiées (CVE-2026-42221, CVE-2026-42238) dans nginx-ui, avec comparaison de version corrigée et compte-rendu pédagogique.
Ce dépôt permet de vérifier concrètement deux CVE signalées pour nginx-ui (outil de gestion Web GUI de Nginx) dans un environnement Docker.
Avertissement
Le contenu de vérification de ce dépôt est destiné uniquement à un environnement local isolé que vous administrez.
Utiliser des méthodes similaires sur des systèmes tiers sans autorisation est contraire à la loi sur l'interdiction des accès non autorisés.
Le processus de vérification, les réflexions et les leçons apprises sont résumés dans un article Qiita.
| CVE | Résumé | Version affectée | Version corrigée |
|---|
| CVE-2026-42221 | L'API /api/install avant configuration est accessible sans authentification. Un attaquant peut enregistrer un compte administrateur en premier. | v2.3.7 et antérieur | v2.3.8 |
| CVE-2026-42238 | L'API /api/restore avant configuration est accessible sans authentification. En injectant un app.ini malveillant, des commandes arbitraires peuvent être exécutées en tant que root. | v2.3.7 et antérieur | v2.3.8 |
Les deux CVE partagent la même cause racine (la fenêtre API avant configuration est non protégée), et dans v2.3.8, l'introduction du mécanisme de secret d'installation a permis de corriger les deux avec l'ajout d'un seul middleware.
.
├── 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
Vérification du démarrage :
curl http://localhost:8080/api/install
# → {"lock":false,"timeout":false} が返れば OK
Point d'attention : L'image brute
uozi/nginx-ui:v2.3.7boucle au démarrage sans modification. C'est parce que les répertoires commesites-enabledn'existent pas. Le Dockerfile de ce dépôt les prépare à l'avance.
cd scripts
python exploit_42221.py
En cas de succès, vous pouvez vous connecter à http://localhost:8080 avec le compte attacker.
cd nginx_lab_patched
docker compose build
docker compose up -d
Dans v2.3.8, un secret d'installation est requis pour la configuration initiale. Après le démarrage du conteneur, vérifiez le secret.
docker exec nginx-ui-patched cat /etc/nginx-ui/.install_secret
Utilisez cette valeur sur l'écran de configuration http://localhost:8081 pour enregistrer l'administrateur.
cd scripts
python test_patched.py
Si [OK] Attaque échouée (corrigée) s'affiche, le patch fonctionne correctement.
# Version vulnérable
cd nginx_lab
docker compose down -v
# Version corrigée
cd nginx_lab_patched
docker compose down -v