一个实用的工具,用于测试 Google Fast Pair 设备是否容易受到配对、账户绑定和协议级攻击。
本仓库提供 WhisperPair 测试框架,这是一款用于评估 Google Fast Pair 设备安全性的工具。它面向研究人员和从业人员,既可用于复现我们的研究结果,也可用于测试他们自己的设备。
有关项目概述、受影响设备及更多背景信息,请访问我们的网站。
本仓库还包含论文 One Tap to Hijack Them All: A Security Analysis of the Google Fast Pair Protocol(发表于 IEEE S&P 2026)的配套材料。
论文完整版可在此处获取。如果您觉得这项工作有用,请考虑引用该论文:
@inproceedings{whisperpair2026,
title = {One Tap to Hijack Them All: A Security Analysis of the Google Fast Pair Protocol},
author = {Duttagupta, Sayon and Wyns, Seppe and Antonijević, Nikola and Singelée, Dave and Preneel, Bart},
booktitle = {2026 IEEE Symposium on Security and Privacy (S\&P)},
year = {2026},
}
提供这些材料是为了使我们评估结果可复现,并帮助研究人员进行防御性测试。请仅在已获授权的安全研究和防御性验证中使用这些材料,并且仅限用于您拥有或已获得明确测试许可的设备。由于本仓库中的代码展示了消费类配件中的漏洞,请勿在未获得明确书面许可的情况下将其用于攻击第三方设备。作者仅在项目团队自有设备或经知情同意捐赠的设备上进行了所有实验。运行这些工具即表示您同意仅将其用于防御性研究、复现我们的结果或设备自测。
[!NOTE] 摘要: 请确保您有一台带有蓝牙适配器的 Linux 机器,并且已安装 Node.js(LTS)和 pnpm。
您可以通过运行bash build.sh,然后运行bash start.sh,在同一台机器上同时运行 UI 和服务器。
本仓库包含一个测试框架,用于评估目标设备是否正确实现了 Google Fast Pair 的某些安全要求。 该框架可以测试配对状态谓词是否正确实现、是否拒绝重用 nonce 的消息,以及设备是否容易受到无效曲线攻击。 该框架由一个后端服务器和一个前端 Web UI 组成。
[!NOTE] 如果您在寻找攻击的具体实现:
./toolkit-server/src/fast-pair-service.ts和./toolkit-server/src/protocol.ts包含了攻击实现和 Fast Pair 协议。
该工具集由两个组件组成:server 和 UI。
服务器需要在 Linux 系统上运行,并且已在 Raspberry Pi 4 上完成测试。
UI 是一个 Next.js 前端,用于控制服务器,可以在任何支持 Node.js 的环境下运行。
UI 必须能够通过网络连接到服务器。
我们使用 Raspberry Pi OS Lite (64-bit) (6.12.47+rpt-rpi-v8) 和 BlueZ 5.82 版本对测试框架进行了测试。
一台安装了 BlueZ、Node.js 和 pnpm 的 Linux 机器。
我们强烈建议使用当前长期支持(LTS)版本的 Node.js (v24.14.0)。
我们已确保该工具集在该版本下正常工作。
较旧的版本最高可能支持到 v18,但更旧的版本很可能会崩溃或产生意外结果。
nvm.sh如果您使用 nvm 管理已安装的 Node.js 版本,则必须确保 root 用户也可以访问由 nvm 管理的 Node.js 版本。
正如这篇 StackOverflow 帖子所解释的,您可能需要创建一个新的符号链接。
# Source - https://stackoverflow.com/a/40078875
# Posted by SimpleJ, modified by community. See post 'Timeline' for change history
# Retrieved 2026-03-30, License - CC BY-SA 4.0
sudo ln -s "$NVM_DIR/versions/node/$(nvm version)/bin/node" "/usr/local/bin/node"
sudo ln -s "$NVM_DIR/versions/node/$(nvm version)/bin/npm" "/usr/local/bin/npm"
sudo ln -s "$NVM_DIR/versions/node/$(nvm version)/bin/npx" "/usr/local/bin/npx"
[!NOTE] 要运行服务器,您只需链接
node。
如果 Node.js 同时通过外部包管理器安装,sudo 可用的版本可能与 nvm 使用的版本不同。
您可以通过比较 node -v 和 sudo node -v 的输出来检查。
虽然我们推荐 Node.js LTS v24,但服务器在 v18 之前应该都能正常运行。
pnpm如果已安装 Node.js v24 LTS,您应该可以使用以下命令启用 pnpm:
corepack enable
该测试框架还需要 hcitool 和 l2ping。
根据您的 Linux 发行版,hcitool 可能不可用。您可能需要安装 bluez-deprecated-tools。
在撰写本文时(2025 年 10 月 1 日),最新的 Raspberry Pi OS Lite 版本仍预装了该工具。
如果蓝牙适配器未通电,服务器将尝试使用 rfkill 将其打开。
测试 Audio Switch 扩展需要 rfcomm。
[!NOTE] 服务器会在启动时检查这些工具的可用性。 有关可能不可用的功能的更多信息,将显示在控制台中。
复现结果需要对易受攻击的设备进行物理访问。
请注意,大多数供应商已针对 WhisperPair 发布了软件更新,因此您可能需要固件版本过时的设备。
有关我们在评估中使用的设备的更多信息,请参阅选择设备。
如果您想在同一台(Linux)机器上运行 UI 和服务器,可以使用 build.sh 和 start.sh 脚本。
首先,使用以下命令安装所需依赖并构建组件:
bash build.sh
确保蓝牙已启用:
sudo rfkill unblock bluetooth
然后,使用以下命令运行 UI 和服务器:
bash start.sh
现在,UI 应可通过 http://localhost:3000 访问。
您可以在不同主机上运行 UI 和服务器。
这样,您可以在 Linux 机器上运行服务器,同时在本地运行 UI。
虽然不建议这样做,但您可以按以下步骤操作:
toolkit-server 目录bash build.sh 构建 toolkit-servertoolkit-ui 目录中的 .env 文件,将 SERVER_URL 变量设置为服务器 URL。
您可以运行 bash update_server_url.sh <YOUR_URL> 来自动更新 .env 文件。bash build.sh 构建 toolkit-uibash start.sh 启动 toolkit-serverbash start.sh 启动 toolkit-ui现在,UI 应可通过 http://localhost:3000 访问。
除了使用 build.sh 和 start.sh 脚本之外,您也可以手动构建和启动服务器。
有关这些步骤的详细说明,请参阅 toolkit-server README
除了使用 build.sh 和 start.sh 脚本之外,您也可以手动构建和启动 UI。
有关这些步骤的详细说明,请参阅 toolkit-ui README
您需要有一个支持 Fast Pair 的配件才能执行攻击和使用该工具集。
我们评估了来自 16 家供应商的 25 款设备,如下表所示。
如果您拥有其中一款设备,并且其固件自 2025 年 9 月以来未更新,那么您可以复现我们的结果。
您也可以使用该工具集评估我们未测试过的设备。
但是,根据目标设备蓝牙芯片组的可靠性,您可能会遇到一些意外错误。
在执行攻击时,请确保您知道目标设备是否处于配对模式。
某些攻击要求设备_不_处于配对模式,否则可能会产生误报。
其他攻击要求设备处于配对模式,否则可能无法生效。
如果您在寻找支持 Fast Pair 的设备,可以使用 Model IDs 列表 查看所有已通过 Fast Pair 认证的设备。
设备不在测试集中 警告消息如果您选择的设备不在我们的测试集中,UI 将显示警告消息。
该消息基于 Model ID 显示,而同一设备的 Model ID 可能因颜色和地区而异。
例如,蓝色的 Sony WH-1000XM6 耳机与黑色的 Sony WH-1000XM6 耳机使用的 Model ID 不同。
由于这些设备很可能具有相同的固件(即使 Model ID 不同),您可以放心地忽略此警告消息。
未找到 Model ID 为 <number> 的设备 错误消息由于 Fast Pair gRPC API 实施了更严格的速率限制,某些模型数据请求可能返回成功的响应,但主体为空。
这会导致 UI 显示 未找到 Model ID 为 <number> 的设备。
如果您确定输入的 Model ID 存在,请等待几分钟后重试。
[!NOTE] 我们测试集中设备的模型数据已包含在本仓库中,并将从缓存中读取。 评估这些设备不需要向 gRPC 服务发起 API 调用。 请注意,同一系列中的设备可能具有不同的 Model ID。有关更多信息,请参阅设备不在测试集中警告消息。

