macOS XPC Connecting Process Check

Reading time: 5 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks

XPC Connecting Process Check

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

  1. Vérifiez si le processus de connexion est signé avec un certificat signé par Apple (uniquement délivré par Apple).
  • Si cela n'est pas vĂ©rifiĂ©, un attaquant pourrait crĂ©er un certificat falsifiĂ© pour correspondre Ă  toute autre vĂ©rification.
  1. Vérifiez 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Ă©, tout certificat de dĂ©veloppeur d'Apple peut ĂȘtre utilisĂ© pour signer et se connecter au service.
  1. Vérifiez si le processus de connexion contient un ID de bundle approprié.
  • Si cela n'est pas vĂ©rifiĂ©, tout outil signĂ© par la mĂȘme org pourrait ĂȘtre utilisĂ© pour interagir avec le service XPC.
  1. (4 ou 5) Vérifiez si le processus de connexion a un numéro de version de logiciel approprié.
  • Si cela n'est pas vĂ©rifiĂ©, un ancien client non sĂ©curisĂ©, vulnĂ©rable Ă  l'injection de processus, pourrait ĂȘtre utilisĂ© pour se connecter au service XPC mĂȘme avec les autres vĂ©rifications en place.
  1. (4 ou 5) VĂ©rifiez si le processus de connexion a un runtime durci sans droits dangereux (comme ceux qui permettent de charger des bibliothĂšques arbitraires ou d'utiliser des variables d'environnement DYLD).
  2. Si cela n'est pas vĂ©rifiĂ©, le client pourrait ĂȘtre vulnĂ©rable Ă  l'injection de code.
  3. VĂ©rifiez si le processus de connexion a un droit qui lui permet de se connecter au service. Cela s'applique aux binaires Apple.
  4. La vĂ©rification doit ĂȘtre basĂ©e sur le jeton d'audit du client de connexion au lieu de son ID de processus (PID) puisque le premier empĂȘche les attaques de rĂ©utilisation de PID.
  • Les dĂ©veloppeurs utilisent rarement l'API de jeton d'audit car elle est privĂ©e, donc Apple pourrait changer Ă  tout moment. De plus, l'utilisation d'API privĂ©es n'est pas autorisĂ©e dans les applications du Mac App Store.
  • Si la mĂ©thode processIdentifier est utilisĂ©e, elle pourrait ĂȘtre vulnĂ©rable.
  • xpc_dictionary_get_audit_token devrait ĂȘtre utilisĂ© Ă  la place de xpc_connection_get_audit_token, car ce dernier pourrait Ă©galement ĂȘtre vulnĂ©rable dans certaines situations.

Communication Attacks

Pour plus d'informations sur l'attaque de réutilisation de PID, consultez :

macOS PID Reuse

Pour plus d'informations sur l'attaque xpc_connection_get_audit_token, consultez :

macOS xpc_connection_get_audit_token Attack

Trustcache - Downgrade Attacks Prevention

Trustcache est une mĂ©thode dĂ©fensive introduite dans les machines Apple Silicon qui stocke une base de donnĂ©es de CDHSAH des binaires Apple afin que seuls les binaires non modifiĂ©s autorisĂ©s puissent ĂȘtre exĂ©cutĂ©s. Cela empĂȘche l'exĂ©cution de versions rĂ©trogrades.

Code Examples

Le serveur mettra en Ɠuvre cette vĂ©rification dans une fonction appelĂ©e shouldAcceptNewConnection.

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

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

Le processus de connexion pourrait ĂȘtre vĂ©rifiĂ© avec quelque chose comme :

objectivec
[...]
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 with the PID (vulnerable)
SecRequirementCreateWithString(requirementString, kSecCSDefaultFlags, &requirementRef);
SecCodeCheckValidity(code, kSecCSDefaultFlags, requirementRef);

// Check the requirements wuing the auditToken (secure)
SecTaskRef taskRef = SecTaskCreateWithAuditToken(NULL, ((ExtendedNSXPCConnection*)newConnection).auditToken);
SecTaskValidateForRequirement(taskRef, (__bridge CFStringRef)(requirementString))

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

objectivec
[...]
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
}

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks