7.6 KiB
Vérification de la connexion XPC sur macOS
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- Travaillez-vous dans une entreprise de cybersécurité ? Voulez-vous voir votre entreprise annoncée dans HackTricks ? ou voulez-vous avoir accès à la dernière version de PEASS ou télécharger HackTricks en PDF ? Consultez les PLANS D'ABONNEMENT !
- Découvrez The PEASS Family, notre collection exclusive de NFTs
- Obtenez le swag officiel PEASS & HackTricks
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez moi sur Twitter 🐦@carlospolopm.
- Partagez vos astuces de piratage en soumettant des PR au repo hacktricks et au repo hacktricks-cloud.
Vérification de la connexion 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 :
- 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.
- Vérifier si le processus de connexion est signé avec le certificat de l'organisation (vérification de l'ID de l'é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.
- Vérifier si le processus de connexion contient un identifiant de bundle approprié.
- 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.
- Vérifier si le processus de connexion a une autorisation 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 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 %}
Trustcache - Prévention des attaques de rétrogradation
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. Ce qui empêche l'exécution de versions de rétrogradation.
Exemples de code
Le serveur implémentera cette vérification dans une fonction appelée shouldAcceptNewConnection
.
{% code overflow="wrap" %}
- (BOOL)listener:(NSXPCListener *)listener shouldAcceptNewConnection:(NSXPCConnection *)newConnection {
//Check connection
return YES;
}
{% endcode %}
L'objet NSXPCConnection a une propriété privée appelée auditToken
(celle qui devrait être utilisée mais qui pourrait changer) et une propriété publique appelée processIdentifier
(celle qui ne devrait pas être utilisée).
Le processus de connexion pourrait ê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);
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 🎥
- Travaillez-vous dans une entreprise de cybersécurité ? Voulez-vous voir votre entreprise annoncée dans HackTricks ? ou voulez-vous avoir accès à la dernière version de PEASS ou télécharger HackTricks en PDF ? Consultez les PLANS D'ABONNEMENT !
- Découvrez The PEASS Family, notre collection exclusive de NFTs
- Obtenez le swag officiel PEASS & HackTricks
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez moi sur Twitter 🐦@carlospolopm.
- Partagez vos astuces de piratage en soumettant des PR au repo hacktricks et au repo hacktricks-cloud.