iOS取证分析:解密AirTag与追踪器的位置数据

本文详细介绍了如何从iOS设备中提取和解密AirTag及其他蓝牙追踪器的位置数据,包括文件路径、解密方法和关键数据结构,为数字取证调查提供实用技术指导。

野生标签与其他AirTag故事

作为数字取证从业者,我通常在本博客中讨论Android相关内容,但偶尔也会涉足iOS/iPadOS领域。最近我在准备关于不需要的Google Find My Device(FMD)追踪器的演示时,在iOS统一日志中发现了一些有趣的内容:关于不需要的追踪器的信息被写入磁盘。

野生标签

这批研究始于iOS统一日志。当我收到不需要的Pebblebee追踪器警报后,检查统一日志时发现,关于不需要的追踪器的信息被写入到/private/var/mobile/Library/com.apple.icloud.searchpartyd/WildModeAssociationRecord/目录。

该目录中的.record文件实际上是二进制plist文件。通过分析发现,这些文件包含加密的位置数据。解密过程需要使用Keychain中的密钥、plist中的nonce(IV)和GCM标签。

具体解密步骤:

  1. 从Keychain中获取searchpartyd进程的BeaconStore服务密钥(32字节AES-256密钥)
  2. 使用该密钥、plist中的16字节nonce值和16字节GCM标签
  3. 解密后得到包含位置数据的明文bplist

解密后的bplist包含:

  • 追踪器的随机化蓝牙MAC地址
  • 用户通知的触发日期/时间
  • 所有检测到不需要追踪器的位置(纬度、经度、水平精度和相关时间戳)

其他故事

这种解密方法同样适用于/com.apple.icloud.searchpartyd/目录中的其他.record文件:

BeaconNamingRecord

包含设备所有者拥有的信标名称记录:

  • 分配给信标的名称(键"name")
  • 信标的表情符号(键"emoji")
  • associatedBeacon UUID值

OwnedBeacons

此文件夹中的.record文件名对应BeaconNamingRecord中的associatedBeacon UUID值,包含:

  • pairingTime:AirTag与手机配对的时间(UTC)
  • stableIdentifier:包含AirTag序列号
  • identifier UUID:链接回BeaconNamingRecord

SharedBeacons

包含与其他用户共享的AirTag信息:

  • destination:共享AirTag的人(电子邮件地址或电话号码)
  • identifier:在被检查手机上分配给AirTag的UUID
  • shareDate:共享时间的时间戳(UTC)

SafeLocations

包含iPhone自动识别或用户手动标识的安全位置,在这些位置iPhone不会通知用户遗忘了物品。

BeaconEstimatedLocation

包含信标的位置信息:

  • 每个UUID文件夹对应一个信标(拥有或共享的)
  • 每个.record文件代表该信标的单个位置数据
  • 包含纬度、经度、时间戳(UTC)和水平精度

重要说明

  1. 如果被检查设备运行的是iOS 17.5之前的版本,解密密钥不同,存储在BeaconStore的GenericAttribute中
  2. 不需要追踪器的.record文件至少可追溯到iOS 15.3.1
  3. 其他Apple设备(如AirPod)也可能被识别为不需要的追踪器并触发通知
  4. 此数据无需AirTag开发者配置文件即可获取

位置数据注意事项

  • 每个信标可能有多个位置记录文件,但并非信标的完整历史记录
  • 位置记录有保存期限,但观察到保留时间不一致
  • 即使没有主动检查信标,也可能发现位置数据,表明存在后台刷新机制
  • 位置数据中的"type"键可能表示信标的检测方式(所有者设备检测、众包位置等)
  • 找到的位置不一定意味着被检查设备曾到过该位置,可能是所有者的其他设备或共享信标在该位置

FindMy自2021年以来已发展很多,取证方法也相应变化。从业者现在有了关于AirTag和连接到FindMy的其他Apple设备的新信息源,这些新源似乎比之前可用的信息提供得更多。

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