iOS Basics

Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

Διαχωρισμός Προνομίων και Αμμοθύρα

Στο iOS, υπάρχει μια διάκριση στα προνόμια μεταξύ των εφαρμογών προσβάσιμων από τον χρήστη και των πυρήνα των διεργασιών του συστήματος. Οι εφαρμογές λειτουργούν υπό την ταυτότητα του χρήστη mobile, ενώ οι κρίσιμες διεργασίες του συστήματος λειτουργούν ως root. Αυτός ο διαχωρισμός ενισχύεται από έναν μηχανισμό αμμοθύρας, ο οποίος επιβάλλει αυστηρούς περιορισμούς στις ενέργειες που μπορούν να πραγματοποιήσουν οι εφαρμογές. Για παράδειγμα, ακόμα κι αν οι εφαρμογές μοιράζονται την ίδια ταυτότητα χρήστη, τους απαγορεύεται η πρόσβαση ή η τροποποίηση των δεδομένων η μίας από την άλλη.

Οι εφαρμογές εγκαθίστανται σε ένα συγκεκριμένο φάκελο (private/var/mobile/Applications/{τυχαίο ID}) και έχουν περιορισμένη ανάγνωση σε συγκεκριμένους τομείς και λειτουργίες του συστήματος, όπως τα SMS και οι τηλεφωνικές κλήσεις. Η πρόσβαση σε προστατευμένους τομείς ενεργοποιεί ένα αίτημα για άδεια χρήστη.

Προστασία Δεδομένων

Το iOS προσφέρει στους προγραμματιστές τις Διεπαφές Προστασίας Δεδομένων, που βασίζονται στον Επεξεργαστή Ασφαλούς Χώρου (SEP) - ένα αφιερωμένο συνεπεξεργαστή για κρυπτογραφικές λειτουργίες και διαχείριση κλειδιών. Ο SEP εξασφαλίζει την ακεραιότητα της προστασίας των δεδομένων μέσω ενός μοναδικού κλειδιού που είναι ειδικό για τη συσκευή, το UID της συσκευής, που ενσωματώνεται σε αυτήν.

Κατά τη δημιουργία ενός αρχείου, δημιουργείται ένα μοναδικό κλειδί κρυπτογράφησης AES 256-bit, το οποίο κρυπτογραφεί το περιεχόμενο του αρχείου. Αυτό το κλειδί κρυπτογράφησης, μαζί με ένα αναγνωριστικό κλάσης, κρυπτογραφείται στη συνέχεια χρησιμοποιώντας ένα κλειδί κλάσης και αποθηκεύεται στα μεταδεδομένα του αρχείου. Η αποκρυπτογράφηση ενός αρχείου περιλαμβάνει τη χρήση του κλειδιού του συστήματος για να αποκτήσει πρόσβαση στα μεταδεδομένα, να ανακτήσει το κλειδί κλάσης με το αναγνωριστικό κλάσης και στη συνέχεια να αποκρυπτογραφήσει το μοναδικό κλειδί κρυπτογράφησης του αρχείου.

Το iOS ορίζει τέσσερις κλάσεις προστασίας για την ασφάλεια των δεδομένων, οι οποίες καθορίζουν πότε και πώς μπορούν να προσπελαστούν τα δεδομένα:

  • Πλήρης Προστασία (NSFileProtectionComplete): Τα δεδομένα είναι απρόσβατα μέχρι η συσκευή να ξεκλειδωθεί με τον κωδικό πρόσβασης του χρήστη.

  • Προστατευμένα Εκτός Αν Είναι Ανοιχτά (NSFileProtectionCompleteUnlessOpen): Επιτρέπει την πρόσβαση σε αρχεία ακόμα και μετά το κλείδωμα της συσκευής, εφόσον το αρχείο ήταν ανοιχτό όταν η συσκευή ήταν ξεκλειδωμένη.

  • Προστατευμένα Μέχρι Την Πρώτη Ταυτοποίηση Χρήστη (NSFileProtectionCompleteUntilFirstUserAuthentication): Τα δεδομένα είναι προσπελάσιμα μετά την πρώτη ξεκλείδωση του χρήστη μετά την εκκίνηση, παραμένοντας προσπελάσιμα ακόμα κι αν η συσκευή κλειδωθεί ξανά.

  • Χωρίς Προστασία (NSFileProtectionNone): Τα δεδομένα προστατεύονται μόνο από το UID της συσκευής, διευκολύνοντας την άμεση απομάκρυνση των δεδομένων από απόσταση.

