
Docker 기반 랩 환경으로, nginx-ui의 인증되지 않은 두 API 취약점(CVE-2026-42221, CVE-2026-42238)을 확인하고 악용하며, 패치 버전 비교와 교육용 해설을 제공합니다.
nginx-ui(Nginx 웹 GUI 관리 도구)에 보고된 2개의 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 |
2개의 CVE는 근본 원인이 동일(설정 전의 API 창이 무방비)하며, v2.3.8에서는 설치 시크릿 방식 도입으로 하나의 미들웨어 추가로 두 가지 모두 수정되었습니다.
.
├── 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
pycryptodome 라이브러리pip install pycryptodome
cd nginx_lab
docker compose build
docker compose up -d
실행 확인:
curl http://localhost:8080/api/install
# → {"lock":false,"timeout":false} が返れば OK
주의사항: 기본
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