
Docker-basierte Laborumgebung zur Überprüfung und Ausnutzung von zwei nicht authentifizierten API-Sicherheitslücken (CVE-2026-42221, CVE-2026-42238) in nginx-ui, mit Vergleich der gepatchten Version und einem erklärenden Write-up.
Ein Repository zur praktischen Überprüfung von zwei gemeldeten CVEs in nginx-ui (Nginx-Web-GUI-Verwaltungstool) in einer Docker-Umgebung.
Haftungsausschluss
Die Prüfungen in diesem Repository richten sich ausschließlich an isolierte lokale Umgebungen, die ich selbst verwalte.
Die Verwendung ähnlicher Methoden auf nicht autorisierten Systemen Dritter verstößt gegen Gesetze zum unbefugten Zugriff.
Der Prüfprozess, die Überlegungen und die Erkenntnisse habe ich in einem Qiita-Artikel zusammengefasst.
| CVE | Beschreibung | Betroffene Version | Korrigierte Version |
|---|---|---|---|
| CVE-2026-42221 | /api/install vor der Einrichtung ist ohne Authentifizierung zugänglich. Angreifer können das Administratorkonto zuerst registrieren. | v2.3.7 und früher | v2.3.8 |
| CVE-2026-42238 | /api/restore vor der Einrichtung ist ohne Authentifizierung zugänglich. Durch Injizieren einer bösartigen app.ini können beliebige Befehle als root ausgeführt werden. | v2.3.7 und früher | v2.3.8 |
Beide CVEs haben dieselbe Grundursache (die API-Fenster vor der Einrichtung sind ungeschützt), und in v2.3.8 wurde durch die Einführung des Installationsgeheimnisses ein einzelnes Middleware-Element hinzugefügt, das beide Probleme behebt.
.
├── nginx_lab/ # Prüfumgebung für die fehlerhafte Version (v2.3.7) → Port 8080
│ ├── Dockerfile # Image-Definition mit Vorkonfiguration zur Vermeidung von Startschleifen
│ ├── docker-compose.yml
│ ├── nginx.conf # Konfiguration mit korrigierten sites-enabled / stream-Blöcken
│ ├── init-app.ini # Anfangsvorlage der app.ini
│ └── entrypoint.sh # Initialisierungsskript beim Containerstart
├── nginx_lab_patched/ # Prüfumgebung für die behobene Version (v2.3.8) → Port 8081
│ ├── Dockerfile
│ ├── docker-compose.yml
│ ├── nginx.conf
│ ├── init-app.ini
│ └── entrypoint.sh
├── scripts/
│ ├── exploit_42221.py # Exploit-Skript für CVE-2026-42221
│ ├── encrypt_password.py # Dienstprogramm für RSA-Verschlüsselung
│ └── test_patched.py # Skript zum Überprüfen des Patches in v2.3.8 (Port 8081)
├── Qiita.md # Qiita-Artikel
└── 学習プラン.md
pycryptodome-Bibliothekpip install pycryptodome
cd nginx_lab
docker compose build
docker compose up -d
Starten bestätigen:
curl http://localhost:8080/api/install
# → {"lock":false,"timeout":false} OK
Stolperfalle: Das reine
uozi/nginx-ui:v2.3.7-Image führt zu einer Startschleife, da Verzeichnisse wiesites-enablednicht vorhanden sind. Das Dockerfile dieses Repositorys erstellt diese vorab.
cd scripts
python exploit_42221.py
Bei Erfolg können Sie sich mit dem attacker-Konto unter http://localhost:8080 anmelden.
cd nginx_lab_patched
docker compose build
docker compose up -d
In v2.3.8 ist für die Ersteinrichtung ein Installationsgeheimnis erforderlich. Überprüfen Sie das Geheimnis nach dem Containerstart.
docker exec nginx-ui-patched cat /etc/nginx-ui/.install_secret
Im Einrichtungsbildschirm http://localhost:8081 registrieren Sie den Administrator mit diesem Wert.
cd scripts
python test_patched.py
Wenn [OK] Angriff fehlgeschlagen (gepatcht) ausgegeben wird, funktioniert der Patch korrekt.
# Fehlerhafte Version
cd nginx_lab
docker compose down -v
# Behobene Version
cd nginx_lab_patched
docker compose down -v