Η κρυπτογράφηση όλων των κλάσεων, εκτός από την NSFileProtectionNone, περιλαμβάνει έν

# Example code to use FileDP for checking file protection class
# Note: Ensure your device is jailbroken and has Python installed to use FileDP.
# Installation and usage of FileDP:
git clone https://github.com/abjurato/FileDp-Source
cd FileDp-Source
python filedp.py /path/to/check

Το Keychain

Στο iOS, ένα Keychain λειτουργεί ως ένα ασφαλές κρυπτογραφημένο δοχείο για την αποθήκευση ευαίσθητων πληροφοριών, προσβάσιμο μόνο από την εφαρμογή που τις αποθήκευσε ή από εκείνες που έχουν εξουσιοδοτηθεί ρητά. Αυτή η κρυπτογράφηση ενισχύεται από ένα μοναδικό κωδικό πρόσβασης που δημιουργείται από το iOS, ο οποίος καθαυτός κρυπτογραφείται με τον αλγόριθμο AES. Αυτή η διαδικασία κρυπτογράφησης χρησιμοποιεί μια συνάρτηση PBKDF2, συνδυάζοντας τον κωδικό πρόσβασης του χρήστη με ένα αλάτι που προέρχεται από το UID της συσκευής, ένα στοιχείο που μόνο το τσιπ του ασφαλούς χώρου μπορεί να αποκτήσει πρόσβαση. Ως εκ τούτου, ακόμη και αν γνωρίζεται ο κωδικός πρόσβασης του χρήστη, τα περιεχόμενα του Keychain παραμένουν απροσπέλαστα σε οποιαδήποτε συσκευή εκτός από αυτήν όπου αρχικά κρυπτογραφήθηκαν.

Η διαχείριση και η πρόσβαση στα δεδομένα του Keychain χειρίζονται από τον δαίμονα securityd, βασιζόμενος σε συγκεκριμένα δικαιώματα εφαρμογής όπως Keychain-access-groups και application-identifier.

Λειτουργίες του Keychain API

Το Keychain API, που αναλύεται στην τεκμηρίωση των Keychain Services της Apple, παρέχει βασικές λειτουργίες για τη διαχείριση ασφαλούς αποθήκευσης:

  • SecItemAdd: Προσθέτει ένα νέο στοιχείο στο Keychain.

  • SecItemUpdate: Ενημερώνει ένα υπάρχον στοιχείο στο Keychain.

  • SecItemCopyMatching: Ανακτά ένα στοιχείο από το Keychain.

  • SecItemDelete: Αφαιρεί ένα στοιχείο από το Keychain.

Η επίθεση με βίαιη αναζήτηση του κωδικού πρόσβασης του Keychain περιλαμβάνει είτε την επίθεση απευθείας στον κρυπτογραφημένο κλειδί είτε την προσπάθεια μαντέψιας του κωδικού πρόσβασης στη συσκευή, που δυσχεραίνεται σημαντικά από την επιβολή καθυστέρησης από τον ασφαλή χώρο μεταξύ αποτυχημένων προσπαθειών.

Διαμόρφωση της προστασίας δεδομένων των στοιχείων του Keychain