UI 将在启动时尝试连接到服务器。
连接成功后,屏幕右下角将显示“Connected to the server”消息。
评估设备是否易受攻击需要三个步骤:发现设备、设置其 Model ID,以及运行攻击。
该测试框架会持续扫描蓝牙低功耗(BLE)设备,并显示在屏幕左侧。 广播 Fast Pair 数据的设备显示在顶部。 在设备上点击“Select”后,设备详细信息将显示在屏幕右侧。
运行论文中描述的测试需要为设备设置 Model ID。 如果设备公开了 Fast Pair GATT 特性,则在设备详细信息中会显示“Read Model ID”按钮。 点击此按钮将尝试读取 Model ID。
请注意,许多设备并未正确实现该特性,会返回无效的 Model ID。 或者,您也可以按“Set Model ID”按钮并手动输入值来手动设置设备的 Model ID。 可以选择我们测试期间评估过的设备,也可以输入自定义值。 本仓库根目录中包含一份完整的 Fast Pair 兼容设备列表。
一旦设置了 Model ID,设备详细信息将显示有关该设备的元数据。
要运行攻击,请点击设备详细信息窗格中的“Attack”按钮。 共实现了三种攻击:配对状态谓词执行、nonce 重用和无效曲线攻击。 如果您已经连接到设备,选中“Reconnect”复选框将在执行攻击前断开并重新连接到设备。
配对状态谓词执行检查提供了一些额外的配置选项:
攻击进行时,日志将实时显示在 UI 中。 攻击完成后,将显示其持续时间。
有时,攻击或配对可能比预期耗时更长。
您可以通过点击相应对话框中的“Cancel”按钮来取消攻击或配对。
如果在攻击或配对期间重新加载了 UI,则可以使用任务管理器来取消。
在屏幕右上角,从右数第二个按钮将显示任务状态。 如果没有活动任务,它将显示“No active tasks”。 否则,它将显示“Task in progress”。 要取消任务,请点击“Task in progress”按钮,然后按“Cancel”按钮。
如果服务器因无法取消的挂起任务而挂起,请尝试重置蓝牙适配器。
[!NOTE] 任务可能需要最多 20 秒才能取消。
在某些情况下,蓝牙适配器可能会“卡在”“异常状态”。 解决此问题的最简单方法是重置蓝牙适配器。 要执行重置,请按屏幕右上角的扳手图标打开故障排除菜单。 然后,选择“Reset BLE adapter”,并在对话框中点击“Reset”确认重置。
如果发生致命错误且服务器必须关闭,start.sh 脚本将自动重启服务器。
在附近 BLE 设备较多的情况下,服务器可能因 D-Bus 错误而意外关闭。
这种情况非常罕见,如果发生,./start.sh 脚本应会自动重启服务器。
如果您在寻找支持 Fast Pair 的设备,可以使用 Model IDs 列表 查看所有已通过 Fast Pair 认证的设备。
这项工作得到了佛兰德政府通过网络安全研究计划的支持,资助编号为 VOEWICS02。
| 制造商 | 设备名称 | Model ID | 可被劫持 | 劫持耗时(秒) | 易受 nonce 重用攻击 | 易受无效曲线攻击 |
|---|
| Apple | Beats Solo Buds | 6980580 | 否 | 是 | 否 | |
| Pixel Buds Pro 2 | 12934265 | 是 | 6.89 | 否 | 否 | |
| Jabra | Elite 8 Active | 3778746 | 是 | 32.01 | 否 | 否 |
| JBL | Tune Beam | 3293323 | 是 | 6.91 | 仅在同一会话中 | 否 |
| Marshall | MOTIF II A.N.C. | 15473012 | 是 | 9.49 | 是 | 否 |
| Nothing | Ear (a) | 8625818 | 是 | 38.80 | 仅在同一会话中 | 否 |
| OnePlus | Nord Buds Pro 3 | 13394952 | 是 | 10.19 | 仅在同一会话中 | 否 |
| HP | Poly VFree 60 | 15984097 | 否 | 否 | 否 | |
| Redmi | Buds 5 Pro | 11155060 | 是 | 8.32 | 仅在同一会话中 | 否 |
| Soundcore | Liberty 4 NC | 5409858 | 是 | 15.27 | 是 | 否 |
| Sony | WF-1000XM5 | 12499626 | 是 | 9.43 | 是 | 否 |
| Audio-Technica | ATH-M20xBT | 13285048 | 否 | 仅在同一会话中 | 否 | |
| Bose | QuietComfort Ultra | 5723549 | 否 | 否 | 否 | |
| JBL | Live 775 NC | 14502233 | 是 | 7.62 | 仅在同一会话中 | 否 |
| Marshall | Major V | 12915160 | 是 | 11.70 | 仅在同一会话中 | 否 |
| Sonos | Ace V | 7340495 | 否 | 否 | 否 | |
| Sony | WH-1000XM4 | 13386638 | 是 | 9.69 | 是 | 否 |
| Sony | WH-1000XM5 | 13911719 | 是 | 12.38 | 是 | 否 |
| Sony | WH-1000XM6 | 6360443 | 是 | 12.94 | 仅在同一会话中 | 否 |
| Sony | WH-CH720N | 16003068 | 是 | 7.46 | 是 | 否 |
| Bang & Olufsen | Beosound A1 | 2431472 | 否 | 否 | 否 | |
| Jabra | Speak2 55 UC | 9888885 | 否 | 否 | 否 | |
| JBL | Clip 5 | 1917389 | 是 | 36.19 | 是 | 否 |
| JBL | Flip 6 | 7278954 | 否 | 否 | 否 | |
| Logitech | Wonderboom 4 | 11575855 | 是 | 11.96 | 仅在同一会话中 | 否 |