野生标签与其他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标签。
具体解密步骤:
- 从Keychain中获取searchpartyd进程的BeaconStore服务密钥(32字节AES-256密钥)
- 使用该密钥、plist中的16字节nonce值和16字节GCM标签
- 解密后得到包含位置数据的明文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)和水平精度
重要说明
- 如果被检查设备运行的是iOS 17.5之前的版本,解密密钥不同,存储在BeaconStore的GenericAttribute中
- 不需要追踪器的
.record文件至少可追溯到iOS 15.3.1 - 其他Apple设备(如AirPod)也可能被识别为不需要的追踪器并触发通知
- 此数据无需AirTag开发者配置文件即可获取
位置数据注意事项
- 每个信标可能有多个位置记录文件,但并非信标的完整历史记录
- 位置记录有保存期限,但观察到保留时间不一致
- 即使没有主动检查信标,也可能发现位置数据,表明存在后台刷新机制
- 位置数据中的"type"键可能表示信标的检测方式(所有者设备检测、众包位置等)
- 找到的位置不一定意味着被检查设备曾到过该位置,可能是所有者的其他设备或共享信标在该位置
FindMy自2021年以来已发展很多,取证方法也相应变化。从业者现在有了关于AirTag和连接到FindMy的其他Apple设备的新信息源,这些新源似乎比之前可用的信息提供得更多。