
Dies ist meine einfache Implementierung eines Exploits für die PwnKit-Schwachstelle.
Hinweis: Dieses Repository und sein Inhalt sind Teil einer Abschlussarbeit (GrAL), die ausschließlich für didaktische Zwecke und akademische Forschung erstellt wurde.
Dieses Repository enthält einen Konzeptnachweis (PoC - Proof of Concept) für die Schwachstelle CVE-2021-4034 (auch bekannt als PwnKit). Diese Speicherkorruptions-Schwachstelle betrifft das pkexec-Komponente von Polkit auf Linux-Systemen. Wenn pkexec mit einer leeren Argumentliste (argc == 0) ausgeführt wird, können Umgebungsvariablen manipuliert werden, um das Laden einer beliebigen gemeinsam genutzten Bibliothek zu erzwingen und so eine lokale Privilegienerweiterung zu erreichen.
Im Folgenden werden die Schritte beschrieben, die zur Vorbereitung der Ausführungsumgebung für die Ausnutzung des Fehlers erforderlich sind. Dieser Prozess beschreibt, wie der Speicher-Lese-/Schreibfehler in pkexec ausgenutzt wird:
gconv-Struktur)Dieser Exploit missbraucht die Art und Weise, wie GLib beim Versuch, eine Fehlermeldung auszugeben, die Zeichenkonvertierung verwaltet. Dazu besteht der erste Schritt darin, eine bestimmte Verzeichnisstruktur zu erstellen, die für GLib als lokales Repository für GCONV-Konvertierungsmodule dient.
Der Schlüssel zur Schwachstelle ist das Injizieren der Umgebungsvariable GCONV_PATH, indem der durch den Zustand argc == 0 in pkexec verursachte Out-of-Bounds-Schreibzugriff ausgenutzt wird. Auf diese Weise wird das Programm gezwungen, einen anomalen Zeichensatz zu verwenden, was GLib signalisiert, dass die Zeichenkonvertierungsmodule in dem im vorherigen Schritt erstellten kontrollierten Verzeichnis gesucht werden müssen.
.so)Um unseren Code auszuführen, muss eine gemeinsam genutzte Bibliothek (Shared Object oder .so) kompiliert werden. Wenn pkexec versucht, einen Zeichensatz zu verarbeiten, den es nicht finden kann, lädt es diese Bibliothek aus unserem gefälschten gconv-Verzeichnis. Da pkexec eine Binärdatei mit gesetztem SUID-Bit ist (wird als root ausgeführt), erhält unser Code beim Laden dieser Bibliothek root-Privilegien und übernimmt die vollständige Kontrolle über das System (z. B. durch Öffnen einer Root-Shell).
gconv-modulesSchließlich muss in diesem lokalen Verzeichnis eine Konfigurationsdatei namens gconv-modules erstellt werden. Diese Datei fungiert als Index: Sie teilt GLib mit, welche konkrete Bibliothek (.so) für die Konvertierung des angeforderten spezifischen Zeichensatzes geladen werden muss. Diese Datei verbindet die von pkexec angeforderte Konvertierung mit der in Schritt 3 erstellten gemeinsam genutzten Bibliothek.
Das Projekt enthält ein Makefile, um die Kompilierung der C-Binärdatei und die Bereinigung der Umgebung zu automatisieren.
Um das Projekt zu kompilieren: $ make
Um die erzeugten Dateien (temporäre Dateien, Ordner und Binärdateien) zu bereinigen: $ make clean