OpenHaystack 是一个通过 Apple 庞大的“查找”网络追踪个人蓝牙设备的框架。你可以用它创建自己的追踪 标签,将其附加到实体物品上(钥匙扣、背包……),或将其集成到其他支持蓝牙的设备(如笔记本电脑)中。
OpenHaystack 是一个应用程序,允许你创建由 Apple “查找”网络追踪的自定义配件。你只需要一台 Mac 和一个 BBC micro:bit 或任何其他支持蓝牙的设备。 通过使用该应用,你可以在全球任何地方追踪你的配件,即使没有蜂窝网络覆盖。附近的 iPhone 会发现你的配件,并在有网络连接时将其位置上传到 Apple 的服务器。
OpenHaystack 是对 Apple “查找”网络(或称 离线查找)进行逆向工程和安全分析工作的成果。我们达姆施塔特工业大学安全移动网络实验室在 2019 年 6 月离线查找功能首次发布后便开始对其进行分析。通过这项工作,我们弄清了 Apple 设备如何被 iPhone 设备发现,即使它们处于离线状态。整个系统巧妙地结合了蓝牙广播、公钥密码学和加密位置报告的中央数据库。我们公开了离线查找中闭源部分的规范,并进行了全面的安全与隐私分析。 我们发现了两个不同的漏洞。其中最严重的一个允许恶意应用程序访问位置数据,目前已被 Apple 修复(CVE-2020-9986)。 有关安全分析的更多信息,请阅读我们的论文。 自发布以来,我们获得了相当多的媒体报道和新闻关注。
OpenHaystack 是实验性软件。代码未经测试且不完整。例如,使用我们固件的 OpenHaystack 配件会广播固定的公钥,因此可被附近的其他设备追踪(这在未来版本中可能会改变)。OpenHaystack 与 Apple Inc. 无关联,也未获得其认可。
OpenHaystack 由两个组件组成。首先,我们提供了一个 macOS 应用程序,可以显示你个人蓝牙设备最后报告的位置。其次,固件镜像使蓝牙设备能够广播信标,从而被 iPhone 发现。
OpenHaystack 需要 macOS 11(Big Sur)。
OpenHaystack 应用程序需要为 Apple Mail 安装一个自定义插件。它用于通过私有 API 从 Apple 的服务器下载位置报告(技术说明:该插件继承了使用此 API 所需的 Apple Mail 权限)。 因此,安装过程略有不同,需要你临时禁用 Gatekeeper。 我们的插件不会访问任何其他私有数据(例如电子邮件)(参见源代码)。
~/Library/Mail/Bundle。sudo spctl --master-disable,这将禁用 Gatekeeper 并允许我们的 Apple Mail 插件运行。sudo defaults write "/Library/Preferences/com.apple.mail" EnableBundles 1sudo spctl --master-enable,这将重新启用 Gatekeeper。添加新配件。 要创建新配件,你只需为其输入一个名称,并可选地选择合适的图标和颜色。然后,应用程序会生成一个新的密钥对,用于加密和解密位置报告。私钥存储在你 Mac 的钥匙串中。
部署到设备。 通过 USB 将受支持的设备连接到你的 Mac,点击配件名称旁边的 部署 按钮并选择相应的设备。 除了使用 OpenHaystack 的集成部署功能外,你也可以复制用于广播的公钥(右键点击配件)并手动部署。
显示设备的位置。 可能需要长达 30 分钟,你才能在右侧的地图上看到第一条位置报告。地图将始终显示你所有物品的最新位置。你可以点击每个物品来查看最后一次更新是何时收到的。 点击重新加载按钮,你可以更新位置报告。
我们简要说明 Apple 的离线查找系统(又称 查找我的网络)。更多细节请参阅我们的 PETS 论文和 Apple 的配件规范。我们在下面提供了示意图概览(来自我们的论文),并说明我们如何在 OpenHaystack 中整合各个步骤。

要使用 Apple 的查找我的网络,我们在椭圆曲线(P-224)上生成一个公私钥对。私钥保留在 Mac 上,安全地存储在钥匙串中,公钥则部署在配件上,例如连接的 micro:bit。
简而言之,配件将公钥作为蓝牙低功耗(BLE)广播发送(参见固件)。 附近的 iPhone 将无法将我们的配件与真正的 Apple 设备或认证配件区分开来。
当附近的 iPhone 收到 BLE 广播时,iPhone 会通过 GPS 获取其当前位置,使用广播中的公钥对其进行加密,并将加密的报告上传到 Apple 的服务器。 iOS 13 或更高版本的所有 iPhone 默认都会这样做。OpenHaystack 不参与此步骤。
Apple 不知道哪些加密位置属于哪个 Apple 账户或设备。因此,只要知道相应的公钥,每个 Apple 用户都可以下载任意位置报告。这不是安全问题:所有报告都经过端到端加密,除非知道相应的私钥(存储在钥匙串中),否则无法解密。我们利用这一特性,从 Apple 下载为我们的 OpenHaystack 配件创建的报告。我们使用私钥解密位置报告,并在地图上显示最新的一份。
Apple 要求经过身份验证的 Apple 用户才能下载位置报告,以此保护其数据库免受任意访问。 我们使用以提升权限运行的 Apple Mail 插件来获取所需的身份验证信息。OpenHaystack 应用在下载报告时与该插件通信。这就是使用 OpenHaystack 时需要保持 Mail 打开的原因。
原则上,任何蓝牙设备都可以变成可通过 Apple 的 Find My 网络追踪的 OpenHaystack 配件。 目前,我们为少量嵌入式设备(见下表)提供了便捷的 OpenHaystack 固件部署方法。我们还通过通用 HCI 脚本支持 Linux 设备。 欢迎基于我们固件的源代码和我们论文中的规范,将 OpenHaystack 移植到其他支持低功耗蓝牙的设备上。请与我们分享你的成果!
| 平台 | 测试于 | 通过应用部署 | 备注 |
|---|---|---|---|
| Nordic nRF51 | BBC micro:bit v1 | ✓ | 目前仅支持 nRF51822(见 issue #6)。 |
| Espressif ESP32 | SP32-WROOM, ESP32-WROVER | ✓ | 部署最多可能需要 3 分钟。需要 Python 3。感谢 @fhessel。 |
| Linux HCI | Raspberry Pi 4 w/ Raspbian | 应支持任何 Linux 机器。 |

OpenHaystack Mobile 是 OpenHaystack macOS 应用程序面向智能手机的完整重新实现。该应用提供相同的创建和追踪配件功能,旨在提高易用性,尤其是对新用户而言。与 macOS 应用程序不同,位置报告无法直接在智能手机上获取,因此该应用需要一台托管在 Mac 硬件上的代理服务器来访问 Find My 网络。多个用户可以同时通过网络访问该代理服务器。
要连接到你的代理服务器,请在以下位置设置正确的 URL:openhaystack-mobile/lib/findMy/reports_fetcher.dart

OpenHaystack Mobile 使用跨平台的 Flutter 框架构建,目前可在 Android 和 iOS 上运行。有关该应用及使用说明的更多信息,请参见本仓库的 openhaystack-mobile 文件夹。
OpenHaystack 依据 GNU Affero 通用公共许可证 v3.0 授权。