Τα επίπεδα προστασίας δεδομένων για τα στοιχεία του Keychain ορίζονται χρησιμοποιώντας το χαρακτηριστικό kSecAttrAccessible κατά τη δημιουργία ή την ενημέρωση του στοιχείου. Αυτά τα επίπεδα, όπως καθορίζονται από την Apple, καθορίζουν πότε και πώς είναι προσβάσιμα τα στοιχεία του Keychain:

  • kSecAttrAccessibleAlways: Προσβάσιμα ανά πάσα στιγμή, ανεξάρτητα από την κατάσταση κλειδώματος της συσκευής.

  • kSecAttrAccessibleAlwaysThisDeviceOnly: Πάντα προσβάσιμα, αλλά δεν περιλαμβάνονται στα αντίγραφα ασφαλείας.

  • kSecAttrAccessibleAfterFirstUnlock: Προσβάσιμα μετά το πρώτο ξεκλείδωμα μετά την επανεκκίνηση.

  • kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly: Ίδια με το παραπάνω, αλλά μη μεταφερόμενα σε νέες συσκευές.

  • kSecAttrAccessibleWhenUnlocked: Προσβάσιμα μόνο όταν η συσκευή είναι ξεκλείδωτη.

  • kSecAttrAccessibleWhenUnlockedThisDeviceOnly: Προσβάσιμα όταν είναι ξεκλείδωτη, δεν περιλαμβάνονται στα αντίγραφα ασφαλείας.

  • kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly: Απαιτεί κωδικό πρόσβασης συσκευής, δεν περιλαμβάνεται στα αντίγραφα ασφαλείας.

Τα AccessControlFlags περαιτέρω καθορίζουν τις μεθόδους πρόσβασης, επιτρέποντας τη βιομετρική ταυτοποίηση ή τη χρήση κωδικού πρόσβασης.

Προειδοποίηση για συσκευές με Jailbreak

Σε συσκευές με jailbreak, οι προστασίες του Keychain διακυβεύονται, δημιουργώντας σημαντικό κίνδυνο για την ασφάλεια.

Μόνιμη αποθήκευση των δεδομένων του Keychain

Αντίθετα από τα δεδομένα που αφορούν μια συγκεκριμένη εφαρμογή και διαγράφονται κατά την απεγκατάσταση της εφαρμογής, τα δεδομένα του Keychain παραμένουν στη συσκευή. Αυτό το χαρακτηριστικό μπορεί να επιτρέψει σε νέους κατόχους μιας μεταχειρισμένης συσκευής να έχουν πρόσβαση στα δεδομένα της προηγούμενης κατόχου απλά επανεγκαθιστώντας τις εφαρμογές. Συνιστάται στους προγραμματιστές να διαγράφουν προληπτικά τα δεδομένα του Keychain κατά την εγκατάσταση της εφαρμογής ή κατά την αποσύνδεση για να μειωθεί αυτός ο κίνδυνος. Παρακάτω παρουσιάζεται ένα παράδειγμα κώδικα σε Swift που δείχνει πώς να διαγράψετε τα δεδομένα του Keychain κατά την πρώτη εκκίνηση της εφαρμογής:

let userDefaults = UserDefaults.standard

if userDefaults.bool(forKey: "hasRunBefore") == false {
// Remove Keychain items here

// Update the flag indicator
userDefaults.set(true, forKey: "hasRunBefore")
userDefaults.synchronize() // Forces the app to update UserDefaults
}

Δυνατότητες της εφαρμογής

Στον κόσμο της ανάπτυξης εφαρμογών, η sandboxing παίζει έναν κρίσιμο ρόλο στην ενίσχυση της ασφάλειας. Αυτή η διαδικασία εξασφαλίζει ότι κάθε εφαρμογή λειτουργεί εντός του δικού της μοναδικού καταλόγου, αποτρέποντας την πρόσβασή της σε αρχεία συστήματος ή δεδομένα που ανήκουν σε άλλες εφαρμογές. Η επιβολή αυτών των περιορισμών γίνεται μέσω των πολιτικών sandbox, που αποτελούν μέρος του Trusted BSD (MAC) Mandatory Access Control Framework.

