Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an dieHackTricks und HackTricks Cloud GitHub-Repositories senden.
Grundlegende Informationen
XPC steht für XNU (den Kernel, der von macOS verwendet wird) Inter-Process Communication und ist ein Framework für die Kommunikation zwischen Prozessen auf macOS und iOS. XPC bietet einen Mechanismus für sichere, asynchrone Methodenaufrufe zwischen verschiedenen Prozessen auf dem System. Es ist Teil des Sicherheitsparadigmas von Apple und ermöglicht die Erstellung von privilegiert getrennten Anwendungen, bei denen jede Komponente nur mit den Berechtigungen ausgeführt wird, die sie für ihre Aufgabe benötigt, um potenzielle Schäden durch einen kompromittierten Prozess zu begrenzen.
XPC verwendet eine Form der Inter-Process Communication (IPC), die eine Reihe von Methoden für verschiedene Programme auf demselben System zum Senden von Daten hin und her umfasst.
Die Hauptvorteile von XPC sind:
Sicherheit: Durch die Aufteilung der Arbeit in verschiedene Prozesse kann jedem Prozess nur die benötigten Berechtigungen gewährt werden. Dies bedeutet, dass selbst wenn ein Prozess kompromittiert ist, er nur begrenzte Möglichkeiten hat, Schaden anzurichten.
Stabilität: XPC hilft dabei, Abstürze auf die Komponente zu isolieren, in der sie auftreten. Wenn ein Prozess abstürzt, kann er neu gestartet werden, ohne den Rest des Systems zu beeinträchtigen.
Leistung: XPC ermöglicht eine einfache Nebenläufigkeit, da verschiedene Aufgaben gleichzeitig in verschiedenen Prozessen ausgeführt werden können.
Der einzige Nachteil besteht darin, dass die Aufteilung einer Anwendung in mehrere Prozesse, die über XPC kommunizieren, weniger effizient ist. In heutigen Systemen ist dies jedoch kaum spürbar und die Vorteile überwiegen.
Anwendungsspezifische XPC-Dienste
Die XPC-Komponenten einer Anwendung befinden sich innerhalb der Anwendung selbst. Zum Beispiel finden Sie sie in Safari unter /Applications/Safari.app/Contents/XPCServices. Sie haben die Erweiterung .xpc (wie com.apple.Safari.SandboxBroker.xpc) und sind auch Bundles mit der Hauptbinary darin: /Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/MacOS/com.apple.Safari.SandboxBroker und eine Info.plist: /Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/Info.plist
Wie Sie vielleicht denken, hat eine XPC-Komponente unterschiedliche Berechtigungen und Privilegien als die anderen XPC-Komponenten oder die Haupt-App-Binary. AUßER wenn ein XPC-Dienst mit JoinExistingSession auf "True" in seiner Info.plist-Datei konfiguriert ist. In diesem Fall wird der XPC-Dienst in derselben Sicherheitssitzung wie die aufrufende Anwendung ausgeführt.
XPC-Dienste werden bei Bedarf von launchd gestartet und werden heruntergefahren, sobald alle Aufgaben abgeschlossen sind, um Systemressourcen freizugeben. Anwendungsspezifische XPC-Komponenten können nur von der Anwendung genutzt werden, wodurch das Risiko potenzieller Sicherheitslücken reduziert wird.
Systemweite XPC-Dienste
Systemweite XPC-Dienste sind für alle Benutzer zugänglich. Diese Dienste, entweder launchd oder Mach-Typ, müssen in Plist-Dateien definiert werden, die sich in bestimmten Verzeichnissen wie /System/Library/LaunchDaemons, /Library/LaunchDaemons, /System/Library/LaunchAgents oder /Library/LaunchAgents befinden.
Diese Plist-Dateien enthalten einen Schlüssel namens MachServices mit dem Namen des Dienstes und einen Schlüssel namens Program mit dem Pfad zur Binary:
Diejenigen in LaunchDameons werden von root ausgeführt. Wenn ein unprivilegierter Prozess mit einem von ihnen kommunizieren kann, könnte er in der Lage sein, Privilegien zu eskalieren.
XPC-Ereignisnachrichten
Anwendungen können sich für verschiedene Ereignisnachrichten abonnieren, um sie bei Bedarf auf Anfrage zu initiieren. Die Einrichtung für diese Dienste erfolgt in Launchd-Plist-Dateien, die sich in den gleichen Verzeichnissen wie die vorherigen befinden und einen zusätzlichen LaunchEvent-Schlüssel enthalten.
XPC-Verbindungsprozessprüfung
Wenn ein Prozess versucht, eine Methode über eine XPC-Verbindung aufzurufen, sollte der XPC-Dienst überprüfen, ob dieser Prozess eine Verbindung herstellen darf. Hier sind die gängigen Möglichkeiten, dies zu überprüfen, und die häufigsten Fallstricke:
Apple ermöglicht es auch Apps, einige Rechte zu konfigurieren und wie sie diese erhalten, sodass der aufrufende Prozess berechtigt ist, eine Methode aus dem XPC-Dienst aufzurufen:
Um die XPC-Nachrichten abzufangen, können Sie xpcspy verwenden, das Frida verwendet.
# Installpip3installxpcspypip3installxpcspy--no-deps# To not make xpcspy install Frida 15 and downgrade your Frida installation# Start sniffingxpcspy-U-r-W<bundle-id>## Using filters (i: for input, o: for output)xpcspy-U<prog-name>-t'i:com.apple.*'-t'o:com.apple.*'-r
# Compile the server & clientgccxpc_server.c-oxpc_servergccxpc_client.c-oxpc_client# Save server on it's locationcpxpc_server/tmp# Load daemonsudocpxyz.hacktricks.service.plist/Library/LaunchDaemonssudolaunchctlload/Library/LaunchDaemons/xyz.hacktricks.service.plist# Call client./xpc_client# Cleansudolaunchctlunload/Library/LaunchDaemons/xyz.hacktricks.service.plistsudorm/Library/LaunchDaemons/xyz.hacktricks.service.plist/tmp/xpc_server
```bash # Compile the server & client gcc -framework Foundation oc_xpc_server.m -o oc_xpc_server gcc -framework Foundation oc_xpc_client.m -o oc_xpc_client
## Client innerhalb eines Dylb-Codes
Ein Dylb-Code ist ein Code, der in macOS verwendet wird, um XPC-Dienste (Interprozesskommunikation) zu implementieren. Ein XPC-Dienst ermöglicht die Kommunikation zwischen verschiedenen Prozessen auf einem macOS-System.
Um einen Client innerhalb eines Dylb-Codes zu implementieren, müssen Sie zunächst die XPC-Bibliothek importieren:
```objective-c
#import <xpc/xpc.h>
Dann können Sie eine XPC-Verbindung herstellen, indem Sie eine XPC-Verbindung erstellen und den Ziel-Dienstnamen angeben:
Ersetzen Sie "key" und "value" durch die entsprechenden Schlüssel-Wert-Paare, die Sie senden möchten.
Schließlich müssen Sie die Verbindung aufräumen, wenn Sie fertig sind:
xpc_release(connection);
Dieser Code erstellt einen Client innerhalb eines Dylb-Codes, der eine Verbindung zu einem XPC-Dienst herstellt und eine Nachricht sendet. Sie können diesen Code anpassen, um Ihre spezifischen Anforderungen zu erfüllen.