macOS - AMFI - AppleMobileFileIntegrity
Reading time: 8 minutes
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
AppleMobileFileIntegrity.kext και amfid
Επικεντρώνεται στην επιβολή της ακεραιότητας του κώδικα που εκτελείται στο σύστημα παρέχοντας τη λογική πίσω από την επαλήθευση υπογραφής κώδικα του XNU. Είναι επίσης ικανό να ελέγχει τα δικαιώματα και να χειρίζεται άλλες ευαίσθητες εργασίες όπως η επιτρεπόμενη αποσφαλμάτωσης ή η απόκτηση θυρών εργασίας.
Επιπλέον, για ορισμένες λειτουργίες, το kext προτιμά να επικοινωνεί με το daemon του χώρου χρήστη /usr/libexec/amfid
. Αυτή η σχέση εμπιστοσύνης έχει καταχραστεί σε πολλές jailbreaks.
Το AMFI χρησιμοποιεί MACF πολιτικές και καταχωρεί τα hooks του τη στιγμή που ξεκινά. Επίσης, η αποτροπή της φόρτωσης ή της εκφόρτωσής του θα μπορούσε να προκαλέσει πανικό του πυρήνα. Ωστόσο, υπάρχουν ορισμένα επιχειρήματα εκκίνησης που επιτρέπουν την αποδυνάμωση του AMFI:
amfi_unrestricted_task_for_pid
: Επιτρέπει το task_for_pid να επιτρέπεται χωρίς απαιτούμενα δικαιώματαamfi_allow_any_signature
: Επιτρέπει οποιαδήποτε υπογραφή κώδικαcs_enforcement_disable
: Επιχειρηματικό επιχείρημα που χρησιμοποιείται για την απενεργοποίηση της επιβολής υπογραφής κώδικαamfi_prevent_old_entitled_platform_binaries
: Ακυρώνει τις πλατφόρμες δυαδικών αρχείων με δικαιώματαamfi_get_out_of_my_way
: Απενεργοποιεί εντελώς το amfi
Αυτές είναι μερικές από τις πολιτικές MACF που καταχωρεί:
cred_check_label_update_execve:
Η ενημέρωση ετικέτας θα εκτελείται και θα επιστρέφει 1cred_label_associate
: Ενημερώνει την υποδοχή mac ετικέτας του AMFI με ετικέταcred_label_destroy
: Αφαιρεί την υποδοχή mac ετικέτας του AMFIcred_label_init
: Μετακινεί 0 στην υποδοχή mac ετικέτας του AMFIcred_label_update_execve
: Ελέγχει τα δικαιώματα της διαδικασίας για να δει αν θα επιτρέπεται να τροποποιήσει τις ετικέτες.file_check_mmap
: Ελέγχει αν το mmap αποκτά μνήμη και την ορίζει ως εκτελέσιμη. Σε αυτή την περίπτωση, ελέγχει αν απαιτείται επικύρωση βιβλιοθήκης και αν ναι, καλεί τη λειτουργία επικύρωσης βιβλιοθήκης.file_check_library_validation
: Καλεί τη λειτουργία επικύρωσης βιβλιοθήκης που ελέγχει μεταξύ άλλων αν μια πλατφόρμα δυαδικών αρχείων φορτώνει άλλη πλατφόρμα δυαδικών αρχείων ή αν η διαδικασία και το νέο φορτωμένο αρχείο έχουν το ίδιο TeamID. Ορισμένα δικαιώματα θα επιτρέψουν επίσης τη φόρτωση οποιασδήποτε βιβλιοθήκης.policy_initbsd
: Ρυθμίζει τις αξιόπιστες κλειδαριές NVRAMpolicy_syscall
: Ελέγχει τις πολιτικές DYLD όπως αν το δυαδικό αρχείο έχει απεριόριστα τμήματα, αν θα επιτρέψει env vars... αυτό καλείται επίσης όταν μια διαδικασία ξεκινά μέσωamfi_check_dyld_policy_self()
.proc_check_inherit_ipc_ports
: Ελέγχει αν όταν μια διαδικασία εκτελεί ένα νέο δυαδικό αρχείο, άλλες διαδικασίες με δικαιώματα SEND πάνω από την θύρα εργασίας της διαδικασίας θα πρέπει να τις διατηρήσουν ή όχι. Οι πλατφόρμες δυαδικών αρχείων επιτρέπονται, το δικαίωμαget-task-allow
το επιτρέπει, τα δικαιώματαtask_for_pid-allow
επιτρέπονται και τα δυαδικά αρχεία με το ίδιο TeamID.proc_check_expose_task
: επιβάλλει δικαιώματαamfi_exc_action_check_exception_send
: Ένα μήνυμα εξαίρεσης αποστέλλεται στον αποσφαλματωτήamfi_exc_action_label_associate & amfi_exc_action_label_copy/populate & amfi_exc_action_label_destroy & amfi_exc_action_label_init & amfi_exc_action_label_update
: Κύκλος ζωής ετικέτας κατά τη διάρκεια της διαχείρισης εξαιρέσεων (αποσφαλμάτωσης)proc_check_get_task
: Ελέγχει τα δικαιώματα όπως τοget-task-allow
που επιτρέπει σε άλλες διαδικασίες να αποκτούν την θύρα εργασίας και τοtask_for_pid-allow
, που επιτρέπει στη διαδικασία να αποκτά τις θύρες εργασίας άλλων διαδικασιών. Αν κανένα από αυτά, καλεί τοamfid permitunrestricteddebugging
για να ελέγξει αν επιτρέπεται.proc_check_mprotect
: Αρνείται αν τοmprotect
καλείται με την σημαίαVM_PROT_TRUSTED
που υποδεικνύει ότι η περιοχή πρέπει να αντιμετωπίζεται σαν να έχει έγκυρη υπογραφή κώδικα.vnode_check_exec
: Καλείται όταν εκτελέσιμα αρχεία φορτώνονται στη μνήμη και ορίζειcs_hard | cs_kill
που θα σκοτώσει τη διαδικασία αν οποιαδήποτε από τις σελίδες γίνει μη έγκυρηvnode_check_getextattr
: MacOS: Ελέγχειcom.apple.root.installed
καιisVnodeQuarantined()
vnode_check_setextattr
: Όπως get + com.apple.private.allow-bless και εσωτερικό ισοδύναμο δικαιώματος εγκαταστάτηvnode_check_signature
: Κώδικας που καλεί το XNU για να ελέγξει την υπογραφή κώδικα χρησιμοποιώντας δικαιώματα, cache εμπιστοσύνης καιamfid
proc_check_run_cs_invalid
: Παρεμβαίνει σε κλήσειςptrace()
(PT_ATTACH
καιPT_TRACE_ME
). Ελέγχει για οποιαδήποτε από τα δικαιώματαget-task-allow
,run-invalid-allow
καιrun-unsigned-code
και αν κανένα, ελέγχει αν η αποσφαλμάτωση επιτρέπεται.proc_check_map_anon
: Αν το mmap καλείται με τη σημαίαMAP_JIT
, το AMFI θα ελέγξει για το δικαίωμαdynamic-codesigning
.
AMFI.kext
εκθέτει επίσης μια API για άλλες επεκτάσεις πυρήνα, και είναι δυνατό να βρείτε τις εξαρτήσεις του με:
kextstat | grep " 19 " | cut -c2-5,50- | cut -d '(' -f1
Executing: /usr/bin/kmutil showloaded
No variant specified, falling back to release
8 com.apple.kec.corecrypto
19 com.apple.driver.AppleMobileFileIntegrity
22 com.apple.security.sandbox
24 com.apple.AppleSystemPolicy
67 com.apple.iokit.IOUSBHostFamily
70 com.apple.driver.AppleUSBTDM
71 com.apple.driver.AppleSEPKeyStore
74 com.apple.iokit.EndpointSecurity
81 com.apple.iokit.IOUserEthernet
101 com.apple.iokit.IO80211Family
102 com.apple.driver.AppleBCMWLANCore
118 com.apple.driver.AppleEmbeddedUSBHost
134 com.apple.iokit.IOGPUFamily
135 com.apple.AGXG13X
137 com.apple.iokit.IOMobileGraphicsFamily
138 com.apple.iokit.IOMobileGraphicsFamily-DCP
162 com.apple.iokit.IONVMeFamily
amfid
Αυτό είναι το daemon που εκτελείται σε λειτουργία χρήστη και θα χρησιμοποιήσει το AMFI.kext
για να ελέγξει τις υπογραφές κώδικα σε λειτουργία χρήστη.
Για να επικοινωνήσει το AMFI.kext
με το daemon, χρησιμοποιεί mach μηνύματα μέσω της θύρας HOST_AMFID_PORT
, η οποία είναι η ειδική θύρα 18
.
Σημειώστε ότι στο macOS δεν είναι πλέον δυνατό για τις διαδικασίες root να καταλάβουν ειδικές θύρες, καθώς προστατεύονται από το SIP
και μόνο το launchd μπορεί να τις αποκτήσει. Στο iOS ελέγχεται ότι η διαδικασία που στέλνει την απάντηση έχει το CDHash σκληρά κωδικοποιημένο του amfid
.
Είναι δυνατόν να δείτε πότε ζητείται από το amfid
να ελέγξει ένα δυαδικό και την απάντησή του, αποσφαλματώνοντάς το και θέτοντας ένα breakpoint στο mach_msg
.
Μόλις ληφθεί ένα μήνυμα μέσω της ειδικής θύρας, MIG χρησιμοποιείται για να στείλει κάθε λειτουργία στη λειτουργία που καλεί. Οι κύριες λειτουργίες έχουν αναστραφεί και εξηγηθεί μέσα στο βιβλίο.
Provisioning Profiles
Ένα provisioning profile μπορεί να χρησιμοποιηθεί για να υπογράψει κώδικα. Υπάρχουν Developer profiles που μπορούν να χρησιμοποιηθούν για να υπογράψουν κώδικα και να τον δοκιμάσουν, και Enterprise profiles που μπορούν να χρησιμοποιηθούν σε όλες τις συσκευές.
Αφού υποβληθεί μια εφαρμογή στο Apple Store, αν εγκριθεί, υπογράφεται από την Apple και το provisioning profile δεν είναι πλέον απαραίτητο.
Ένα profile συνήθως χρησιμοποιεί την επέκταση .mobileprovision
ή .provisionprofile
και μπορεί να αποθηκευτεί με:
openssl asn1parse -inform der -in /path/to/profile
# Or
security cms -D -i /path/to/profile
Αν και μερικές φορές αναφέρονται ως πιστοποιημένα, αυτά τα προφίλ παροχής έχουν περισσότερα από ένα πιστοποιητικό:
- AppIDName: Ο Αναγνωριστικός Κωδικός Εφαρμογής
- AppleInternalProfile: Δηλώνει ότι πρόκειται για εσωτερικό προφίλ της Apple
- ApplicationIdentifierPrefix: Προστίθεται στο AppIDName (ίδιο με TeamIdentifier)
- CreationDate: Η ημερομηνία σε μορφή
YYYY-MM-DDTHH:mm:ssZ
- DeveloperCertificates: Ένας πίνακας (συνήθως ενός) πιστοποιητικού/ων, κωδικοποιημένος ως δεδομένα Base64
- Entitlements: Τα δικαιώματα που επιτρέπονται με τα δικαιώματα για αυτό το προφίλ
- ExpirationDate: Η ημερομηνία λήξης σε μορφή
YYYY-MM-DDTHH:mm:ssZ
- Name: Το Όνομα της Εφαρμογής, το ίδιο με το AppIDName
- ProvisionedDevices: Ένας πίνακας (για πιστοποιητικά προγραμματιστών) των UDIDs για τα οποία είναι έγκυρο αυτό το προφίλ
- ProvisionsAllDevices: Μια boolean (true για πιστοποιητικά επιχείρησης)
- TeamIdentifier: Ένας πίνακας (συνήθως ενός) αλφαριθμητικού συμβόλου/ων που χρησιμοποιούνται για την αναγνώριση του προγραμματιστή για σκοπούς αλληλεπίδρασης μεταξύ εφαρμογών
- TeamName: Ένα αναγνώσιμο από άνθρωπο όνομα που χρησιμοποιείται για την αναγνώριση του προγραμματιστή
- TimeToLive: Η εγκυρότητα (σε ημέρες) του πιστοποιητικού
- UUID: Ένας Καθολικά Μοναδικός Αναγνωριστής για αυτό το προφίλ
- Version: Αυτή τη στιγμή ορισμένο σε 1
Σημειώστε ότι η καταχώρηση δικαιωμάτων θα περιέχει ένα περιορισμένο σύνολο δικαιωμάτων και το προφίλ παροχής θα μπορεί να δώσει μόνο αυτά τα συγκεκριμένα δικαιώματα για να αποτρέψει την παροχή ιδιωτικών δικαιωμάτων της Apple.
Σημειώστε ότι τα προφίλ βρίσκονται συνήθως στο /var/MobileDeviceProvisioningProfiles
και είναι δυνατή η έλεγχος τους με security cms -D -i /path/to/profile
libmis.dyld
Αυτή είναι η εξωτερική βιβλιοθήκη που καλεί το amfid
προκειμένου να ρωτήσει αν θα πρέπει να επιτρέψει κάτι ή όχι. Αυτό έχει κακοποιηθεί ιστορικά στο jailbreaking εκτελώντας μια παραποιημένη έκδοση της που θα επέτρεπε τα πάντα.
Στο macOS αυτό βρίσκεται μέσα στο MobileDevice.framework
.
AMFI Trust Caches
Το iOS AMFI διατηρεί μια λίστα γνωστών κατακερματισμών που υπογράφονται ad-hoc, που ονομάζεται Trust Cache και βρίσκεται στην ενότητα __TEXT.__const
του kext. Σημειώστε ότι σε πολύ συγκεκριμένες και ευαίσθητες λειτουργίες είναι δυνατή η επέκταση αυτού του Trust Cache με ένα εξωτερικό αρχείο.
References
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.