iOS Basics
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)
Στο iOS, υπάρχει διάκριση στα δικαιώματα μεταξύ των εφαρμογών που είναι προσβάσιμες από τον χρήστη και των βασικών διαδικασιών του συστήματος. Οι εφαρμογές εκτελούνται υπό την ταυτότητα χρήστη mobile
, ενώ οι κρίσιμες διαδικασίες του συστήματος λειτουργούν ως root
. Αυτός ο διαχωρισμός ενισχύεται από έναν μηχανισμό sandbox, ο οποίος επιβάλλει αυστηρούς περιορισμούς σχετικά με τις ενέργειες που μπορούν να αναλάβουν οι εφαρμογές. Για παράδειγμα, ακόμη και αν οι εφαρμογές μοιράζονται την ίδια ταυτότητα χρήστη, απαγορεύεται να έχουν πρόσβαση ή να τροποποιούν τα δεδομένα η μία της άλλης.
Οι εφαρμογές εγκαθίστανται σε έναν συγκεκριμένο φάκελο (private/var/mobile/Applications/{random ID}
) και έχουν περιορισμένη πρόσβαση ανάγνωσης σε ορισμένες περιοχές και λειτουργίες του συστήματος, όπως τα SMS και τις τηλεφωνικές κλήσεις. Η πρόσβαση σε προστατευμένες περιοχές ενεργοποιεί ένα αναδυόμενο αίτημα για άδεια χρήστη.
Το iOS προσφέρει στους προγραμματιστές τις API Προστασίας Δεδομένων, που είναι χτισμένες πάνω στον Secure Enclave Processor (SEP) — έναν ειδικό επεξεργαστή για κρυπτογραφικές λειτουργίες και διαχείριση κλειδιών. Ο SEP διασφαλίζει την ακεραιότητα της προστασίας των δεδομένων μέσω ενός μοναδικού κλειδιού που είναι συγκεκριμένο για τη συσκευή, το UID της συσκευής, που είναι ενσωματωμένο σε αυτόν.
Κατά τη δημιουργία αρχείου, παράγεται ένα μοναδικό κλειδί κρυπτογράφησης AES 256-bit, το οποίο κρυπτογραφεί το περιεχόμενο του αρχείου. Αυτό το κλειδί κρυπτογράφησης, μαζί με ένα ID κατηγορίας, κρυπτογραφείται στη συνέχεια χρησιμοποιώντας ένα κλειδί κατηγορίας και αποθηκεύεται στα μεταδεδομένα του αρχείου. Η αποκρυπτογράφηση ενός αρχείου περιλαμβάνει τη χρήση του κλειδιού του συστήματος για πρόσβαση στα μεταδεδομένα, την ανάκτηση του κλειδιού κατηγορίας με το ID κατηγορίας και στη συνέχεια την αποκρυπτογράφηση του μοναδικού κλειδιού κρυπτογράφησης του αρχείου.
Το iOS ορίζει τέσσερις κατηγορίες προστασίας για την ασφάλεια των δεδομένων, οι οποίες καθορίζουν πότε και πώς μπορούν να προσπελαστούν τα δεδομένα:
Πλήρης Προστασία (NSFileProtectionComplete): Τα δεδομένα είναι μη προσβάσιμα μέχρι να ξεκλειδώσει η συσκευή χρησιμοποιώντας τον κωδικό πρόσβασης του χρήστη.
Προστατευμένα εκτός αν είναι Ανοιχτά (NSFileProtectionCompleteUnlessOpen): Επιτρέπει την πρόσβαση στο αρχείο ακόμη και μετά το κλείδωμα της συσκευής, εφόσον το αρχείο ήταν ανοιχτό όταν η συσκευή ξεκλειδώθηκε.
Προστατευμένα μέχρι την Πρώτη Αυθεντικοποίηση Χρήστη (NSFileProtectionCompleteUntilFirstUserAuthentication): Τα δεδομένα είναι προσβάσιμα μετά την πρώτη ξεκλείδωμα του χρήστη μετά την εκκίνηση, παραμένοντας προσβάσιμα ακόμη και αν η συσκευή κλειδώσει ξανά.
Χωρίς Προστασία (NSFileProtectionNone): Τα δεδομένα προστατεύονται μόνο από το UID της συσκευής, διευκολύνοντας την γρήγορη απομάκρυνση δεδομένων από απόσταση.
Η κρυπτογράφηση όλων των κατηγοριών, εκτός από το NSFileProtectionNone
, περιλαμβάνει ένα κλειδί που προέρχεται τόσο από το UID της συσκευής όσο και από τον κωδικό πρόσβασης του χρήστη, διασφαλίζοντας ότι η αποκρυπτογράφηση είναι δυνατή μόνο στη συσκευή με τον σωστό κωδικό πρόσβασης. Από το iOS 7 και μετά, η προεπιλεγμένη κατηγορία προστασίας είναι "Προστατευμένα μέχρι την Πρώτη Αυθεντικοποίηση Χρήστη".
Οι προγραμματιστές μπορούν να χρησιμοποιήσουν το FileDP, ένα εργαλείο για την επιθεώρηση της κατηγορίας προστασίας δεδομένων των αρχείων σε ένα iPhone.
Στο iOS, ένα Keychain λειτουργεί ως ασφαλές κρυπτογραφημένο δοχείο για την αποθήκευση ευαίσθητων πληροφοριών, προσβάσιμες μόνο από την εφαρμογή που τις αποθήκευσε ή από εκείνες που έχουν ρητά εξουσιοδοτηθεί. Αυτή η κρυπτογράφηση ενισχύεται από έναν μοναδικό κωδικό πρόσβασης που δημιουργείται από το iOS, ο οποίος είναι επίσης κρυπτογραφημένος με AES. Αυτή η διαδικασία κρυπτογράφησης αξιοποιεί μια λειτουργία PBKDF2, συνδυάζοντας τον κωδικό πρόσβασης του χρήστη με ένα salt που προέρχεται από το UID της συσκευής, ένα στοιχείο που μπορεί να προσπελαστεί μόνο από το secure enclave chipset. Ως εκ τούτου, ακόμη και αν ο κωδικός πρόσβασης του χρήστη είναι γνωστός, το περιεχόμενο του Keychain παραμένει μη προσβάσιμο σε οποιαδήποτε συσκευή εκτός από αυτήν στην οποία κρυπτογραφήθηκε αρχικά.
Η διαχείριση και η πρόσβαση στα δεδομένα του Keychain διευθύνονται από τον securityd
daemon, με βάση συγκεκριμένα δικαιώματα εφαρμογής όπως Keychain-access-groups
και application-identifier
.
Η API του Keychain, που αναλύεται στην τεκμηρίωση Υπηρεσιών Keychain της Apple, παρέχει βασικές λειτουργίες για τη διαχείριση ασφαλούς αποθήκευσης:
SecItemAdd
: Προσθέτει ένα νέο στοιχείο στο Keychain.
SecItemUpdate
: Ενημερώνει ένα υπάρχον στοιχείο στο Keychain.
SecItemCopyMatching
: Ανακτά ένα στοιχείο από το Keychain.
SecItemDelete
: Αφαιρεί ένα στοιχείο από το Keychain.
Η βίαιη παραβίαση του κωδικού πρόσβασης του Keychain περιλαμβάνει είτε την επίθεση στον κρυπτογραφημένο κωδικό απευθείας είτε την προσπάθεια μαντεψιάς του κωδικού πρόσβασης στη συσκευή, εμποδισμένη σημαντικά από την επιβολή καθυστέρησης του secure enclave μεταξύ αποτυχημένων προσπαθειών.
Τα επίπεδα προστασίας δεδομένων για τα στοιχεία του Keychain ορίζονται χρησιμοποιώντας το χαρακτηριστικό kSecAttrAccessible
κατά τη δημιουργία ή την ενημέρωση στοιχείου. Αυτά τα επίπεδα, όπως καθορίζεται από την Apple, καθορίζουν πότε και πώς είναι προσβάσιμα τα στοιχεία του Keychain:
kSecAttrAccessibleAlways
: Προσβάσιμο οποιαδήποτε στιγμή, ανεξάρτητα από την κατάσταση κλειδώματος της συσκευής.
kSecAttrAccessibleAlwaysThisDeviceOnly
: Πάντα προσβάσιμο, αλλά δεν περιλαμβάνεται σε αντίγραφα ασφαλείας.
kSecAttrAccessibleAfterFirstUnlock
: Προσβάσιμο μετά την πρώτη ξεκλείδωμα μετά την επανεκκίνηση.
kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly
: Το ίδιο με παραπάνω, αλλά δεν είναι μετα transferable σε νέες συσκευές.
kSecAttrAccessibleWhenUnlocked
: Μόνο προσβάσιμο όταν η συσκευή είναι ξεκλειδωμένη.
kSecAttrAccessibleWhenUnlockedThisDeviceOnly
: Προσβάσιμο όταν είναι ξεκλειδωμένο, δεν περιλαμβάνεται σε αντίγραφα ασφαλείας.
kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
: Απαιτεί κωδικό πρόσβασης συσκευής, δεν περιλαμβάνεται σε αντίγραφα ασφαλείας.
AccessControlFlags
διευρύνουν περαιτέρω τις μεθόδους πρόσβασης, επιτρέποντας τη βιομετρική αυθεντικοποίηση ή τη χρήση κωδικού πρόσβασης.
Σε jailbroken συσκευές, οι προστασίες του Keychain είναι συμβιβασμένες, θέτοντας σημαντικό κίνδυνο ασφάλειας.
Σε αντίθεση με τα δεδομένα που σχετίζονται με την εφαρμογή που διαγράφονται κατά την απεγκατάσταση της εφαρμογής, τα δεδομένα του Keychain παραμένουν στη συσκευή. Αυτή η χαρακτηριστική θα μπορούσε να επιτρέψει στους νέους ιδιοκτήτες μιας μεταχειρισμένης συσκευής να αποκτήσουν πρόσβαση στα δεδομένα της προηγούμενης εφαρμογής απλά επανεγκαθιστώντας τις εφαρμογές. Οι προγραμματιστές συνιστάται να καθαρίζουν ενεργά τα δεδομένα του Keychain κατά την εγκατάσταση της εφαρμογής ή κατά την αποσύνδεση για να μετριάσουν αυτόν τον κίνδυνο. Ακολουθεί ένα παράδειγμα κώδικα Swift που δείχνει πώς να καθαρίσετε τα δεδομένα του Keychain κατά την πρώτη εκκίνηση της εφαρμογής:
Στον τομέα της ανάπτυξης εφαρμογών, sandboxing παίζει κρίσιμο ρόλο στην ενίσχυση της ασφάλειας. Αυτή η διαδικασία διασφαλίζει ότι κάθε εφαρμογή λειτουργεί μέσα στον δικό της μοναδικό κατάλογο, αποτρέποντας έτσι την πρόσβαση σε αρχεία ή δεδομένα του συστήματος που ανήκουν σε άλλες εφαρμογές. Η επιβολή αυτών των περιορισμών πραγματοποιείται μέσω πολιτικών sandbox, οι οποίες είναι μέρος του Trusted BSD (MAC) Mandatory Access Control Framework.
Οι προγραμματιστές έχουν τη δυνατότητα να ρυθμίζουν ορισμένες ικανότητες ή άδειες για τις εφαρμογές τους, όπως Data Protection ή Keychain Sharing. Αυτές οι άδειες εφαρμόζονται αμέσως μετά την εγκατάσταση της εφαρμογής. Παρ' όλα αυτά, για την πρόσβαση σε ορισμένους προστατευμένους πόρους, η εφαρμογή πρέπει να αποκτήσει ρητή συγκατάθεση από τον χρήστη κατά την πρώτη προσπάθεια. Αυτό επιτυγχάνεται μέσω της χρήσης purpose strings ή usage description strings, οι οποίες παρουσιάζονται στους χρήστες σε μια ειδοποίηση αίτησης άδειας.
Για όσους έχουν πρόσβαση στον πηγαίο κώδικα, η επαλήθευση των αδειών που περιλαμβάνονται στο αρχείο Info.plist
μπορεί να γίνει με:
Άνοιγμα του έργου στο Xcode.
Εντοπισμός και άνοιγμα του αρχείου Info.plist
.
Αναζήτηση κλειδιών που αρχίζουν με "Privacy -"
, με την επιλογή να δουν ακατέργαστα κλειδιά/τιμές για σαφήνεια.
Όταν ασχολείστε με ένα αρχείο IPA, μπορείτε να ακολουθήσετε τα εξής βήματα:
Αποσυμπιέστε το IPA.
Εντοπίστε το αρχείο Info.plist
μέσα στο Payload/<appname>.app/
.
Μετατρέψτε το αρχείο σε μορφή XML αν χρειάζεται, για ευκολότερη επιθεώρηση.
Για παράδειγμα, οι purpose strings στο αρχείο Info.plist
μπορεί να φαίνονται έτσι:
Το αρχείο Info.plist
μιας εφαρμογής καθορίζει τις δυνατότητες της συσκευής που βοηθούν το App Store να φιλτράρει τις εφαρμογές για συμβατότητα με τη συσκευή. Αυτές ορίζονται κάτω από το UIRequiredDeviceCapabilities
κλειδί. Για παράδειγμα:
Αυτό το παράδειγμα υποδεικνύει ότι η εφαρμογή είναι συμβατή με το σύνολο εντολών armv7. Οι προγραμματιστές μπορούν επίσης να καθορίσουν δυνατότητες όπως το nfc για να διασφαλίσουν ότι η εφαρμογή τους είναι διαθέσιμη μόνο σε συσκευές που υποστηρίζουν NFC.
Δικαιώματα είναι μια άλλη κρίσιμη πτυχή της ανάπτυξης εφαρμογών iOS, που λειτουργούν ως ζεύγη κλειδιού-τιμής που παρέχουν στις εφαρμογές άδεια να εκτελούν ορισμένες λειτουργίες πέρα από τους ελέγχους χρόνου εκτέλεσης. Για παράδειγμα, η ενεργοποίηση της Προστασίας Δεδομένων σε μια εφαρμογή περιλαμβάνει την προσθήκη ενός συγκεκριμένου δικαιώματος στο έργο Xcode, το οποίο στη συνέχεια αντικατοπτρίζεται στο αρχείο δικαιωμάτων της εφαρμογής ή στο ενσωματωμένο αρχείο κινητής παροχής για IPAs.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)