macOS IPC - Inter Process Communication
Μηνύματα Mach μέσω Θυρών
Βασικές Πληροφορίες
Το Mach χρησιμοποιεί εργασίες ως τη μικρότερη μονάδα για την κοινή χρήση πόρων, και κάθε εργασία μπορεί να περιέχει πολλά νήματα. Αυτές οι εργασίες και νήματα αντιστοιχούν 1:1 σε διεργασίες και νήματα POSIX.
Η επικοινωνία μεταξύ εργασιών πραγματοποιείται μέσω της Διαδικασίας Επικοινωνίας Διεργασίας Mach (IPC), χρησιμοποιώντας μονοδιευθυντικά κανάλια επικοινωνίας. Τα μηνύματα μεταφέρονται μεταξύ θυρών, οι οποίες λειτουργούν ως είδος ουράς μηνυμάτων που διαχειρίζεται το πυρήνας.
Μια θύρα είναι το βασικό στοιχείο της Mach IPC. Μπορεί να χρησιμοποιηθεί για να στείλει μηνύματα και να τα λαμβάνει.
Κάθε διεργασία έχει μια πίνακα IPC, όπου είναι δυνατό να βρεθούν οι θύρες mach της διεργασίας. Το όνομα μιας θύρας mach είναι πραγματικά ένας αριθμός (ένας δείκτης στο αντικείμενο πυρήνα).
Μια διεργασία μπορεί επίσης να στείλει ένα όνομα θύρας με κάποια δικαιώματα σε μια διαφορετική εργασία και το πυρήνας θα κάνει αυτήν την καταχώριση στο πίνακα IPC της άλλης εργασίας να εμφανιστεί.
Δικαιώματα Θύρας
Τα δικαιώματα θύρας, τα οποία καθορίζουν ποιες λειτουργίες μπορεί να εκτελέσει μια εργασία, είναι καίριας σημασίας για αυτήν την επικοινωνία. Τα πιθανά δικαιώματα θύρας είναι (ορισμοί από εδώ):
Δικαίωμα Λήψης, το οποίο επιτρέπει τη λήψη μηνυμάτων που στέλνονται στη θύρα. Οι θύρες Mach είναι ουρές MPSC (πολλαπλών παραγωγών, μονός καταναλωτής), που σημαίνει ότι μπορεί να υπάρχει μόνο ένα δικαίωμα λήψης για κάθε θύρα σε ολόκληρο το σύστημα (διαφορετικά από τα αγωγά, όπου πολλές διεργασίες μπορούν να κρατούν όλες δείκτες αρχείων στο άκρο ανάγνωσης ενός αγωγού).
Μια εργασία με το Δικαίωμα Λήψης μπορεί να λαμβάνει μηνύματα και να δημιουργεί Δικαιώματα Αποστολής, επιτρέποντάς της να στέλνει μηνύματα. Αρχικά μόνο η ίδια εργασία έχει το Δικαίωμα Λήψης πάνω από τη θύρα της.
Εάν ο κάτοχος του Δικαιώματος Λήψης πεθάνει ή το κλείσει, το δικαίωμα αποστολής γίνεται άχρηστο (νεκρό όνομα).
Δικαίωμα Αποστολής, το οποίο επιτρέπει την αποστολή μηνυμάτων στη θύρα.
Το Δικαίωμα Αποστολής μπορεί να κλωνοποιηθεί έτσι μια εργασία που κατέχει ένα Δικαίωμα Αποστολής μπορεί να κλωνοποιήσει το δικαίωμα και να το χορηγήσει σε μια τρίτη εργασία.
Σημειώστε ότι τα δικαιώματα θύρας μπορούν επίσης να περάσουν μέσω μηνυμάτων Mac.
Δικαίωμα Αποστολής-Μία-Φορά, το οποίο επιτρέπει την αποστολή ενός μηνύματος στη θύρα και στη συνέχεια εξαφανίζεται.
Αυτό το δικαίωμα δεν μπορεί να κλωνοποιηθεί, αλλά μπορεί να μετακινηθεί.
Δικαίωμα Συνόλου Θυρών, το οποίο υποδηλώνει ένα σύνολο θυρών αντί για μια μεμονωμένη θύρα. Η αποσύνθεση ενός μηνύματος από ένα σύνολο θυρών αποσύρει ένα μήνυμα από μία από τις θύρες που περιέχει. Τα σύνολα θυρών μπορούν να χρησιμοποιηθούν για να ακούσουν ταυτόχρονα σε πολλές θύρες, πολύ παρόμοια με το
select
/poll
/epoll
/kqueue
στο Unix.Νεκρό Όνομα, το οποίο δεν είναι ένα πραγματικό δικαίωμα θύρας, αλλά απλώς ένας αντικαταστάτης. Όταν μια θύρα καταστραφεί, όλα τα υπάρχοντα δικαιώματα θύρας στη θύρα γίνονται νεκρά ονόματα.
Οι εργασίες μπορούν να μεταφέρουν ΔΙΚΑΙΩΜΑΤΑ ΑΠΟΣΤΟΛΗΣ σε άλλους, επιτρέποντάς τους να στέλνουν μηνύματα πίσω. Τα ΔΙΚΑΙΩΜΑΤΑ ΑΠΟΣΤΟΛΗΣ μπορούν επίσης να κλωνοποιηθούν, έτσι μια εργασία μπορεί να διπλασιάσει και να δώσει το δικαίωμα σε μια τρίτη εργασία. Αυτό, σε συνδυασμό με ένα ενδιάμεσο διεργασία γνωστό ως διακομιστής εκκίνησης, επιτρέπει αποτελεσματική επικοινωνία μεταξύ εργασιών.
Θύρες Αρχείων
Οι θύρες αρχείων επιτρέπουν την ενθυλάκωση αριθμού αρχείου σε θύρες Mac (χρησιμοποιώντας δικαιώματα θύρας Mach). Είναι δυνατόν να δημιουργηθεί ένα fileport
από έναν δεδομένο FD χρησιμοποιώντας το fileport_makeport
και να δημιουργηθεί ένα FD από ένα fileport χρησιμοποιώντας το fileport_makefd
.
Καθιέρωση Επικοινωνίας
Όπως αναφέρθηκε προηγουμένως, είναι δυνατό να στείλετε δικαιώματα χρησιμοποιώντας μηνύματα Mach, ωστόσο, δεν μπορείτε να στείλετε ένα δικαίωμα χωρίς να έχετε ήδη ένα δικαίωμα για να
Ένα Μήνυμα Mach
Βρείτε περισσότερες πληροφορίες εδώ
Η συνάρτηση mach_msg
, ουσιαστικά ένα κάλεσμα συστήματος, χρησιμοποιείται για την αποστολή και λήψη μηνυμάτων Mach. Η συνάρτηση απαιτεί το μήνυμα που θα αποσταλεί ως αρχικό όρισμα. Αυτό το μήνυμα πρέπει να ξεκινά με μια δομή mach_msg_header_t
, ακολουθούμενη από το πραγματικό περιεχόμενο του μηνύματος. Η δομή ορίζεται ως εξής:
Οι διεργασίες που διαθέτουν ένα δικαίωμα λήψης (receive right) μπορούν να λαμβάνουν μηνύματα σε ένα θύρα Mach. Αντίστροφα, οι αποστολείς (senders) διαθέτουν ένα δικαίωμα αποστολής (send) ή ένα δικαίωμα αποστολής μία φορά (send-once right). Το δικαίωμα αποστολής μία φορά χρησιμοποιείται αποκλειστικά για την αποστολή ενός μόνο μηνύματος, μετά το οποίο γίνεται άκυρο.
Το αρχικό πεδίο msgh_bits
είναι ένα bitmap:
Το πρώτο bit (πιο σημαντικό) χρησιμοποιείται για να υποδείξει ότι ένα μήνυμα είναι πολύπλοκο (περισσότερα παρακάτω)
Τα 3ο και 4ο χρησιμοποιούνται από τον πυρήνα
Τα 5 λιγότερο σημαντικά bits του 2ου byte μπορούν να χρησιμοποιηθούν για voucher: έναν άλλο τύπο θύρας για την αποστολή συνδυασμών κλειδιού/τιμής.
Τα 5 λιγότερο σημαντικά bits του 3ου byte μπορούν να χρησιμοποιηθούν για τοπική θύρα
Τα 5 λιγότερο σημαντικά bits του 4ου byte μπορούν να χρησιμοποιηθούν για απομακρυσμένη θύρα
Οι τύποι που μπορούν να καθοριστούν στο voucher, τις τοπικές και απομακρυσμένες θύρες είναι (από το mach/message.h):
Για παράδειγμα, το MACH_MSG_TYPE_MAKE_SEND_ONCE
μπορεί να χρησιμοποιηθεί για να υποδείξει ότι ένα δικαίωμα αποστολής μία φορά θα πρέπει να προκύψει και να μεταφερθεί γι' αυτή τη θύρα. Μπορεί επίσης να καθοριστεί το MACH_PORT_NULL
για να αποτραπεί ο παραλήπτης να μπορεί να απαντήσει.
Για να επιτευχθεί μια εύκολη διπλής κατεύθυνσης επικοινωνία ένας διεργασία μπορεί να καθορίσει μια θύρα mach στην κεφαλίδα μηνύματος mach που ονομάζεται θύρα απάντησης (msgh_local_port
) όπου ο παραλήπτης του μηνύματος μπορεί να στείλει μια απάντηση σε αυτό το μήνυμα.
Σημειώστε ότι αυτού του είδους η διπλής κατεύθυνσης επικοινωνία χρησιμοποιείται σε μηνύματα XPC που αναμένουν μια απάντηση (xpc_connection_send_message_with_reply
και xpc_connection_send_message_with_reply_sync
). Ωστόσο, συνήθως δημιουργούνται διαφορετικές θύρες όπως εξηγήθηκε προηγουμένως για τη δημιουργία της διπλής κατεύθυνσης επικοινωνίας.
Τα άλλα πεδία της κεφαλίδας του μηνύματος είναι:
msgh_size
: το μέγεθος ολόκληρου του πακέτου.msgh_remote_port
: η θύρα στην οποία αποστέλλεται αυτό το μήνυμα.msgh_voucher_port
: κουπόνια mach.msgh_id
: το ID αυτού του μηνύματος, το οποίο ερμηνεύεται από τον παραλήπτη.
Σημειώστε ότι τα μηνύματα mach αποστέλλονται μέσω μιας θύρας mach
, η οποία είναι ένα κανάλι επικοινωνίας μοναδικού παραλήπτη, πολλαπλών αποστολέων που έχει ενσωματωθεί στον πυρήνα mach. Πολλές διεργασίες μπορούν να στείλουν μηνύματα σε μια θύρα mach, αλλά ανά πάσα στιγμή μόνο μια διεργασία μπορεί να διαβάσει από αυτήν.
Τα μηνύματα σχηματίζονται από την κεφαλίδα mach_msg_header_t
ακολουθούμενη από το σώμα και από το τρέιλερ (εάν υπάρχει) και μπορεί να επιτρέψει την άδεια απάντησης σε αυτό. Σε αυτές τις περιπτώσεις, ο πυρήνας απλώς χρειάζεται να περάσει το μήνυμα από μια εργασία σε μια άλλη.
Ένα τρέιλερ είναι πληροφορίες που προστίθενται στο μήνυμα από τον πυρήνα (δεν μπορούν να οριστούν από τον χρήστη) τα οποία μπορούν να ζητηθούν κατά τη λήψη μηνύματος με τις σημαίες MACH_RCV_TRAILER_<trailer_opt>
(υπάρχουν διαφορετικές πληροφορίες που μπορούν να ζητηθούν).
Πολύπλοκα Μηνύματα
Ωστόσο, υπάρχουν και άλλα πιο πολύπλοκα μηνύματα, όπως αυτά που περνούν επιπλέον δικαιώματα θύρας ή μοιράζονται μνήμη, όπου ο πυρήνας πρέπει επίσης να στείλει αυτά τα αντικείμενα στον παραλήπτη. Σε αυτές τις περιπτώσεις, το πιο σημαντικό bit της κεφαλίδας msgh_bits
ορίζεται.
Οι πιθανοί περιγραφείς που περνούν καθορίζονται στο mach/message.h
:
Mac Ports APIs
Σημειώστε ότι τα ports συσχετίζονται με το namespace του task, οπότε για να δημιουργήσετε ή να αναζητήσετε ένα port, το namespace του task επίσης ελέγχεται (περισσότερα στο mach/mach_port.h
):
mach_port_allocate
|mach_port_construct
: Δημιουργία ενός port.Το
mach_port_allocate
μπορεί επίσης να δημιουργήσει ένα port set: δικαίωμα λήψης πάνω από μια ομάδα ports. Κάθε φορά που λαμβάνεται ένα μήνυμα, υποδεικνύεται το port από όπου προήλθε.mach_port_allocate_name
: Αλλαγή του ονόματος του port (προεπιλεγμένα 32bit ακέραιος)mach_port_names
: Λήψη ονομάτων port από έναν στόχοmach_port_type
: Λήψη δικαιωμάτων ενός task πάνω σε ένα όνομαmach_port_rename
: Μετονομασία ενός port (όπως τοdup2
για τα FDs)mach_port_allocate
: Εκχώρηση ενός νέου RECEIVE, PORT_SET ή DEAD_NAMEmach_port_insert_right
: Δημιουργία ενός νέου δικαιώματος σε ένα port όπου έχετε RECEIVEmach_port_...
mach_msg
|mach_msg_overwrite
: Συναρτήσεις που χρησιμοποιούνται για την αποστολή και λήψη μηνυμάτων mach. Η έκδοση overwrite επιτρέπει την καθορισμό διαφορετικού buffer για τη λήψη μηνύματος (η άλλη έκδοση θα το επαναχρησιμοποιήσει).
Debug mach_msg
Καθώς οι συναρτήσεις mach_msg
και mach_msg_overwrite
είναι αυτές που χρησιμοποιούνται για την αποστολή και λήψη μηνυμάτων, η ορισμός ενός σημείου αναμονής σε αυτές θα επιτρέψει την επιθεώρηση των απεσταλμένων και ληφθέντων μηνυμάτων.
Για παράδειγμα, ξεκινήστε την αποσφαλμάτωση οποιασδήποτε εφαρμογής που μπορείτε να αποσφαλματώσετε καθώς θα φορτώσει το libSystem.B
που θα χρησιμοποιήσει αυτή τη συνάρτηση.
Λάβετε τις τιμές από τα μητρώα:
Ελέγξτε την κεφαλίδα του μηνύματος ελέγχοντας τον πρώτο ορισμό:
Αυτο το είδος του mach_msg_bits_t
είναι πολύ συνηθισμένο για να επιτρέπει μια απάντηση.
Απαρίθμηση θυρών
Το όνομα είναι το προεπιλεγμένο όνομα που δίνεται στη θύρα (ελέγξτε πώς αυξάνεται στα πρώτα 3 bytes). Το ipc-object
είναι το κρυπτογραφημένο μοναδικό αναγνωριστικό της θύρας.
Σημειώστε επίσης πώς οι θύρες με μόνο δικαίωμα send
αναγνωρίζουν τον ιδιοκτήτη τους (όνομα θύρας + pid).
Επίσης, σημειώστε τη χρήση του +
για να υποδείξετε άλλες εργασίες που συνδέονται με την ίδια θύρα.
Είναι επίσης δυνατόν να χρησιμοποιήσετε το procesxp για να δείτε επίσης τα ονόματα των εγγεγραμμένων υπηρεσιών (με το SIP απενεργοποιημένο λόγω της ανάγκης του com.apple.system-task-port
):
Μπορείτε να εγκαταστήσετε αυτό το εργαλείο στο iOS κατεβάζοντάς το από http://newosxbook.com/tools/binpack64-256.tar.gz
Παράδειγμα κώδικα
Σημειώστε πως ο αποστολέας δεσμεύει ένα θύρα, δημιουργεί ένα δικαίωμα αποστολής για το όνομα org.darlinghq.example
και το στέλνει στο διακομιστή εκκίνησης ενώ ο αποστολέας ζήτησε το δικαίωμα αποστολής αυτού του ονόματος και το χρησιμοποίησε για να στείλει ένα μήνυμα.
Αποστολέας.c
Προνομιούχες Θύρες
Υπάρχουν μερικές ειδικές θύρες που επιτρέπουν την εκτέλεση συγκεκριμένων ευαίσθητων ενεργειών ή την πρόσβαση σε συγκεκριμένα ευαίσθητα δεδομένα στην περίπτωση που μια εργασία έχει τις άδειες SEND πάνω σε αυτές. Αυτό καθιστά αυτές τις θύρες πολύ ενδιαφέρουσες από την άποψη των επιτιθέμενων όχι μόνο λόγω των δυνατοτήτων αλλά και επειδή είναι δυνατόν να μοιραστούν οι άδειες SEND μεταξύ εργασιών.
Ειδικές Θύρες Οικοδεσπότη
Αυτές οι θύρες εκφράζονται με έναν αριθμό.
Τα δικαιώματα SEND μπορούν να αποκτηθούν καλώντας την host_get_special_port
και τα δικαιώματα RECEIVE καλώντας την host_set_special_port
. Ωστόσο, και οι δύο κλήσεις απαιτούν τη θύρα host_priv
στην οποία μόνο ο ριζικός χρήστης μπορεί να έχει πρόσβαση. Επιπλέον, στο παρελθόν ο ριζικός χρήστης μπορούσε να καλέσει την host_set_special_port
και να αρπάξει τυχαίες που επέτρεπαν, για παράδειγμα, την παράκαμψη των υπογραφών κώδικα με την αρπαγή της HOST_KEXTD_PORT
(το SIP τώρα το αποτρέπει).
Αυτές διαιρούνται σε 2 ομάδες: Οι πρώτες 7 θύρες ανήκουν στον πυρήνα με την 1 να είναι η HOST_PORT
, η 2 η HOST_PRIV_PORT
, η 3 η HOST_IO_MASTER_PORT
και η 7 η HOST_MAX_SPECIAL_KERNEL_PORT
.
Αυτές που ξεκινούν από τον αριθμό 8 ανήκουν σε συστημικούς δαίμονες και μπορούν να βρεθούν δηλωμένες στο host_special_ports.h
.
Θύρα Οικοδεσπότη: Αν ένας διεργασία έχει προνόμια SEND πάνω σε αυτήν τη θύρα, μπορεί να λάβει πληροφορίες για το σύστημα καλώντας τις ρουτίνες της όπως:
host_processor_info
: Λήψη πληροφοριών επεξεργαστήhost_info
: Λήψη πληροφοριών οικοδεσπότηhost_virtual_physical_table_info
: Πίνακας εικονικών/φυσικών σελίδων (απαιτεί MACH_VMDEBUG)host_statistics
: Λήψη στατιστικών οικοδεσπότηmach_memory_info
: Λήψη διάταξης μνήμης πυρήναΠρονομιούχα Θύρα Οικοδεσπότη: Μια διεργασία με δικαίωμα SEND πάνω σε αυτήν τη θύρα μπορεί να εκτελέσει προνομιούχες ενέργειες όπως εμφάνιση δεδομένων εκκίνησης ή προσπάθεια φόρτωσης επέκτασης πυρήνα. Η διεργασία πρέπει να είναι ριζική για να λάβει αυτήν την άδεια.
Επιπλέον, για να καλέσει το API
kext_request
απαιτούνται άλλα δικαιώματαcom.apple.private.kext*
τα οποία δίνονται μόνο σε δυαδικά αρχεία της Apple.Άλλες ρουτίνες που μπορούν να κληθούν είναι:
host_get_boot_info
: Λήψηmachine_boot_info()
host_priv_statistics
: Λήψη προνομιούχων στατιστικώνvm_allocate_cpm
: Δέσμευση συνεχούς φυσικής μνήμηςhost_processors
: Αποστολή δικαιωμάτων σε επεξεργαστές οικοδεσπότηmach_vm_wire
: Κάνει τη μνήμη μόνιμηΚαθώς ο ριζικός χρήστης μπορεί να έχει πρόσβαση σε αυτήν την άδεια, θα μπορούσε να καλέσει
host_set_[special/exception]_port[s]
για να αρπάξει ειδικές ή εξαιρετικές θύρες οικοδεσπότη.
Είναι δυνατόν να δείτε όλες τις ειδικές θύρες οικοδεσπότη εκτελώντας:
Ειδικές Θύρες Εργασίας
Αυτές είναι οι θύρες που είναι επιφυλαγμένες για γνωστές υπηρεσίες. Είναι δυνατόν να τις ανακτήσετε/ορίσετε καλώντας τις task_[get/set]_special_port
. Μπορούν να βρεθούν στο αρχείο task_special_ports.h
:
Από εδώ:
TASK_KERNEL_PORT[δικαίωμα αποστολής task-self]: Η θύρα που χρησιμοποιείται για τον έλεγχο αυτού του task. Χρησιμοποιείται για την αποστολή μηνυμάτων που επηρεάζουν το task. Αυτή είναι η θύρα που επιστρέφεται από το mach_task_self (δείτε Task Ports παρακάτω).
TASK_BOOTSTRAP_PORT[δικαίωμα αποστολής bootstrap]: Η bootstrap θύρα του task. Χρησιμοποιείται για την αποστολή μηνυμάτων που ζητούν την επιστροφή άλλων θυρών υπηρεσιών του συστήματος.
TASK_HOST_NAME_PORT[δικαίωμα αποστολής host-self]: Η θύρα που χρησιμοποιείται για την αίτηση πληροφοριών του φιλοξενούντος υπολογιστή. Αυτή είναι η θύρα που επιστρέφεται από το mach_host_self.
TASK_WIRED_LEDGER_PORT[δικαίωμα αποστολής ledger]: Η θύρα που ονομάζει την πηγή από την οποία το task αντλεί την συνδεδεμένη μνήμη πυρήνα.
TASK_PAGED_LEDGER_PORT[δικαίωμα αποστολής ledger]: Η θύρα που ονομάζει την πηγή από την οποία το task αντλεί την προεπιλεγμένη μνήμη που διαχειρίζεται.
Θύρες Task
Αρχικά, το Mach δεν είχε "διεργασίες", είχε "tasks" που θεωρούνταν περισσότερο σαν ένας δοχείο νημάτων. Όταν το Mach συγχωνεύτηκε με το BSD, κάθε task συσχετίστηκε με μια διεργασία BSD. Συνεπώς, κάθε διεργασία BSD έχει τις λεπτομέρειες που χρειάζεται για να είναι μια διεργασία και κάθε task Mach έχει επίσης τις εσωτερικές λειτουργίες της (εκτός από το μη υπαρκτό pid 0 που είναι το kernel_task
).
Υπάρχουν δύο πολύ ενδιαφέρουσες συναρτήσεις σχετικές με αυτό:
task_for_pid(target_task_port, pid, &task_port_of_pid)
: Λάβετε ένα SEND δικαίωμα για τη θύρα του task που σχετίζεται με το καθορισμένο από τοpid
και δώστε το στην καθορισμένηtarget_task_port
(που συνήθως είναι το task καλούντος που χρησιμοποίησε τοmach_task_self()
, αλλά θα μπορούσε να είναι μια SEND θύρα σε διαφορετικό task.)pid_for_task(task, &pid)
: Δεδομένου ενός SEND δικαιώματος σε ένα task, βρείτε σε ποιο PID σχετίζεται αυτό το task.
Για να εκτελέσετε ενέργειες εντός του task, το task χρειαζόταν ένα δικαίωμα SEND
στον εαυτό του καλώντας το mach_task_self()
(που χρησιμοποιεί το task_self_trap
(28)). Με αυτή την άδεια, ένα task μπορεί να εκτελέσει διάφορες ενέργειες όπως:
task_threads
: Λάβετε SEND δικαίωμα πάνω από όλες τις θύρες task των νημάτων του tasktask_info
: Λάβετε πληροφορίες για ένα tasktask_suspend/resume
: Αναστολή ή επανέναρξη ενός tasktask_[get/set]_special_port
thread_create
: Δημιουργία ενός νήματοςtask_[get/set]_state
: Έλεγχος κατάστασης taskκαι περισσότερα μπορούν να βρεθούν στο mach/task.h
Σημειώστε ότι με ένα SEND δικαίωμα πάνω σε μια θύρα task ενός διαφορετικού task, είναι δυνατόν να εκτελεστούν τέτοιες ενέργειες σε ένα διαφορετικό task.
Επιπλέον, η task_port είναι επίσης η θύρα vm_map
που επιτρέπει την ανάγνωση και την τροποποίηση μνήμης μέσα σε ένα task με συναρτήσεις όπως vm_read()
και vm_write()
. Αυτό σημαίνει βασικά ότι ένα task με δικαιώματα SEND πάνω στη task_port ενός διαφορετικού task θα μπορεί να ενθάρρυνει κώδικα σε αυτό το task.
Θυμηθείτε ότι επειδή το πυρήνας είναι επίσης ένα task, αν κάποιος καταφέρει να λάβει δικαιώματα SEND πάνω στο kernel_task
, θα μπορεί να κάνει τον πυρήνα να εκτελέσει οτιδήποτε (jailbreaks).
Καλέστε το
mach_task_self()
για να λάβετε το όνομα γι' αυτή τη θύρα για το task του καλούντος. Αυτή η θύρα κληρονομείται μόνο κατά τοexec()
· ένα νέο task που δημιουργείται μεfork()
λαμβάνει μια νέα θύρα task (ως ειδική περίπτωση, ένα task λαμβάνει επίσης μια νέα θύρα task μετά τοexec()
σε ένα suid δυαδικό). Ο μόνος τρόπος να δημιουργηθεί ένα task και να ληφθεί η θύρα του είναι να εκτελεστεί ο "χορός ανταλλαγής θυρών" κατά τη διάρκεια ενόςfork()
.Αυτές είναι οι περιορισμοί για την πρόσβαση στη θύρα (από
macos_task_policy
από το δυαδικόAppleMobileFileIntegrity
):Αν η εφαρμογή έχει το δικαίωμα επιτρέπεται get-task-allow διεργασίες από τον ίδιο χρήστη μπορούν να έχουν πρόσβαση στη θύρα του task (συνήθως προστίθεται από το Xcode για αποσφαλμάτωση). Η διαδικασία επικύρωσης δεν θα το επιτρέψει σε παραγωγικές εκδόσεις.
Οι εφαρμογές με το δικαίωμα com.apple.system-task-ports μπορούν να λάβουν τη θύρα task για οποιαδήποτε διεργασία, εκτός από τον πυρήνα. Σε παλαιότερες εκδόσεις ονομαζόταν task_for_pid-allow. Αυτό χορηγείται μόνο σε εφαρμογές της Apple.
Ο ριζικός χρήστης μπορεί να έχει πρόσβαση στις θύρες task εφαρμογών που δεν έχουν συνταχθεί με ένα σκληρυνμένο χρόνο εκτέλεσης (και όχι από την Apple).
Η θύρα ονόματος task: Μια μη προνομιούχα έκδοση της θύρας task. Αναφέρεται στο task, αλλά δεν επιτρέπει τον έλεγχό του. Το μόνο που φαίνεται να είναι διαθέσιμο μέσω αυτής είναι το task_info()
.
Θύρες Νημάτων
Τα νήματα έχουν επίσης συσχετισμένες θύρες, οι οποίες είναι ορατές από το task που καλεί το task_threads
και από τον επεξεργαστή με το processor_set_threads
. Ένα SEND δικαίωμα στη θύρα του νήματος επιτρέπει τη χρήση της λειτουργίας από το υποσύστημα thread_act
, όπως:
thread_terminate
thread_[get/set]_state
act_[get/set]_state
thread_[suspend/resume]
thread_info
...
Κάθε νήμα μπορεί να λάβει αυτή τη θύρα καλώντας το mach_thread_sef
.
Εισαγωγή Shellcode σε νήμα μέσω της θύρας Task
Μπορείτε να αντλήσετε ένα shellcode από:
Introduction to ARM64v8macOS Δικαιώματα
Τα δικαιώματα είναι μια λίστα με δικαιώματα που μπορούν να χορηγηθούν σε μια εφαρμογή macOS μέσω του αρχείου entitlements.plist. Αυτά τα δικαιώματα μπορούν να επιτρέψουν πρόσβαση σε ευαίσθητες λειτουργίες του συστήματος ή σε άλλες εφαρμογές. Είναι σημαντικό να διαχειρίζεστε προσεκτικά τα δικαιώματα που χορηγούνται σε κάθε εφαρμογή προκειμένου να διατηρηθεί η ασφάλεια του συστήματος.
Συντάξτε το προηγούμενο πρόγραμμα και προσθέστε τα δικαιώματα για να μπορείτε να εισάγετε κώδικα με τον ίδιο χρήστη (αν όχι, θα χρειαστεί να χρησιμοποιήσετε sudo).