macOS XPC
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
XPC, που σημαίνει XNU (ο πυρήνας που χρησιμοποιείται από το macOS) inter-Process Communication, είναι ένα πλαίσιο για επικοινωνία μεταξύ διεργασιών στο macOS και το iOS. Το XPC παρέχει έναν μηχανισμό για την πραγματοποίηση ασφαλών, ασύγχρονων κλήσεων μεθόδων μεταξύ διαφορετικών διεργασιών στο σύστημα. Είναι μέρος της ασφάλειας της Apple, επιτρέποντας τη δημιουργία εφαρμογών με διαχωρισμένα δικαιώματα όπου κάθε συστατικό εκτελείται με μόνο τα δικαιώματα που χρειάζεται για να κάνει τη δουλειά του, περιορίζοντας έτσι τη δυνητική ζημιά από μια συμβιβασμένη διεργασία.
Το XPC χρησιμοποιεί μια μορφή Επικοινωνίας Μεταξύ Διεργασιών (IPC), η οποία είναι ένα σύνολο μεθόδων για διαφορετικά προγράμματα που εκτελούνται στο ίδιο σύστημα να στέλνουν δεδομένα πίσω και μπροστά.
Τα κύρια οφέλη του XPC περιλαμβάνουν:
Ασφάλεια: Με τον διαχωρισμό της εργασίας σε διαφορετικές διεργασίες, κάθε διεργασία μπορεί να έχει μόνο τα δικαιώματα που χρειάζεται. Αυτό σημαίνει ότι ακόμη και αν μια διεργασία συμβιβαστεί, έχει περιορισμένη ικανότητα να προκαλέσει ζημιά.
Σταθερότητα: Το XPC βοηθά στην απομόνωση των κραστών στο συστατικό όπου συμβαίνουν. Εάν μια διεργασία κρασάρει, μπορεί να επανεκκινηθεί χωρίς να επηρεάσει το υπόλοιπο σύστημα.
Απόδοση: Το XPC επιτρέπει εύκολη ταυτόχρονη εκτέλεση, καθώς διαφορετικές εργασίες μπορούν να εκτελούνται ταυτόχρονα σε διαφορετικές διεργασίες.
Η μόνη ανεπιθύμητη συνέπεια είναι ότι ο διαχωρισμός μιας εφαρμογής σε πολλές διεργασίες που επικοινωνούν μέσω XPC είναι λιγότερο αποδοτικός. Αλλά στα σημερινά συστήματα αυτό δεν είναι σχεδόν αισθητό και τα οφέλη είναι καλύτερα.
Τα XPC συστατικά μιας εφαρμογής είναι μέσα στην ίδια την εφαρμογή. Για παράδειγμα, στο Safari μπορείτε να τα βρείτε στο /Applications/Safari.app/Contents/XPCServices
. Έχουν επέκταση .xpc
(όπως com.apple.Safari.SandboxBroker.xpc
) και είναι επίσης πακέτα με το κύριο δυαδικό αρχείο μέσα σε αυτό: /Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/MacOS/com.apple.Safari.SandboxBroker
και ένα Info.plist: /Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/Info.plist
Όπως μπορεί να σκέφτεστε, ένα συστατικό XPC θα έχει διαφορετικά δικαιώματα και προνόμια από τα άλλα συστατικά XPC ή το κύριο δυαδικό αρχείο της εφαρμογής. ΕΚΤΟΣ αν μια υπηρεσία XPC είναι ρυθμισμένη με JoinExistingSession ρυθμισμένη σε “True” στο αρχείο Info.plist της. Σε αυτή την περίπτωση, η υπηρεσία XPC θα εκτελείται στην ίδια ασφαλή συνεδρία με την εφαρμογή που την κάλεσε.
Οι υπηρεσίες XPC ξεκινούνται από launchd όταν απαιτείται και κλείνουν μόλις ολοκληρωθούν όλες οι εργασίες για να απελευθερωθούν οι πόροι του συστήματος. Τα XPC συστατικά που είναι συγκεκριμένα για την εφαρμογή μπορούν να χρησιμοποιηθούν μόνο από την εφαρμογή, μειώνοντας έτσι τον κίνδυνο που σχετίζεται με πιθανές ευπάθειες.
Οι υπηρεσίες XPC σε επίπεδο συστήματος είναι προσβάσιμες σε όλους τους χρήστες. Αυτές οι υπηρεσίες, είτε launchd είτε τύπου Mach, πρέπει να είναι καθορισμένες σε αρχεία plist που βρίσκονται σε καθορισμένους καταλόγους όπως /System/Library/LaunchDaemons
, /Library/LaunchDaemons
, /System/Library/LaunchAgents
, ή /Library/LaunchAgents
.
Αυτά τα αρχεία plists θα έχουν ένα κλειδί που ονομάζεται MachServices
με το όνομα της υπηρεσίας, και ένα κλειδί που ονομάζεται Program
με τη διαδρομή προς το δυαδικό αρχείο:
The ones in LaunchDameons
είναι εκτελούμενες από τον root. Έτσι, αν μια διαδικασία χωρίς δικαιώματα μπορεί να επικοινωνήσει με μία από αυτές, θα μπορούσε να είναι σε θέση να αναβαθμίσει τα δικαιώματα.
xpc_object_t
Κάθε μήνυμα XPC είναι ένα αντικείμενο λεξικού που απλοποιεί τη σειριοποίηση και την αποσειριοποίηση. Επιπλέον, το libxpc.dylib
δηλώνει τους περισσότερους από τους τύπους δεδομένων, οπότε είναι δυνατό να διασφαλιστεί ότι τα ληφθέντα δεδομένα είναι του αναμενόμενου τύπου. Στο C API, κάθε αντικείμενο είναι ένα xpc_object_t
(και ο τύπος του μπορεί να ελεγχθεί χρησιμοποιώντας το xpc_get_type(object)
).
Επιπλέον, η συνάρτηση xpc_copy_description(object)
μπορεί να χρησιμοποιηθεί για να αποκτήσει μια συμβολοσειρά αναπαράστασης του αντικειμένου που μπορεί να είναι χρήσιμη για σκοπούς αποσφαλμάτωσης.
Αυτά τα αντικείμενα έχουν επίσης μερικές μεθόδους για κλήση όπως xpc_<object>_copy
, xpc_<object>_equal
, xpc_<object>_hash
, xpc_<object>_serialize
, xpc_<object>_deserialize
...
Τα xpc_object_t
δημιουργούνται καλώντας τη συνάρτηση xpc_<objetType>_create
, η οποία εσωτερικά καλεί το _xpc_base_create(Class, Size)
όπου υποδεικνύεται ο τύπος της κλάσης του αντικειμένου (ένας από τους XPC_TYPE_*
) και το μέγεθός του (κάποια επιπλέον 40B θα προστεθούν στο μέγεθος για μεταδεδομένα). Αυτό σημαίνει ότι τα δεδομένα του αντικειμένου θα ξεκινούν από την απόσταση 40B.
Επομένως, το xpc_<objectType>_t
είναι κάπως μια υποκλάση του xpc_object_t
, η οποία θα ήταν υποκλάση του os_object_t*
.
Σημειώστε ότι θα πρέπει να είναι ο προγραμματιστής που χρησιμοποιεί το xpc_dictionary_[get/set]_<objectType>
για να αποκτήσει ή να ορίσει τον τύπο και την πραγματική τιμή ενός κλειδιού.
xpc_pipe
Ένα xpc_pipe
είναι ένας σωλήνας FIFO που οι διαδικασίες μπορούν να χρησιμοποιήσουν για να επικοινωνήσουν (η επικοινωνία χρησιμοποιεί μηνύματα Mach).
Είναι δυνατό να δημιουργηθεί ένας XPC server καλώντας το xpc_pipe_create()
ή το xpc_pipe_create_from_port()
για να τον δημιουργήσει χρησιμοποιώντας μια συγκεκριμένη θύρα Mach. Στη συνέχεια, για να λάβει μηνύματα, είναι δυνατό να καλέσει το xpc_pipe_receive
και το xpc_pipe_try_receive
.
Σημειώστε ότι το αντικείμενο xpc_pipe
είναι ένα xpc_object_t
με πληροφορίες στη δομή του σχετικά με τις δύο θύρες Mach που χρησιμοποιούνται και το όνομα (αν υπάρχει). Το όνομα, για παράδειγμα, ο δαίμονας secinitd
στο plist του /System/Library/LaunchDaemons/com.apple.secinitd.plist
ρυθμίζει τον σωλήνα που ονομάζεται com.apple.secinitd
.
Ένα παράδειγμα ενός xpc_pipe
είναι ο bootstrap pipe που δημιουργείται από το launchd
καθιστώντας δυνατή την κοινή χρήση θύρων Mach.
NSXPC*
Αυτά είναι αντικείμενα υψηλού επιπέδου Objective-C που επιτρέπουν την αφαίρεση των συνδέσεων XPC. Επιπλέον, είναι πιο εύκολο να αποσφαλματωθούν αυτά τα αντικείμενα με το DTrace από τα προηγούμενα.
GCD Queues
Το XPC χρησιμοποιεί GCD για να περάσει μηνύματα, επιπλέον δημιουργεί ορισμένες ουρές εκχώρησης όπως xpc.transactionq
, xpc.io
, xpc-events.add-listenerq
, xpc.service-instance
...
Αυτά είναι πακέτα με επέκταση .xpc
που βρίσκονται μέσα στον φάκελο XPCServices
άλλων έργων και στο Info.plist
έχουν τον τύπο πακέτου CFBundlePackageType
ρυθμισμένο σε XPC!
.
Αυτό το αρχείο έχει άλλες ρυθμιστικές κλειδιά όπως το ServiceType
που μπορεί να είναι Application, User, System ή _SandboxProfile
που μπορεί να ορίσει ένα sandbox ή _AllowedClients
που μπορεί να υποδεικνύει δικαιώματα ή ID που απαιτούνται για να επικοινωνήσουν με τον σερ. Αυτά και άλλες ρυθμιστικές επιλογές θα είναι χρήσιμες για να ρυθμίσουν την υπηρεσία κατά την εκκίνηση.
Η εφαρμογή προσπαθεί να συνδεθεί με μια υπηρεσία XPC χρησιμοποιώντας το xpc_connection_create_mach_service
, στη συνέχεια το launchd εντοπίζει τον δαίμονα και εκκινεί το xpcproxy
. Το xpcproxy
επιβάλλει τις ρυθμισμένες περιορισμούς και δημιουργεί την υπηρεσία με τις παρεχόμενες FDs και θύρες Mach.
Για να βελτιωθεί η ταχύτητα αναζήτησης της υπηρεσίας XPC, χρησιμοποιείται μια κρυφή μνήμη.
Είναι δυνατό να παρακολουθήσετε τις ενέργειες του xpcproxy
χρησιμοποιώντας:
Η βιβλιοθήκη XPC χρησιμοποιεί kdebug
για να καταγράψει ενέργειες καλώντας xpc_ktrace_pid0
και xpc_ktrace_pid1
. Οι κωδικοί που χρησιμοποιεί είναι αδημοσίευτοι, οπότε είναι απαραίτητο να προστεθούν στο /usr/share/misc/trace.codes
. Έχουν το πρόθεμα 0x29
και για παράδειγμα ένας είναι 0x29000004
: XPC_serializer_pack
.
Το εργαλείο xpcproxy
χρησιμοποιεί το πρόθεμα 0x22
, για παράδειγμα: 0x2200001c: xpcproxy:will_do_preexec
.
Οι εφαρμογές μπορούν να εγγραφούν σε διάφορα μηνύματα εκδηλώσεων, επιτρέποντάς τους να ξεκινούν κατόπιν αιτήματος όταν συμβαίνουν τέτοιες εκδηλώσεις. Η ρύθμιση για αυτές τις υπηρεσίες γίνεται σε αρχεία plist του launchd, που βρίσκονται στους ίδιους καταλόγους με τους προηγούμενους και περιέχουν ένα επιπλέον κλειδί LaunchEvent
.
Όταν μια διαδικασία προσπαθεί να καλέσει μια μέθοδο μέσω μιας σύνδεσης XPC, η υπηρεσία XPC θα πρέπει να ελέγξει αν αυτή η διαδικασία επιτρέπεται να συνδεθεί. Ακολουθούν οι κοινές μέθοδοι για να το ελέγξετε και οι κοινές παγίδες:
macOS XPC Connecting Process CheckΗ Apple επιτρέπει επίσης στις εφαρμογές να ρυθμίζουν ορισμένα δικαιώματα και πώς να τα αποκτούν, έτσι ώστε αν η καλούσα διαδικασία τα έχει, θα επιτρέπεται να καλέσει μια μέθοδο από την υπηρεσία XPC:
macOS XPC AuthorizationΓια να καταγράψετε τα μηνύματα XPC, μπορείτε να χρησιμοποιήσετε xpcspy που χρησιμοποιεί Frida.
Ένα άλλο πιθανό εργαλείο που μπορεί να χρησιμοποιηθεί είναι το XPoCe2.
Αυτή η λειτουργικότητα που παρέχεται από το RemoteXPC.framework
(από το libxpc
) επιτρέπει την επικοινωνία μέσω XPC μέσω διαφορετικών hosts.
Οι υπηρεσίες που υποστηρίζουν το remote XPC θα έχουν στο plist τους το κλειδί UsesRemoteXPC όπως είναι η περίπτωση του /System/Library/LaunchDaemons/com.apple.SubmitDiagInfo.plist
. Ωστόσο, αν και η υπηρεσία θα είναι καταχωρημένη με το launchd
, είναι το UserEventAgent
με τα plugins com.apple.remoted.plugin
και com.apple.remoteservicediscovery.events.plugin
που παρέχει τη λειτουργικότητα.
Επιπλέον, το RemoteServiceDiscovery.framework
επιτρέπει την απόκτηση πληροφοριών από το com.apple.remoted.plugin
εκθέτοντας συναρτήσεις όπως get_device
, get_unique_device
, connect
...
Μόλις χρησιμοποιηθεί το connect και συγκεντρωθεί το socket fd
της υπηρεσίας, είναι δυνατή η χρήση της κλάσης remote_xpc_connection_*
.
Είναι δυνατή η απόκτηση πληροφοριών σχετικά με τις απομακρυσμένες υπηρεσίες χρησιμοποιώντας το cli εργαλείο /usr/libexec/remotectl
χρησιμοποιώντας παραμέτρους όπως:
Η επικοινωνία μεταξύ του BridgeOS και του host πραγματοποιείται μέσω μιας ειδικής διεπαφής IPv6. Το MultiverseSupport.framework
επιτρέπει τη δημιουργία sockets των οποίων το fd
θα χρησιμοποιηθεί για την επικοινωνία.
Είναι δυνατόν να βρείτε αυτές τις επικοινωνίες χρησιμοποιώντας netstat
, nettop
ή την ανοιχτού κώδικα επιλογή, netbottom
.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)