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.Νεκρό Όνομα, το οποίο δεν είναι ένα πραγματικό δικαίωμα θύρας, αλλά απλώς ένας αντικαταστάτης. Όταν μια θύρα καταστραφεί, όλα τα υπάρχοντα δικαιώματα θύρας στη θύρα μετατρέπονται σε νεκρά ονόματα.
Οι εργασίες μπορούν να μεταφέρουν ΔΙΚΑΙΩΜΑΤΑ ΑΠΟΣΤΟΛΗΣ σε άλλους, επιτρέποντάς τους να στέλνουν μηνύματα πίσω. Τα ΔΙΚΑΙΩΜΑΤΑ ΑΠΟΣΤΟΛΗΣ μπορούν επίσης να κλωνοποιηθούν, έτσι μια εργασία μπορεί να διπλασιάσει το δικαίωμα και να το δώσει σε μια τρίτη εργασία. Αυτό, σε συνδυασμό με ένα ενδιάμεσο διεργασία γνωστό ως διακομιστής εκκίνησης, επιτρέπει αποτελεσματική επικοινωνία μεταξύ εργασιών.
Ένα Μήνυμα Mach
Βρείτε περισσότερες πληροφορίες εδώ
Η συνάρτηση mach_msg
, ουσιαστικά ένα κάλεσμα συστήματος, χρησιμοποιείται για την αποστολή και λήψη μηνυμάτων Mach. Η συνάρτηση απαιτεί το μήνυμα που θα αποσταλεί ως αρχικό όρισμα. Αυτό το μήνυμα πρέπει να ξεκινά με μια δομή mach_msg_header_t
, ακολουθούμενη από το πραγματικό περιεχόμενο του μηνύματος. Η δομή ορίζεται ως εξής:
Οι διεργασίες που διαθέτουν ένα δικαίωμα λήψης (receive right) μπορούν να λαμβάνουν μηνύματα σε ένα θύρα Mach. Αντίστροφα, οι αποστολείς (senders) διαθέτουν ένα δικαίωμα αποστολής (send) ή ένα δικαίωμα αποστολής μία φορά (send-once right). Το δικαίωμα αποστολής μία φορά χρησιμοποιείται αποκλειστικά για την αποστολή ενός μόνο μηνύματος, μετά το οποίο γίνεται άκυρο.
Το αρχικό πεδίο msgh_bits
είναι ένα bitmap:
Το πρώτο bit (πιο σημαντικό) χρησιμοποιείται για να υποδείξει ότι ένα μήνυμα είναι πολύπλοκο (περισσότερα παρακάτω)
Τα 3ο και 4ο bit χρησιμοποιούνται από τον πυρήνα
Τα 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
:
Στα 32bits, όλες οι περιγραφές είναι 12B και ο τύπος της περιγραφής βρίσκεται στον 11ο. Στα 64 bits, τα μεγέθη ποικίλουν.
Το πυρήνας θα αντιγράψει τις περιγραφές από μια εργασία σε μια άλλη, αλλά πρώτα δημιουργεί ένα αντίγραφο στη μνήμη του πυρήνα. Αυτή η τεχνική, γνωστή ως "Feng Shui", έχει καταχραστεί σε αρκετές εκμεταλλεύσεις για να κάνει τον πυρήνα να αντιγράψει δεδομένα στη μνήμη του κάνοντας ένα διεργασία να στείλει περιγραφές στον εαυτό της. Στη συνέχεια η διεργασία μπορεί να λάβει τα μηνύματα (ο πυρήνας θα τα απελευθερώσει).
Είναι επίσης δυνατόν να στείλετε δικαιώματα θύρας σε μια ευάλωτη διεργασία, και τα δικαιώματα θύρας θα εμφανιστούν απλώς στη διεργασία (ακόμα κι αν δεν τα χειρίζεται).
Προγραμματιστικά Πεδία Mac Ports
Σημειώστε ότι οι θύρες συσχετίζονται με το χώρο ονομάτων της εργασίας, έτσι για τη δημιουργία ή αναζήτηση μιας θύρας, επίσης ερευνάται το χώρο ονομάτων της εργασίας (περισσότερα στο mach/mach_port.h
):
mach_port_allocate
|mach_port_construct
: Δημιουργία μιας θύρας.Το
mach_port_allocate
μπορεί επίσης να δημιουργήσει ένα σύνολο θυρών: δικαίωμα λήψης πάνω από μια ομάδα θυρών. Κάθε φορά που λαμβάνεται ένα μήνυμα, υποδεικνύεται η θύρα από όπου προήλθε.mach_port_allocate_name
: Αλλαγή του ονόματος της θύρας (προεπιλεγμένα 32bit ακέραιος)mach_port_names
: Λήψη ονομάτων θύρας από έναν στόχοmach_port_type
: Λήψη δικαιωμάτων μιας εργασίας πάνω σε ένα όνομαmach_port_rename
: Μετονομασία μιας θύρας (όπως τοdup2
για τα FDs)mach_port_allocate
: Εκχώρηση μιας νέας ΛΗΨΗΣ, ΣΥΝΟΛΟΥ_ΘΥΡΩΝ ή DEAD_NAMEmach_port_insert_right
: Δημιουργία νέου δικαιώματος σε μια θύρα όπου έχετε ΛΗΨΗmach_port_...
mach_msg
|mach_msg_overwrite
: Συναρτήσεις που χρησιμοποιούνται για το στέλνει και λαμβάνει μηνύματα mach. Η έκδοση overwrite επιτρέπει την καθορισμό διαφορετικού buffer για τη λήψη μηνύματος (η άλλη έκδοση θα το επαναχρησιμοποιήσει).
Debug mach_msg
Καθώς οι συναρτήσεις mach_msg
και mach_msg_overwrite
είναι αυτές που χρησιμοποιούνται για την αποστολή και λήψη μηνυμάτων, η ορισμός ενός σημείου αναστολής σε αυτές θα επιτρέψει την επιθεώρηση των απεσταλμένων και ληφθέντων μηνυμάτων.
Για παράδειγμα, ξεκινήστε την αποσφαλμάτωση οποιασδήποτε εφαρμογής που μπορείτε να αποσφαλματώσετε καθώς θα φορτώσει το libSystem.B
που θα χρησιμοποιήσει αυτή τη λειτουργία.
Για να λάβετε τα ορίσματα της mach_msg
ελέγξτε τους καταχωρητές. Αυτά είναι τα ορίσματα (από mach/message.h):
Λάβετε τις τιμές από τα μητρώα:
Εξετάστε την κεφαλίδα του μηνύματος ελέγχοντας τον πρώτο ορισμό:
Αυτο το είδος του 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
Ο κώδικας στο αρχείο sender.c
χρησιμοποιείται για να δημιουργήσει έναν αποστολέα δεδομένων IPC στο macOS. Ο αποστολέας αυτός είναι υπεύθυνος για την αποστολή δεδομένων σε μια άλλη διεργασία μέσω IPC.
Αυτός ο κώδικας μπορεί να χρησιμοποιηθεί για να κατανοήσετε πώς λειτουργεί η διαδικασία ανάμεσα σε διαφορετικές διεργασίες στο macOS και πώς μπορεί να γίνει κατάχρηση της διαδικασίας αυτής για προνομιακή ενίσχυση.
Προνομιούχες Θύρες
Υπάρχουν μερικές ειδικές θύρες που επιτρέπουν την εκτέλεση συγκεκριμένων ευαίσθητων ενεργειών ή την πρόσβαση σε συγκεκριμένα ευαίσθητα δεδομένα στην περίπτωση που μια εργασία έχει τα δικαιώματα 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 Ports
Αρχικά, το Mach δεν είχε "διεργασίες", είχε "εργασίες" που θεωρούνταν περισσότερο σαν ένας δοχείο νημάτων. Όταν το Mach συγχωνεύτηκε με το BSD, κάθε εργασία συσχετίστηκε με μια διεργασία BSD. Συνεπώς, κάθε διεργασία BSD έχει τις λεπτομέρειες που χρειάζεται για να είναι μια διεργασία και κάθε εργασία Mach έχει επίσης τη δική της λειτουργικότητα (εκτός από το μη υπαρκτό pid 0 που είναι το kernel_task
).
Υπάρχουν δύο πολύ ενδιαφέρουσες συναρτήσεις σχετικές με αυτό:
task_for_pid(target_task_port, pid, &task_port_of_pid)
: Λάβετε ένα SEND δικαίωμα για τη θύρα εργασίας της εργασίας που σχετίζεται με το συγκεκριμένο από τοpid
και δώστε το στην καθορισμένηtarget_task_port
(που συνήθως είναι η κλήση εργασίας που χρησιμοποίησε τοmach_task_self()
, αλλά θα μπορούσε να είναι μια θύρα SEND σε μια διαφορετική εργασία.)pid_for_task(task, &pid)
: Δεδομένου ενός SEND δικαιώματος σε μια εργασία, βρείτε σε ποιο PID σχετίζεται αυτή η εργασία.
Για να εκτελέσετε ενέργειες μέσα στην εργασία, η εργασία χρειαζόταν ένα δικαίωμα SEND
στον εαυτό της καλώντας το mach_task_self()
(που χρησιμοποιεί το task_self_trap
(28)). Με αυτή την άδεια, μια εργασία μπορεί να εκτελέσει διάφορες ενέργειες όπως:
task_threads
: Λάβετε SEND δικαίωμα πάνω από όλες τις θύρες εργασίας των νημάτων της εργασίαςtask_info
: Λάβετε πληροφορίες σχετικά με μια εργασίαtask_suspend/resume
: Αναστολή ή επανέναρξη μιας εργασίαςtask_[get/set]_special_port
thread_create
: Δημιουργία ενός νήματοςtask_[get/set]_state
: Έλεγχος κατάστασης εργασίαςκαι περισσότερα μπορούν να βρεθούν στο mach/task.h
Σημειώστε ότι με ένα SEND δικαίωμα πάνω σε μια θύρα εργασίας μιας διαφορετικής εργασίας, είναι δυνατόν να εκτελεστούν τέτοιες ενέργειες σε μια διαφορετική εργασία.
Επιπλέον, η θύρα εργασίας είναι επίσης η θύρα vm_map
που επιτρέπει το διάβασμα και την τροποποίηση μνήμης μέσα σε μια εργασία με συναρτήσεις όπως vm_read()
και vm_write()
. Αυτό σημαίνει βασικά ότι μια εργασία με δικαιώματα SEND πάνω στη θύρα εργασίας μιας διαφορετικής εργασίας θα μπορεί να ενθάρρυνει κώδικα σε αυτή την εργασία.
Θυμηθείτε ότι επειδή το πυρήνας είναι επίσης μια εργασία, αν κάποιος καταφέρει να λάβει δικαιώματα SEND πάνω στο kernel_task
, θα μπορεί να κάνει τον πυρήνα να εκτελέσει οτιδήποτε (jailbreaks).
Καλέστε το
mach_task_self()
για να λάβετε το όνομα γι' αυτή τη θύρα για την κλήση εργασίας. Αυτή η θύρα κληρονομείται μόνο κατά τηνexec()
· μια νέα εργασία που δημιουργείται με τοfork()
λαμβάνει μια νέα θύρα εργασίας (ως ειδική περίπτωση, μια εργασία λαμβάνει επίσης μια νέα θύρα εργασίας μετά τοexec()
σε ένα suid δυαδικό). Ο μόνος τρόπος να δημιουργηθεί μια εργασία και να ληφθεί η θύρα της είναι να εκτελεστεί ο "χορός ανταλλαγής θυρών" κατά τοfork()
.Αυτές είναι οι περιορισμοί για την πρόσβαση στη θύρα (από το
macos_task_policy
από το δυαδικόAppleMobileFileIntegrity
):Αν η εφαρμογή έχει το δικαίωμα com.apple.security.get-task-allow, διεργασίες από τον ίδιο χρήστη μπορούν να έχουν πρόσβαση στη θύρα εργασίας (συνήθως προστίθεται από το Xcode για αποσφαλμάτωση). Η διαδικασία επικύρωσης δεν το επιτρέπει σε παραγωγικές εκδόσεις.
Οι εφαρμογές με το δικαίωμα com.apple.system-task-ports μπορούν να λάβουν τη θύρα εργασίας για οποιαδήποτε διεργασία, εκτός από τον πυρήνα. Σε παλαιότερες εκδόσεις ονομαζόταν
task_for_pid-allow
. Αυτό χορηγείται μόνο σε εφαρμογές της Apple.Ο ριζικός χρήστης μπορεί να έχει πρόσβαση στις θύρες εργασίας εφαρμογών που δεν έχουν μεταγλωττιστεί με ένα σκληρυνμένο χρόνο εκτέλεσης (και όχι από την Apple).
Η θύρα ονόματος εργασίας: Μια μη προνομιούχα έκδοση της θύρας εργασίας. Αναφέρεται στην εργασία, αλλά δεν επιτρέπει τον έλεγχό της. Το μόνο που φαίνεται να είναι διαθέσιμο μέσω αυτής είναι το task_info()
.
Εισαγωγή Shellcode σε νήμα μέσω της θύρας εργασίας
Μπορείτε να αντλήσετε ένα shellcode από:
pageIntroduction to ARM64v8macOS Δικαιώματα
Τα δικαιώματα είναι μια λίστα με προνομιακές ενέργειες που μπορεί να εκτελέσει μια εφαρμογή. Τα δικαιώματα ορίζονται στο αρχείο entitlements.plist
που συνοδεύει μια εφαρμογή macOS. Με τη σωστή ρύθμιση των δικαιωμάτων, μπορεί να περιοριστεί η πρόσβαση μιας εφαρμογής σε ευαίσθητα μέρη του συστήματος.
Είναι σημαντικό να γίνει σωστή διαχείριση των δικαιωμάτων προκειμένου να διασφαλιστεί η ασφάλεια του συστήματος και να αποτραπεί η κατάχρησή τους από κακόβουλο λογισμικό.
Συντάξτε το προηγούμενο πρόγραμμα και προσθέστε τα δικαιώματα για να μπορείτε να εισάγετε κώδικα με τον ίδιο χρήστη (αν όχι, θα χρειαστεί να χρησιμοποιήσετε sudo).
Last updated