hacktricks/mobile-pentesting/ios-pentesting/ios-basics.md

21 KiB
Raw Permalink Blame History

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

Διαχωρισμός Δικαιωμάτων και Sandbox

Στο 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.

# 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, συνδυάζοντας τον κωδικό πρόσβασης του χρήστη με ένα salt που προέρχεται από το UID της συσκευής, ένα στοιχείο που μπορεί να προσπελαστεί μόνο από το secure enclave chipset. Ως εκ τούτου, ακόμη και αν ο κωδικός πρόσβασης του χρήστη είναι γνωστός, το περιεχόμενο του Keychain παραμένει μη προσβάσιμο σε οποιαδήποτε συσκευή εκτός από αυτήν στην οποία κρυπτογραφήθηκε αρχικά.

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

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

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

  • SecItemAdd: Προσθέτει ένα νέο στοιχείο στο Keychain.
  • SecItemUpdate: Ενημερώνει ένα υπάρχον στοιχείο στο Keychain.
  • SecItemCopyMatching: Ανακτά ένα στοιχείο από το Keychain.
  • SecItemDelete: Αφαιρεί ένα στοιχείο από το Keychain.

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

Ρύθμιση Προστασίας Δεδομένων Στοιχείων Keychain

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

  • kSecAttrAccessibleAlways: Προσβάσιμο οποιαδήποτε στιγμή, ανεξάρτητα από την κατάσταση κλειδώματος της συσκευής.
  • kSecAttrAccessibleAlwaysThisDeviceOnly: Πάντα προσβάσιμο, αλλά δεν περιλαμβάνεται σε αντίγραφα ασφαλείας.
  • kSecAttrAccessibleAfterFirstUnlock: Προσβάσιμο μετά την πρώτη ξεκλείδωμα μετά την επανεκκίνηση.
  • kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly: Το ίδιο με παραπάνω, αλλά δεν είναι μετα transferable σε νέες συσκευές.
  • kSecAttrAccessibleWhenUnlocked: Μόνο προσβάσιμο όταν η συσκευή είναι ξεκλειδωμένη.
  • kSecAttrAccessibleWhenUnlockedThisDeviceOnly: Προσβάσιμο όταν είναι ξεκλειδωμένο, δεν περιλαμβάνεται σε αντίγραφα ασφαλείας.
  • kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly: Απαιτεί κωδικό πρόσβασης συσκευής, δεν περιλαμβάνεται σε αντίγραφα ασφαλείας.

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

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

{% hint style="warning" %} Σε jailbroken συσκευές, οι προστασίες του Keychain είναι συμβιβασμένες, θέτοντας σημαντικό κίνδυνο ασφάλειας. {% endhint %}

Διαρκεια Δεδομένων 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.

Οι προγραμματιστές έχουν τη δυνατότητα να ρυθμίζουν ορισμένες δυνατότητες ή άδειες για τις εφαρμογές τους, όπως Data Protection ή Keychain Sharing. Αυτές οι άδειες εφαρμόζονται αμέσως μετά την εγκατάσταση της εφαρμογής. Παρ' όλα αυτά, για την πρόσβαση σε ορισμένους προστατευμένους πόρους, η εφαρμογή πρέπει να αποκτήσει ρητή συγκατάθεση από τον χρήστη κατά την πρώτη προσπάθεια. Αυτό επιτυγχάνεται μέσω της χρήσης purpose strings ή usage description strings, οι οποίες παρουσιάζονται στους χρήστες σε μια ειδοποίηση αίτησης άδειας.

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

  1. Άνοιγμα του έργου στο Xcode.
  2. Εντοπισμός και άνοιγμα του αρχείου Info.plist.
  3. Αναζήτηση κλειδιών που αρχίζουν με "Privacy -", με την επιλογή να δουν ακατέργαστα κλειδιά/τιμές για σαφήνεια.

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

  1. Αποσυμπιέστε το IPA.
  2. Εντοπίστε το αρχείο Info.plist μέσα στο Payload/<appname>.app/.
  3. Μετατρέψτε το αρχείο σε μορφή XML αν χρειάζεται, για ευκολότερη επιθεώρηση.

Για παράδειγμα, οι purpose strings στο αρχείο 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>

Device Capabilities

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

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

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

Δικαιώματα

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

Αναφορές

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}