Οι προγραμματιστές έχουν τη δυνατότητα να διαμορφώνουν ορισμένες δυνατότητες ή άδειες για τις εφαρμογές τους, όπως η Προστασία Δεδομένων ή η Κοινή Χρήση Keychain. Αυτές οι άδειες εφαρμόζονται αμέσως μετά την εγκατάσταση της εφαρμογής. Ωστόσο, για να έχει πρόσβαση σε ορισμένους προστατευμένους πόρους, η εφαρμογή πρέπει να λάβει ρητή συγκατάθεση από τον χρήστη κατά την πρώτη προσπάθεια. Αυτό επιτυγχάνεται μέσω της χρήσης συμβολοσειρών σκοπού ή περιγραφών χρήσης, οι οποίες παρουσιάζονται στους χρήστες σε ένα παράθυρο αιτήματος άδειας.

Για όσους έχουν πρόσβαση στον πηγαίο κώδικα, η επαλήθευση των άδειών που περιλαμβάνονται στο αρχείο Info.plist μπορεί να γίνει με τα εξής βήματα:

  1. Άνοιγμα του έργου στο Xcode.

  2. Εντοπισμός και άνοιγμα του αρχείου Info.plist.

  3. Αναζήτηση για κλειδιά που ξεκινούν με "Privacy -", με τη δυνατότητα προβολής ακατέργαστων κλειδιών/τιμών για καλύτερη κατανόηση.

Όταν ασχολούμαστε με ένα αρχείο IPA, μπορούμε να ακολουθήσουμε τα παρακάτω βήματα:

  1. Αποσυμπίεση του αρχείου IPA.

  2. Εντοπισμός του αρχείου Info.plist μέσα στο Payload/<appname>.app/.

  3. Μετατροπή του αρχείου σε μορφή XML αν είναι απαραίτητο, για ευκολότερο έλεγχο.

Για παράδειγμα, οι συμβολοσειρές σκοπού στο αρχείο Info.plist μπορεί να φαίνονται ως εξής:

<plist version="1.0">
<dict>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Your location is used to provide turn-by-turn directions to your destination.</string>

Δυνατότητες Συσκευής

Το αρχείο Info.plist ενός εφαρμογής καθορίζει τις δυνατότητες της συσκευής που βοηθούν το App Store να φιλτράρει τις εφαρμογές για συμβατότητα με τη συσκευή. Αυτές καθορίζονται υπό το κλειδί UIRequiredDeviceCapabilities. Για παράδειγμα:

<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>

Αυτό το παράδειγμα υποδεικνύει ότι η εφαρμογή είναι συμβατή με το σύνολο εντολών armv7. Οι προγραμματιστές μπορούν επίσης να καθορίσουν δυνατότητες όπως το nfc για να εξασφαλίσουν ότι η εφαρμογή τους είναι διαθέσιμη μόνο σε συσκευές που υποστηρίζουν NFC.

Εξουσιοδοτήσεις

Οι εξουσιοδοτήσεις είναι ένα ακόμα κρίσιμο στοιχείο της ανάπτυξης εφαρμογών iOS, λειτουργώντας ως ζεύγη κλειδιού-τιμής που επιτρέπουν στις εφαρμογές να εκτελούν συγκεκριμένες λειτουργίες πέρα ​​από τους ελέγχους χρόνου εκτέλεσης. Για παράδειγμα, η ενεργοποίηση της Προστασίας Δεδομένων σε μια εφαρμογή περιλαμβάνει την προσθήκη μιας συγκεκριμένης εξουσιοδότησης στο έργο Xcode, η οποία αντανακλάται στο αρχείο εξουσιοδοτήσεων της εφαρμογής ή στο ενσωματωμένο αρχείο παροχής για τα IPAs.

Αναφορές

Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

Last updated