
Proof-of-Concept-Exploit für CVE-2023-32428, eine lokale Privilegieneskalation unter macOS über MallocStackLogging, die Kernel-Level-Speicherkorruption demonstriert, um Root-Zugriff zu erlangen.
CVE-2023-32428 beschreibt einen Logikfehler in MallocStackLogging, der für eine lokale Rechteausweitung (Local Privilege Escalation, LPE) unter macOS ausgenutzt werden kann, um Root-Rechte zu erlangen.
Dieses Repository enthält einen vollständigen Exploit. Er wurde unter macOS 13.3 (22E252) mit Intel-x86_64-Architektur in einer virtuellen Maschine getestet.
Die Schwachstelle ist ein Logikfehler in der Funktion MallocStackLogging, die mit macOS 11 und später eingeführt wurde. Der Fehler besteht darin, dass MallocStackLogging in zwei Modi arbeitet:
Modus 1: Die Bibliothek libsystem_malloc hält die Stack-Logging-Daten im ArbeitsspeicherModus 2: Die Stack-Logging-Daten werden in eine Datei an einem vom Benutzer kontrollierten Ort geschriebenDie Funktion MallocStackLogging wird über die Umgebungsvariable MallocStackLogging gesteuert. Laut Dokumentation kann diese die folgenden Werte annehmen:
0 - Deaktiviert das Stack-Logging1 - Aktiviert das Stack-Logging und hält die Daten im Arbeitsspeicher (Modus 1)2 - Schreibt die Stack-Logging-Daten in einen Dateipfad, der über die Umgebungsvariable MallocStackLoggingFile angegeben wird (Modus 2)3 - Kombination aus Modus 1 und Modus 2Einfach ausgedrückt kann der Benutzer über die Umgebungsvariable MallocStackLogging im Modus 2 steuern, in welches Verzeichnis die Protokolle geschrieben werden.
libsystem_malloc ist eine Bibliothek im Besitz von root, liest jedoch die Umgebungsvariable MallocStackLoggingFile. Wenn das Verzeichnis nicht geöffnet werden kann, erstellt die Bibliothek das Verzeichnis mit den Berechtigungen des aktuell laufenden Prozesses (in unserem Fall der benutzereigene Prozess).
Die Exploit-Primitive ist die folgende:
0 innerhalb des Verzeichnisses /etc erstellen, können wir beliebige Dateien lesen und beliebige Dateien schreibenDer Angriffsvektor ist der folgende:
MallocStackLogging auf 2MallocStackLoggingFile auf /etc/foo/barsetuid root istsetuid root startet den dynamischen Linker (dylib), der libsystem_malloc lädt, welches die Umgebungsvariable MallocStackLoggingFile berücksichtigt/etc/foo/bar zum Schreiben zu öffnen. Da /etc/foo nicht existiert, versucht sie, die Verzeichnisstruktur mit den Berechtigungen des aktuellen Prozesses (benutzereigener Prozess) zu erstellengit clone https://github.com/gergelykalman/CVE-2023-32428-a-macOS-LPE-via-MallocStackLogging.git
cd CVE-2023-32428-a-macOS-LPE-via-MallocStackLogging
make
./exploit
/etc/sudoers angezeigt. Dies zeigt, dass der Exploit beliebige Dateien lesen kann.