-
-
[原创]Apple Find My 网络原理浅析
-
发表于: 20小时前 383
-
参考资料
相关 GitHub 仓库
seemoo-lab/openhaystack:构建自己的 AirTag
一个通过 Apple「查找」网络追踪个人蓝牙设备的开源框架。
相关 PyPI 库
工作原理
下面以 MatthewKuKanich/FindMyFlipper 项目为例,说明设备如何接入 Apple Find My 网络。
1. 生成 Tag 身份标识
使用 ECC 算法中的 SECP224R1 椭圆曲线参数生成公私钥。
- 公钥称为
Advertisement Key,用于构造 BLE 广播。 - 私钥由 Tag 所有者保存,用于后续解密位置报告。
2. 使用公钥构造 BLE 广播包
广播包中传输的核心内容是公钥,但并不是直接将完整公钥放入广播数据,而是将公钥拆分到以下两个位置:
- BLE MAC 地址
- BLE 广播 Payload
2.1 将公钥前 6 字节写入 BLE MAC 地址
首先取公钥的前 6 字节作为地址:
addr = bytearray(key[:6])
addr[0] |= 0b11000000
BLE 随机静态地址要求地址最高两位必须为 11,因此需要执行按位或操作。
这样会覆盖公钥第一个字节原本的最高两位,所以需要在后续广播报文中单独保存这两个比特。
2.2 构建 BLE 广播报文
项目中使用的广播报文模板如下:
1e ff 4c 00 12 19 00 [22 bytes key data] [2 bits hint] 00
这是一条 GAP(Generic Access Profile,通用访问配置协议)广播数据,其中 AD Type 为 Manufacturer Specific Data,即厂商自定义数据。
各字段含义如下:
| 索引 | 数据 | 含义 |
|---|---|---|
0 |
1e |
长度字段,表示其后还有 30 字节 |
1 |
ff |
BLE AD Type:Manufacturer Specific Data |
2-3 |
4c 00 |
Apple Company ID:0x004C,以小端序表示 |
4 |
12 |
Find My / Offline Finding 类型 |
5 |
19 |
长度字段,表示其后还有 25 字节 |
6 |
00 |
state 字段;项目中用于更新电量状态,但 Apple 私有协议未公开该字节的完整定义 |
7-28 |
key[6:28] |
公钥剩余的 22 字节 |
29 |
key[0] 的最高 2 位 |
保存构造随机静态地址时被覆盖的两个比特 |
30 |
00 |
hint 字段 |
3. 广播设备本身不需要获取 GPS 位置
这里容易产生一个误区:
Tag 设备不会直接获取自己的 GPS 位置。
Tag 只负责周期性发送 BLE 广播。附近接收到广播的 Apple 设备会使用自身的定位能力获取位置,并代替 Tag 上传位置报告。
因此,最终查询到的位置,本质上是上传报告的 Apple 设备在扫描到 Tag 时所在的位置。
4. 发送 BLE 广播
设备需要构造一个 GAP 不可连接广播,并持续发送 Find My 格式的 Manufacturer Specific Data。
如果使用 nRF Connect 扫描广播,需要注意:
- nRF Connect 可能默认过滤 Apple 等常见设备的 BLE 广播。
- 扫描时应在筛选设置中关闭 Apple 设备过滤,否则可能无法看到该广播。
5. 附近 Apple 设备代为上传位置
附近的 iPhone、iPad 或 Mac 扫描到广播后,会执行以下操作:
- 使用自身定位能力获取当前位置。
- 构造位置报告。
- 对位置报告进行加密。
- 将加密报告上传到 Apple 服务。
位置报告会与 Advertisement Key,也就是广播公钥的哈希值相关联。
6. 从 Apple 服务拉取位置报告
相关项目会向以下接口发起请求:
5dcK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4j5i4c8W2N6$3q4&6i4K6u0W2K9h3y4D9L8%4g2V1i4K6u0W2j5$3!0E0i4K6u0r3j5h3y4K6L8Y4y4W2M7Y4k6A6j5$3g2Q4x3V1k6X3k6i4c8U0K9l9`.`.
请求时需要携带对应的认证信息和查询参数,具体实现可以参考相关项目。
需要注意:
- 除上述接口外,Apple 还可能存在其他较新的接口。
- 可以参考或直接使用 FindMy · PyPI。
- Apple 返回的是加密后的 Payload,而不是明文经纬度。
6.1 Apple 认证限制
Apple 只允许通过认证的 Apple 用户请求相关接口,并且正常使用 Find My 网络通常需要 Apple 设备环境。
部分第三方实现可能依赖 Apple 设备生成的 Anisette Data 或兼容环境。
此外,用于认证的 Apple ID 通常需要曾经在真实 Apple 设备上完成过登录和验证。仅模拟 Anisette Data,不一定能够正常通过所有认证流程。
使用第三方或共享 Apple ID 存在账号安全、隐私泄露和封禁风险,不建议用于正式环境。
7. 解密位置报告
Apple 返回的位置报告经过加密,需要使用生成 Tag 身份时保存的私钥进行解密。
解密后可以得到位置数据,例如:
- 经度
- 纬度
- 时间戳
- 其他状态信息
处理经纬度时还需要注意地图坐标系差异。
不同地图服务可能使用不同坐标系,例如:
- WGS-84
- GCJ-02
- BD-09
如果直接将坐标绘制到坐标系不匹配的地图上,位置可能出现明显偏移。
整体数据流
生成 SECP224R1 公私钥
↓
公钥作为 Advertisement Key
↓
将公钥拆分到 BLE MAC 地址和广播 Payload
↓
Tag 持续发送不可连接 BLE 广播
↓
附近 Apple 设备扫描到广播
↓
Apple 设备获取自身位置
↓
位置报告加密后上传至 Apple
↓
所有者从 Apple 服务拉取加密报告
↓
使用 Tag 私钥解密
↓
获得经纬度等位置信息
防追踪与反滥用机制
为了降低 AirTag 被用于未经授权追踪的风险,Apple 提供了多种反追踪机制。
以下触发条件和时间可能随系统版本变化,部分细节需要进一步验证。
1. AirTag 离开所有者后自动发声
当 AirTag 与所有者设备分离一段时间后,AirTag 可能会自动发出提示音,以提醒附近人员存在未知追踪设备。
具体触发时间暂不明确,并可能随固件或系统策略变化。
2. 陌生 Tag 持续跟随提醒
为了防止 AirTag 被用于追踪, AirTag 采取了如下机制(来源于网络, 待验证)
- 离开主人一段时间(暂时未知)自动发声提醒
- 当 AirTag 与主人手机断开连接一段时间后, 会自动发声提醒周围的人
- 陌生Tag一直跟随(似乎触发时间挺长的), iPhone 会弹窗提醒
[内核课程]《Windows内核攻防实战》!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。