
TCC-Umgehung
Als Student habe ich nur begrenzten Zugang zu Geräten, auf denen ich diese Schwachstelle testen kann. Die von mir getesteten Versionen sind MacOS 12.3.1, MacOS 12.3, MacOS 12.0, MacOS 10.15.7 und MacOS 11.6.1. Die Schwachstelle funktioniert auf allen getesteten Versionen.
Auswirkung: Eine bösartige Anwendung könnte in der Lage sein, bestimmte Datenschutzeinstellungen zu umgehen.
Beschreibung: Wenn eine ausführbare Datei während der Ausführung gelöscht wird, kann der Prozess die Einschränkungen für die Bildschirmaufnahme sowie bestimmte Barrierefreiheitseinstellungen umgehen, nämlich die Tastatureingabe-Injektion (mittels Metasploit).
Mögliche Gründe: macOS kann die Berechtigungen des übergeordneten Executables des Prozesses nicht finden und verhindert daher keine Bildschirmaufnahme. Es ist jedoch verwirrend, dass Kamera und Mikrofon weiterhin ordnungsgemäß eingeschränkt sind.
Details:
tccutil reset All führt dazu, dass eine Berechtigungsabfrage angezeigt wird – Auch der Zugriff auf Kamera oder Mikrofon führt zu einer Berechtigungsabfrage.Es funktioniert auf einer frischen Installation von macOS.
Das Ausführen des POC aus src/POC.sh erzeugt einen Screenshot ohne TCC-Abfrage, der alle für den Benutzer sichtbaren Fenster enthält. Das Skript muss gelegentlich mehrmals (maximal 3) ausgeführt werden, damit ein Screenshot erzeugt wird.
Dieser Exploit wurde erstmals von mir entdeckt, als ich mit Metasploits Web Delivery experimentierte. Ich fand heraus, dass durch das sofortige Löschen der gelöschten ausführbaren Datei nach dem Öffnen einer Meterpreter-Shell die Shell Fähigkeiten erlangt, die normalerweise hinter einer TCC-Abfrage gesperrt sind. Diese Schwachstelle ermöglicht es einem Angreifer auch, Tastatureingaben zu injizieren. Ich bin jedoch kein Objective-C-Entwickler und konnte daher keinen eigenen POC erstellen. Dieser Effekt kann dennoch über Metasploit erzielt werden.
src/POC.sh – Shell-Skript: Kopiert screenshot, führt es aus und löscht es während der Ausführung.
src/screenshot – Mach-O-Executable: Macht einen Screenshot und speichert ihn unter src/screenshot.png. Kompiliert aus src/screenshot.m.
src/screenshot.m – Credits an theevilbit für den grundlegenden Code. Die einzige Änderung, die ich vorgenommen habe, war das Hinzufügen eines 3-Sekunden-Schlafs vor dem Screenshot, um genügend Zeit zum Löschen des Executables zu haben, bevor der Screenshot gemacht wird.