iOS应用组与共享数据
背景
追踪iOS应用的数据文件夹(即沙盒路径)相对简单,只需查看位于/private/var/mobile/Library/FrontBoard/的applicationState.db SQLite数据库。然而,定位其应用组(AppGroups)和扩展(Extensions)的沙盒文件夹则不那么直接。
Scott Vance等人建议的方法是查看每个UUID文件夹下的.com.apple.mobile_container_manager.metadata.plist文件:
/private/var/containers/Shared/SystemGroup/UUID//private/var/mobile/Containers/Shared/AppGroup/UUID//private/var/mobile/Containers/Data/InternalDaemon/UUID//private/var/mobile/Containers/Data/PluginKitPlugin/UUID/
如Scott所述,iLEAPP工具也采用这种方法,读取所有plist文件并列出路径及其组名。对于手动分析,这种方法效果很好,因为可以从组名中直观识别应用名称。例如,Notes应用的bundle_id为com.apple.mobilenotes,其一个共享组(实际存储Notes数据库的位置)的ID为group.com.apple.notes。
问题
对于自动化分析,这种方法无效,因为每个应用遵循自己的ID命名约定。程序无法知道group.com.apple.notes对应com.apple.mobilenotes。因此,我们需要寻找更直接的引用,将共享容器与其应用连接起来。
在进一步讨论之前,理解扩展、应用和共享容器之间的关系非常重要。下图很好地总结了这一点。共享容器通过AppGroups进行标识。
图1 - iOS应用、扩展、容器关系 - 来源:https://medium.com/@manibatra23/sharing-data-using-core-data-ios-app-and-extension-fb0a176eaee9
解决方案
幸运的是,iOS上有一个跟踪容器信息的数据库。它位于/private/var/root/Library/MobileContainerManager/containers.sqlite3。
它精确列出了所有应用、它们的扩展、AppGroups和权限。据我所知,这是存储此信息的唯一位置(除了缓存和日志)。它没有UUID信息。该数据库在SANS智能手机取证海报中列出,但我在其他地方找不到任何详细信息。
数据库结构简单,只有3个主要表(和一个sqlite_sequence表)。
图2 - containers.sqlite数据库表
child_bundles表列出了扩展及其所有者应用。在下图中,您可以看到com.apple.mobilenotes应用的扩展。
图3 - child_bundles表,过滤’notes’
或者可以编写一个小查询来列出所有应用及其扩展名,如下所示。
图4 - 应用和扩展 - 查询和输出
关于AppGroups的信息在code_signing_data表的data字段中以BLOB形式存储,其中存储了一个二进制plist。
图5 - 来自’code_signing_data.data’的Plist(用于com.apple.mobilenotes - cs_info_id 456)
权限字典中包含大量信息。如果此应用创建了共享AppGroup,则它将显示在com.apple.security.application-groups下。在com.apple.security.system-groups下也可能有组。
图6 - 权限部分中的AppGroup信息(在plist中)
因此,从上述数据中,我们知道Notes应用有5个扩展和2个AppGroups,并且我们也有确切的字符串名称(即ID) - group.com.apple.notes和group.com.apple.notes.import。将这些数据与我们之前从每个UUID文件夹中的.com.apple.mobile_container_manager.metadata.plist文件找到的信息关联起来,我们可以基于容器ID(AppGroup名称)以编程方式搜索并将两者链接为同一应用的一部分。
图7 - AppGroup/UUID文件夹显示plist的内容和容器所有者ID
这种方法在ios_apt的APPS插件中实现,该插件现在列出每个应用、其AppGroups、SystemGroups、Extensions以及所有关系。因此,您现在无需手动执行任何操作。享受吧!
图8 - 来自ios_apt输出的应用表(此处未显示所有列)
图9 - 来自ios_apt输出的AppGroupInfo表