XPC, qui signifie XNU (le noyau utilisé par macOS) inter-Process Communication, est un cadre pour la communication entre processus sur macOS et iOS. XPC fournit un mécanisme pour effectuer des appels de méthodes sûrs et asynchrones entre différents processus sur le système. C'est une partie du paradigme de sécurité d'Apple, permettant la création d'applications séparées par les privilèges où chaque composant fonctionne avec seulement les permissions nécessaires pour faire son travail, limitant ainsi les dommages potentiels d'un processus compromis.
XPC utilise une forme de communication inter-processus (IPC), qui est un ensemble de méthodes permettant à différents programmes exécutés sur le même système d'échanger des données.
Les principaux avantages de XPC incluent :
Sécurité : En séparant le travail en différents processus, chaque processus peut se voir accorder uniquement les permissions dont il a besoin. Cela signifie que même si un processus est compromis, sa capacité à nuire est limitée.
Stabilité : XPC aide à isoler les plantages au composant où ils se produisent. Si un processus plante, il peut être redémarré sans affecter le reste du système.
Performance : XPC permet une concurrence facile, car différentes tâches peuvent être exécutées simultanément dans différents processus.
Le seul inconvénient est que séparer une application en plusieurs processus qui communiquent via XPC est moins efficace. Mais dans les systèmes actuels, cela n'est presque pas perceptible et les avantages sont meilleurs.
Services XPC spécifiques à l'application
Les composants XPC d'une application se trouvent à l'intérieur de l'application elle-même. Par exemple, dans Safari, vous pouvez les trouver dans /Applications/Safari.app/Contents/XPCServices. Ils ont l'extension .xpc (comme com.apple.Safari.SandboxBroker.xpc) et sont également des bundles avec le binaire principal à l'intérieur : /Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/MacOS/com.apple.Safari.SandboxBroker et un Info.plist : /Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/Info.plist
Comme vous pourriez le penser, un composant XPC aura des droits et privilèges différents des autres composants XPC ou du binaire principal de l'application. SAUF si un service XPC est configuré avec JoinExistingSession défini sur "True" dans son fichier Info.plist. Dans ce cas, le service XPC s'exécutera dans la même session de sécurité que l'application qui l'a appelé.
Les services XPC sont démarrés par launchd lorsque nécessaire et arrêtés une fois toutes les tâches complétées pour libérer les ressources système. Les composants XPC spécifiques à l'application ne peuvent être utilisés que par l'application, réduisant ainsi le risque associé aux vulnérabilités potentielles.
Services XPC à l'échelle du système
Les services XPC à l'échelle du système sont accessibles à tous les utilisateurs. Ces services, de type launchd ou Mach, doivent être définis dans des fichiers plist situés dans des répertoires spécifiés tels que /System/Library/LaunchDaemons, /Library/LaunchDaemons, /System/Library/LaunchAgents, ou /Library/LaunchAgents.
Ces fichiers plist auront une clé appelée MachServices avec le nom du service, et une clé appelée Program avec le chemin vers le binaire :
Les éléments dans LaunchDameons sont exécutés par root. Ainsi, si un processus non privilégié peut communiquer avec l'un d'eux, il pourrait être capable d'escalader les privilèges.
Messages d'événements XPC
Les applications peuvent s'abonner à différents messages d'événements, leur permettant d'être initiées à la demande lorsque de tels événements se produisent. La configuration de ces services est effectuée dans les fichiers plist de launchd, situés dans les mêmes répertoires que les précédents et contenant une clé supplémentaire LaunchEvent.
Vérification du processus de connexion XPC
Lorsqu'un processus tente d'appeler une méthode via une connexion XPC, le service XPC devrait vérifier si ce processus est autorisé à se connecter. Voici les moyens courants de vérifier cela et les pièges courants :
Apple permet également aux applications de configurer certains droits et comment les obtenir donc si le processus appelant les possède, il serait autorisé à appeler une méthode du service XPC :
Pour renifler les messages XPC, vous pourriez utiliser xpcspy qui utilise Frida.
# 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
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plistversion="1.0"><dict><key>Label</key><string>xyz.hacktricks.service</string><key>MachServices</key><dict><key>xyz.hacktricks.service</key><true/></dict><key>Program</key><string>/tmp/xpc_server</string><key>ProgramArguments</key><array><string>/tmp/xpc_server</string></array></dict></plist>
# 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
Exemple de code Objective-C pour la communication XPC
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plistversion="1.0"><dict><key>Label</key><string>xyz.hacktricks.svcoc</string><key>MachServices</key><dict><key>xyz.hacktricks.svcoc</key><true/></dict><key>Program</key><string>/tmp/oc_xpc_server</string><key>ProgramArguments</key><array><string>/tmp/oc_xpc_server</string></array></dict></plist>
```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