hacktricks/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-ipc-inter-process-communication/macos-xpc-connecting-process-check.md
2023-06-03 13:10:46 +00:00

7.2 KiB

Vérification de la connexion de processus XPC sur macOS

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Vérification de la connexion de processus XPC

Lorsqu'une connexion est établie vers un service XPC, le serveur vérifie si la connexion est autorisée. Voici les vérifications qu'il effectue généralement :

  1. Vérifier si le processus de connexion est signé avec un certificat signé par Apple (uniquement fourni par Apple).
    • Si cela n'est pas vérifié, un attaquant peut créer un faux certificat pour correspondre à toute autre vérification.
  2. Vérifier si le processus de connexion est signé avec le certificat de l'organisation (vérification de l'ID d'équipe).
    • Si cela n'est pas vérifié, n'importe quel certificat de développeur d'Apple peut être utilisé pour la signature et la connexion au service.
  3. Vérifier si le processus de connexion contient un identifiant de bundle approprié.
  4. Vérifier si le processus de connexion a un numéro de version logicielle approprié.
    • Si cela n'est pas vérifié, des clients anciens et non sécurisés, vulnérables à l'injection de processus, peuvent être utilisés pour se connecter au service XPC même si les autres vérifications sont en place.
  5. Vérifier si le processus de connexion possède une autorisation qui lui permet de se connecter au service. Cela s'applique aux binaires Apple.
  6. La vérification doit être basée sur le jeton d'audit du client de connexion plutôt que sur son identifiant de processus (PID) car le premier empêche les attaques de réutilisation de PID.
    • Les développeurs utilisent rarement l'appel d'API de jeton d'audit car il est privé, donc Apple pourrait le changer à tout moment. De plus, l'utilisation d'API privées n'est pas autorisée dans les applications Mac App Store.

Pour plus d'informations sur la vérification de l'attaque de réutilisation de PID :

{% content-ref url="macos-pid-reuse.md" %} macos-pid-reuse.md {% endcontent-ref %}

Exemples de code

Le serveur implémentera cette vérification dans une fonction appelée shouldAcceptNewConnection.

- (BOOL)listener:(NSXPCListener *)listener shouldAcceptNewConnection:(NSXPCConnection *)newConnection {
    //Check connection
    return YES;
}

{% endcode %}

L'objet NSXPCConnection a une propriété auditToken privée (celle qui devrait être utilisée mais qui pourrait changer) et une propriété processIdentifier publique (celle qui ne devrait pas être utilisée).

Le processus de connexion peut être vérifié avec quelque chose comme:

{% code overflow="wrap" %}

[...]
SecRequirementRef requirementRef = NULL;
NSString requirementString = @"anchor apple generic and identifier \"xyz.hacktricks.service\" and certificate leaf [subject.CN] = \"TEAMID\" and info [CFBundleShortVersionString] >= \"1.0\"";
/* Check:
- Signed by a cert signed by Apple
- Check the bundle ID
- Check the TEAMID of the signing cert
- Check the version used
*/

// Check the requirements
SecRequirementCreateWithString(requirementString, kSecCSDefaultFlags, &requirementRef);
SecCodeCheckValidity(code, kSecCSDefaultFlags, requirementRef);

{% endcode %}

Si un développeur ne veut pas vérifier la version du client, il pourrait au moins vérifier que le client n'est pas vulnérable à l'injection de processus :

{% code overflow="wrap" %}

[...]
CFDictionaryRef csInfo = NULL;
SecCodeCopySigningInformation(code, kSecCSDynamicInformation, &csInfo);
uint32_t csFlags = [((__bridge NSDictionary *)csInfo)[(__bridge NSString *)kSecCodeInfoStatus] intValue];
const uint32_t cs_hard = 0x100;        // don't load invalid page. 
const uint32_t cs_kill = 0x200;        // Kill process if page is invalid
const uint32_t cs_restrict = 0x800;    // Prevent debugging
const uint32_t cs_require_lv = 0x2000; // Library Validation
const uint32_t cs_runtime = 0x10000;   // hardened runtime
if ((csFlags & (cs_hard | cs_require_lv)) {
    return Yes; // Accept connection
}

{% endcode %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