
Ich habe die gemeinhin als Pwnkit bekannte Schwachstelle zu Lehrzwecken analysiert und einen PoC dafür geschrieben. Ausschließlich zu Lehrzwecken verwenden.
DISCLAIMER: Dieses Material wird ausschließlich zu Bildungszwecken bereitgestellt. Die Verwendung des Exploits ohne schriftliche Zustimmung des Eigentümers des Zielsystems ist unethisch und kann strafrechtlich verfolgt werden.
chmod +x build.sh../build.sh../mls_envp. Sie erhalten Root-Zugriff.In der verwundbaren Version von polkit (0.105) ging der Autor, David Zeuthen, davon aus, dass pkexec immer von der Konsole aus aufgerufen wird. Er nahm an, dass argc (die Anzahl der Argumente) immer größer als 1 ist, da argv[0] der Name des Programms selbst ist. Allerdings kann pkexec über den Systemaufruf execve aufgerufen werden, indem ein leeres Argumentarray übergeben wird. Dadurch gerät die Logik des Programms durcheinander.
Im Code von pkexec ist fest verankert, dass argv mindestens ein Element enthält. Wenn argc gleich 0 ist, versucht das Programm dennoch, auf argv[1] zuzugreifen. Dies führt zu einer Überschreitung der Grenzen des Arrays argv und zum Lesen des ersten Elements des Arrays envp (der Umgebungsvariablen). In unserem Fall befindet sich dort die Zeichenkette "exp_exe".
pkexec versucht, das Programm exp_exe mithilfe der Funktion g_find_program_in_path zu finden. Für die Suche verwendet sie die Variable PATH. Wir ersetzen PATH durch GCONV_PATH=.. Infolgedessen findet pkexec die Platzhalterdatei exp_exe in unserem lokalen Ordner und gibt den Pfad GCONV_PATH=./exp_exe zurück. Aufgrund des Bugs mit argc wird dieser Pfad zurück in envp[0] geschrieben, wodurch die Variable GCONV_PATH „legalisiert“ wird.
Vor dem Start des Programms prüft pkexec die Umgebungsvariablen (einschließlich SHELL). Wir übergeben eine nicht existierende Shell (SHELL=xyz), um einen Fehler zu provozieren. Bei der Fehlerausgabe wird log_message aufgerufen, das die Mechanismen von glibc nutzt. Glibc schaut auf die Variable CHARSET=bohemcavanna und greift, da sie keinen Standard-Konverter findet, auf das Verzeichnis aus GCONV_PATH zu (das wir untergeschoben haben). Dort liest sie die Datei gconv-modules, lädt unsere Bibliothek exploit.so und führt den Code darin mit Root-Rechten aus.