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
- VĂ©rifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépÎts github.
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 :
- 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.
- 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.
- 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.
- (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.
- (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).
- Si cela n'est pas vĂ©rifiĂ©, le client pourrait ĂȘtre vulnĂ©rable Ă l'injection de code.
- VĂ©rifiez si le processus de connexion a un droit qui lui permet de se connecter au service. Cela s'applique aux binaires Apple.
- 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 dexpc_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 :
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
.
- (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 :
[...]
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 :
[...]
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
- VĂ©rifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépÎts github.