
Dockerベースのラボ環境で、nginx-uiにおける2つの認証不要のAPI脆弱性(CVE-2026-42221、CVE-2026-42238)を検証・悪用し、パッチ適用済みバージョンとの比較および教育的な解説を提供します。
nginx-ui(Nginx の Web 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 ではインストールシークレット方式の導入により1つのミドルウェア追加で両方が修正された。
.
├── 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