macOS XPC Connecting Process Check

Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

Έλεγχος Σύνδεσης Διεργασίας XPC

Όταν γίνεται μια σύνδεση σε ένα XPC service, ο διακομιστής θα ελέγξει αν η σύνδεση επιτρέπεται. Αυτοί είναι οι έλεγχοι που συνήθως πραγματοποιούνται:

  1. Έλεγχος αν η συνδεόμενη διεργασία έχει υπογραφεί με ένα Apple-signed πιστοποιητικό (που δίνεται μόνο από την Apple).

  • Εάν αυτό δεν επαληθευτεί, ένας επιτιθέμενος μπορεί να δημιουργήσει ένα ψεύτικο πιστοποιητικό για να ταιριάξει με οποιονδήποτε άλλο έλεγχο.

  1. Έλεγχος αν η συνδεόμενη διεργασία έχει υπογραφεί με το πιστοποιητικό του οργανισμού (έλεγχος ταυτότητας του ομάδας).

  • Εάν αυτό δεν επαληθευτεί, μπορεί να χρησιμοποιηθεί οποιοδήποτε πιστοποιητικό ανάπτυξης από την Apple για την υπογραφή και τη σύνδεση με την υπηρεσία.

  1. Έλεγχος αν η συνδεόμενη διεργασία περιέχει έναν κατάλληλο αναγνωριστικό πακέτου.

  • Εάν αυτό δεν επαληθευτεί, οποιοδήποτε εργαλείο που έχει υπογραφεί από τον ίδιο οργανισμό μπορεί να χρησιμοποιηθεί για την αλληλεπίδραση με την XPC υπηρεσία.

  1. (4 ή 5) Έλεγχος αν η συνδεόμενη διεργασία έχει έναν κατάλληλο αριθμό έκδοσης λογισμικού.

  • Εάν αυτό δεν επαληθευτεί, μπορεί να χρησιμοποιηθεί μια παλιά, ευάλωτη πελάτης που είναι ευάλωτη στην ενέργεια εισαγωγής διεργασίας για να συνδεθεί με την XPC υπηρεσία, ακόμα και με τους άλλους ελέγχους που έχουν γίνει.

  1. (4 ή 5) Έλεγχος αν η συνδεόμενη διεργασία έχει ενεργοποιημένο το hardened runtime χωρίς επικίνδυνα entitlements (όπως αυτά που επιτρέπουν τη φόρτωση αυθαίρετων βιβλιοθηκών ή τη χρήση μεταβλητών περιβάλλοντος DYLD)

  2. Εάν αυτό δεν επαληθευτεί, ο πελάτης μπορεί να είναι ευάλωτος σε εισαγωγή κώδικα

  3. Έλεγχος αν η συνδεόμενη διεργασία έχει ένα entitlement που της επιτρέπει να συνδεθεί στην υπηρεσία. Αυτό ισχύει για τα δυαδικά αρχεία της Apple.

  4. Η επαλήθευση πρέπει να γίνεται βάσει του αναγνωριστικού ελέγχου του πελάτη αντί για το αναγνωριστικό διεργασίας (PID), καθώς το πρώτο αποτρέπει τις επιθέσεις επαναχρησιμοποίησης του PID.

  • Οι προγραμματιστές σπάνια χρησιμοποιούν την κλήση API του αναγνωριστικού ελέγχου καθώς είναι ιδιωτική, οπότε η Apple μπορεί να την αλλάξει ανά πάσα στιγμή. Επιπλέον, η χρήση ιδιωτικής API δεν επιτρέπεται σε εφαρμογές του Mac App Store.

  • Εάν χρησιμοποιηθεί η μέθοδος processIdentifier, μπορεί να είναι ευάλωτη

  • Πρέπει να χρησιμοποιηθεί η μέθοδος xpc_dictionary_get_audit_token αντί της xpc_connection_get_audit_token, καθώς η τελευταία μπορεί επίσης να είναι ευάλωτη σε συγκεκριμένες καταστάσεις.

Επιθέσεις Επικοινωνίας

Για περισσότερες πληροφορίες σχετικά με την επίθεση επαναχρησιμοποίησης του PID, ελέγξτε:

Για περισσότερες πληροφορ

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

Το αντικείμενο NSXPCConnection έχει μια ιδιωτική ιδιότητα auditToken (αυτή που πρέπει να χρησιμοποιηθεί αλλά μπορεί να αλλάξει) και μια δημόσια ιδιότητα processIdentifier (αυτή που δεν πρέπει να χρησιμοποιηθεί).

Η διαδικασία σύνδεσης μπορεί να επαληθευτεί με κάτι όπως:

[...]
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))

Αν ένας προγραμματιστής δεν θέλει να ελέγξει την έκδοση του πελάτη, μπορεί τουλάχιστον να ελέγξει ότι ο πελάτης δεν είναι ευάλωτος στην ενέργεια εισαγωγής διεργασίας:

[...]
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
}
Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

Last updated