iOS知识库同步数据取证:跨设备消息意图解析

本文深入探讨iOS知识库中Sync Peers同步机制,揭示如何从未安装的应用中恢复消息数据。通过SQL查询解析Message Intents,展示WhatsApp等应用跨设备数据同步现象,为数字取证提供新视角。

DoubleBlak [Sync Peers]

Ian Whiffin
发布于:2024年9月22日

最近发生了一件有点有趣的事情。和许多检测人员一样,特别是那些喜欢做研究的人,我拥有大量测试设备,其中绝大多数是iOS设备。

我发誓这没问题。

我通常使用测试账户登录这些设备进行操作,但偶尔需要使用真实账户。最近,我在一台设备上使用真实账户访问iOS18的完整文件系统,为ArtEx的新版本准备测试一系列功能。

其中一项测试恰好涉及knowledgeC的消息意图解析器。过去我已经多次撰文介绍knowledgeC,这里不再赘述,但"消息意图"可能对某些人来说比较陌生。

“意图"本质上是沙盒化应用程序通过操作系统相互传递数据的一种方式。作为"意图"传递的数据可以包含多种信息。例如,想象在Safari中点击位置链接,这会启动地图应用并加载相应地点。这就是一个从Safari传递到地图的"意图”,包含要打开的位置信息。

这种意图很可能会被记录在knowledgeC中。感谢KnowledgeC :)

很久以前,我发现还存在"消息意图",这些是出于某种原因(可能是通知?)作为意图发送的消息。它们存在的原因在这里不太重要,重要的是你可以从knowledgeC中恢复来自多个不同应用程序的传入消息数据,ArtEx和其他一些工具都利用这一点,这在原始消息已被删除时特别有用。

如果你想手动查看,我在这里简要说明:

从knowledgeC中,找到ZSTREAMNAME为"/app/intents"且ZVALUESTING为"Messages"的记录。

1
SELECT * FROM ZOBJECT WHERE ZSTREAMNAME LIKE '/app/intents' AND ZVALUESTRING LIKE 'Messages'

这将给你ZOBJECT记录,但我们真正感兴趣的是关联的ZSTRUCTUREDMETADATA表中的数据。

上述查询结果将包含一个名为ZSTRUCTUREDMETADATA的列,这是指向ZSTRUCTUREDMETADATA表的外键。

我们可以这样快速连接它们:

1
2
3
4
SELECT * FROM ZOBJECT 
JOIN ZSTRUCTUREDMETADATA 
ON ZOBJECT.ZSTRUCTUREDMETADATA = ZSTRUCTUREDMETADATA.Z_PK
WHERE ZSTREAMNAME LIKE '/app/intents' AND ZVALUESTRING LIKE 'Messages'

此时,会出现很多很多列。但我们感兴趣的是名为Z_DKINTENTMETADATAKEY__SERIALIZEDINTERACTION的字段。

这个字段是一个blob;在这里是一个包含意图数据的二进制plist。其中包括时间戳、发送者、接收者和消息正文信息,你只需要弄清楚哪一部分对应什么。

更令人兴奋的是,这种消息意图数据不仅限于原生短信/iMessage。它还可以用来恢复WhatsApp数据以及一些有限的Snapchat或Signal数据。可能不是所有应用程序都有所有消息数据,但有些确实有,这正是事情变得有趣的地方。

但是…什么?

你看,虽然我在测试设备上使用个人账户,但我只安装了几个应用程序。我只是在查看原生工件。

我肯定没有安装WhatsApp,更不用说登录了。这就是为什么在我的knowledgec数据库中发现超过3300条WhatsApp消息让我感到意外;包括时间、对方和消息正文数据。

需要承认的是,有些消息是空白的;但这些是 outgoing消息或附件。但这仍然是重要信息。

奇怪的是,我的设备上有这些消息,尽管该设备从未被用来查看它们。

从证据的角度来看,我认为这对我们检测人员可能有利也可能不利。

很棒的是,你有可能从一个从未在设备上安装过的应用程序中恢复数据!

但同样可怕的是,我们如此珍视的knowledgeC数据库可能被外部数据污染。

对等设备

我做了更多挖掘,发现部分答案与ZOBJECT表的ZSOURCE列有关。

假设我对这个特定记录感兴趣。

我需要查找ZSOURCE值,在那里我找到了值3174。

然后我需要转到ZSOURCE表并找到记录3174。

在这里我们看到BundleID是WhatsApp,并且ZDEVICEID字段中有一个值。

我取该值并转到ZSYNCPEER表,在那里我按ZDEVICEID搜索。

这里的ZMODEL显示为iPhone15,2,这不是我正在测试的设备,而是我安装有WhatsApp的个人手机。

注意那里还有一个RapportID。Rapport在iOS的其他地方也有引用,我决定看看这是否有助于查找有关设备的更多信息,幸运的是,这没花太长时间。

只需在设备提取中搜索,就在\private\var\mobile\Library\com.apple.bluetoothuser\Production*GUID*\CloudPairedDeviceRecords找到了一个与ZRAPPORTID值同名的文件。

这个文件是一个BPList,包含关于同步设备的一堆数据,包括设备名称和最后同步时间。

所以现在我可以看到消息数据、同步设备型号、名称和ID。很好。

那么,其他哪些应用程序可能从关联设备收集数据?

我对ZSOURCE表进行了快速检查:

1
SELECT DISTINCT ZBUNDLEID FROM ZSOURCE WHERE ZDEVICEID NOT LIKE ''
  • com.apple.InCallService
  • com.apple.Maps
  • com.apple.MobileSMS
  • com.apple.Music
  • com.apple.TVRemoteUIService
  • com.apple.facetimemessagestored
  • com.apple.mobiletimer
  • com.apple.weather
  • com.cpc.iphone
  • com.hammerandchisel.discord
  • com.linkedin.LinkedIn
  • com.microsoft.msedge
  • com.tinyspeck.chatlyio
  • net.whatsapp.WhatsApp
  • org.whispersystems.signal
  • us.zoom.videomeetings

并非所有这些Bundle都提供了有意义的内容。事实上,尽管我期望很高,但许多根本没有有趣的东西。

进一步深入研究,我运行了以下SQL:

1
2
3
4
5
6
7
SELECT ZOBJECT.Z_PK, ZSTREAMNAME, Z_DKINTENTMETADATAKEY__INTENTCLASS, Z_DKINTENTMETADATAKEY__SERIALIZEDINTERACTION 
FROM ZOBJECT
JOIN ZSTRUCTUREDMETADATA 
ON ZOBJECT.ZSTRUCTUREDMETADATA = ZSTRUCTUREDMETADATA.Z_PK 
JOIN ZSOURCE 
ON ZOBJECT.ZSOURCE = ZSOURCE.Z_PK 
WHERE ZDEVICEID NOT LIKE ''

我发现的一些项目包括:

  • 我的个人设备与另一台设备之间的通话记录
  • 我的个人设备与其他设备(包括我的汽车和AirPods)之间的蓝牙连接
  • 从我的个人设备或与我账户关联的其他设备进行的Apple Music搜索和选择
  • 来自我的个人设备的闹钟信息
  • 来自我的个人设备的苹果地图位置

总结

我确信这里列出的应用程序和数据类型远不止这些,知道这是一个潜在的证据来源很好,但同样重要的是要明白,如果你在knowledgeC中看到某些内容,可能需要验证源设备。

你认为在这个设备上作为证据的数据,可能实际上完全发生在不同的设备上。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计