
Proof-of-Concept-Exploit für CVE-2020-27949, das beliebiges Lesen/Schreiben von Speicher in macOS-Prozessen über den DTrace-fasttrap-ioctl ohne erhöhte Berechtigungen demonstriert.
Das Gerät /dev/fasttrap zum Erstellen von Trap-Nodes in User-Space-Prozessen für die Provider pid und objc hat die Berechtigungen 666. Im Gegensatz zu /dev/dtrace, das ebenfalls 666 ist, fehlt fasttrap eine Berechtigungsprüfung. Dies erlaubt jedem Prozess, ein FASTTRAPIOC_MAKEPROBE- oder FASTTRAPIOC_GETINSTR-ioctl auszugeben.
Ein Angreifer kann mit FASTTRAPIOC_MAKEPROBE in jedem anderen Prozess Proben für beliebige Speicheradressen erstellen. Bei der Aktivierung dieser Proben werden die Werte an der angegebenen Speicheradresse durch eine Trap-Instruktion (0xCC auf x86) ersetzt und der ursprüngliche Wert in einem Shadow Memory abgelegt. Das Abrufen des ursprünglichen Werts ist mit dem FASTTRAPIOC_GETINSTR-ioctl möglich. Dies erlaubt es dem Angreifer, beliebigen Speicher eines anderen Prozesses zu lesen, indem er mehrere Traps platziert.
Diese Schwachstelle wird unter CVE-2020-27949 geführt, behoben in macOS Big Sur 11.1, Security Update 2020-001 Catalina, Security Update 2020-007 Mojave .
0xCC auf x86) an jede Speicheradresse anderer Prozesse schreiben, die unter DTrace ausgeführt werden, ohne erhöhte Berechtigungen. Sogar das Schreiben von Speicher in Prozesse, die als root laufen, ist möglich. Als Teil anderer Instruktionen oder Sprungadressen kann der Kontrollfluss des Opfers verändert werden, was eine Privilegienausweitung ermöglicht.Als Benutzer erwarte ich, dass das Aktivieren von DTrace nur Prozessen mit Root-Berechtigungen erlaubt, andere Prozesse zu verfolgen, zu instrumentieren oder zu modifizieren. DTrace ist ein wertvolles Werkzeug für administrative Aufgaben und bietet Werkzeuge wie dtruss, iotop usw.
Unser Opfer (target) ist ein ausführbares Programm, das als root läuft. Der Angreifer (memaccess) ist ein ausführbares Programm, das mit normalen Benutzerrechten läuft. Das Tracing-Skript libc_monitor.d zeichnet die Anzahl der Aufrufe von Funktionen im gemeinsamen Objekt libsystem_c.dylib auf (dies ist nur ein einfaches Beispiel für ein administratives Skript, das ein Maschinenbesitzer ausführen könnte).
libc_monitor.d).FASTTRAPIOC_GETINSTR, um die Speicherwerte der erstellten Proben zu lesen.Schritt 4 ersetzt Speicher im Opferprozess mit dem Wert der Trap-Instruktion. Je nach Anwendung kann ein Angreifer dies nutzen, um einen zuvor bekannten Wert an eine kritische Speicheradresse zu schreiben. Beispielsweise könnte der Angreifer den Seed eines RNG kontrollieren oder kryptografische Schlüssel in einem Prozess ersetzen.
Hinweis: Der Angreifer benötigt niemals erhöhte oder Root-Berechtigungen.
Hinweis 2: Selbstgeschriebene DTrace-Skripte sind nicht erforderlich. Beispielsweise verwendet dapptrace ebenfalls den pid-Provider, um beliebige Funktionen zu verfolgen.
Implementieren Sie Berechtigungsprüfungen in /dev/fasttrap wie in /dev/dtrace oder entfernen Sie die für alle Benutzer schreibbare Berechtigung.
Hinweis: Wir haben den veröffentlichten Fix nicht geprüft.
target aus und folgen Sie den Anweisungen auf dem Bildschirm.