
Официальная эталонная реализация и проверка уязвимости нашей атаки WhisperPair (CVE-2025-36911), которая затрагивает протокол Google Fast Pair.
Практический инструмент для проверки того, уязвимы ли устройства 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 и Bluetooth-адаптером, а также установлены Node.js (LTS) и pnpm.
Вы можете запустить и интерфейс, и сервер на одной машине, выполнивbash build.sh, а затемbash start.sh.
Этот репозиторий содержит испытательный стенд для оценки того, корректно ли целевое устройство реализует определённые требования безопасности Google Fast Pair. Стенд позволяет проверить, корректно ли реализован предикат состояния сопряжения, отклоняются ли сообщения с повторно используемыми nonce, а также уязвимо ли устройство к атаке на недопустимую кривую. Стенд состоит из серверной части и веб-интерфейса.
[!NOTE] Если вас интересует именно реализация атак:
./toolkit-server/src/fast-pair-service.tsи./toolkit-server/src/protocol.tsсодержат реализацию атак и протокола Fast Pair.
Инструментарий состоит из двух компонентов: сервера и интерфейса.
Сервер необходимо запускать в системе Linux; он протестирован на Raspberry Pi 4.
Интерфейс — это фронтенд на Next.js, который используется для управления сервером; его можно запускать везде, где поддерживается Node.js.
Интерфейс должен иметь возможность подключаться к серверу по сети.
Мы тестировали стенд на Raspberry Pi OS Lite (64-bit) (6.12.47+rpt-rpi-v8) с BlueZ версии 5.82.
Машина с Linux, на которой установлены BlueZ, Node.js и pnpm.
Мы настоятельно рекомендуем использовать текущую версию Node.js с долгосрочной поддержкой (LTS) — v24.14.0.
Мы гарантировали, что инструментарий работает именно с этой версией.
Более старые версии могут работать вплоть до v18, но, скорее всего, будут аварийно завершаться или давать непредвиденные результаты.
nvm.shЕсли вы используете nvm для управления установленными версиями Node.js, убедитесь, что root также имеет доступ к версии Node.js, управляемой через nvm.
Как объясняется в этом ответе на 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.
На момент написания (1 октября 2025 г.) он остаётся предустановленным в последней версии Raspberry Pi OS Lite.
Если Bluetooth-адаптер не включён, сервер попытается включить его с помощью rfkill.
Для тестирования расширения Audio Switch требуется rfcomm.
[!NOTE] При запуске сервер проверит доступность этих инструментов. Дополнительная информация о функциях, которые могут быть недоступны, будет выведена в консоль.
Для воспроизведения результатов необходим физический доступ к уязвимому устройству.
Имейте в виду, что большинство производителей выпустили обновления программного обеспечения для WhisperPair, поэтому вам могут понадобиться устройства с устаревшей прошивкой.
См. Выбор устройства для получения дополнительной информации об устройствах, использованных в нашей оценке.
Если вы хотите запустить интерфейс и сервер на одной (Linux) машине, вы можете воспользоваться скриптами build.sh и start.sh.
Сначала установите необходимые зависимости и соберите компоненты с помощью:
bash build.sh
Убедитесь, что Bluetooth включён:
sudo rfkill unblock bluetooth
Затем запустите интерфейс и сервер с помощью:
bash start.sh
Теперь интерфейс должен быть доступен по адресу http://localhost:3000.
Вы можете запускать интерфейс и сервер на разных хостах.
Это позволяет запускать сервер на машине с Linux, а интерфейс — локально.
Хотя это не рекомендуется, сделать это можно следующим образом:
toolkit-server доступен на машине с Linuxtoolkit-server, выполнив bash build.sh.env в каталоге toolkit-ui, чтобы переменная SERVER_URL указывала на URL сервера.
Вы можете выполнить bash update_server_url.sh <YOUR_URL>, чтобы обновить файл .env автоматически.toolkit-ui, выполнив bash build.shtoolkit-server, выполнив bash start.shtoolkit-ui, выполнив bash start.shТеперь интерфейс должен быть доступен по адресу http://localhost:3000.
В качестве альтернативы использованию скриптов build.sh и start.sh вы можете также собрать и запустить сервер вручную.
Подробные инструкции по выполнению этих шагов приведены в toolkit-server README
В качестве альтернативы использованию скриптов build.sh и start.sh вы можете также собрать и запустить интерфейс вручную.
Подробные инструкции по выполнению этих шагов приведены в toolkit-ui README
Для выполнения атак и использования инструментария вам понадобится аксессуар, совместимый с Fast Pair.
Мы оценили 25 устройств от 16 производителей, перечисленных в таблице ниже.
Если у вас есть одно из этих устройств и его прошивка не обновлялась с сентября 2025 года, вы сможете воспроизвести наши результаты.
Вы также можете использовать инструментарий для оценки устройства, которое мы не тестировали.
Однако в зависимости от надёжности Bluetooth-чипсета целевого устройства вы можете столкнуться с некоторыми непредвиденными ошибками.
При выполнении атак убедитесь, что вы знаете, находится ли целевое устройство в режиме сопряжения.
Некоторые атаки требуют, чтобы устройство не находилось в режиме сопряжения, и в противном случае могут давать ложные срабатывания.
Другие атаки требуют, чтобы устройство находилось в режиме сопряжения, и в противном случае могут не сработать.
Если вы ищете устройства, совместимые с Fast Pair, вы можете воспользоваться списком Model ID, чтобы просмотреть все сертифицированные Fast Pair устройства.
Model not included in test setИнтерфейс отобразит предупреждение, если вы выбрали устройство, которое не входило в наш тестовый набор.
Это сообщение показывается на основе Model ID, который для одного и того же устройства может различаться в зависимости от цвета и региона.
Например, синие наушники Sony WH-1000XM6 используют другой Model ID, чем чёрные Sony WH-1000XM6.
Поскольку эти устройства, скорее всего, имеют одинаковую прошивку (даже несмотря на разные Model ID), это предупреждение можно безопасно игнорировать.
No device with Model ID <number> was foundИз-за более строгих ограничений частоты запросов, введённых Fast Pair gRPC API, некоторые запросы данных о модели могут возвращать успешные ответы с пустым телом.
В этом случае интерфейс отобразит No device with Model ID <number> was found.
Если вы уверены, что введённый вами Model ID существует, подождите несколько минут и повторите попытку.
[!NOTE] Данные о моделях устройств из нашего тестового набора включены в этот репозиторий и будут считываться из кэша. Для оценки этих устройств не требуется вызовов API к gRPC-сервису. Обратите внимание, что устройства одной серии могут иметь разные Model ID. См. предупреждение «Model not included in test set» для получения дополнительной информации.

При запуске интерфейс попытается подключиться к серверу.
При успешном подключении в правом нижнем углу экрана появится сообщение «Connected to the server».
Оценка уязвимости устройства требует трёх шагов: обнаружение устройства, установка его Model ID и запуск атаки.
Стенд непрерывно сканирует устройства Bluetooth Low Energy, которые отображаются в левой части экрана. Устройства, передающие данные Fast Pair, показываются вверху. Сведения об устройстве отображаются в правой части экрана после нажатия кнопки «Select» на устройстве.
Для запуска тестов, описанных в статье, необходимо установить Model ID для устройства. Если устройство предоставляет характеристику Fast Pair GATT, в сведениях об устройстве появится кнопка «Read Model ID». Нажатие этой кнопки попытается считать Model ID.
Обратите внимание, что многие устройства реализуют эту характеристику некорректно и возвращают недействительные Model ID. В качестве альтернативы вы можете вручную задать Model ID устройства, нажав кнопку «Set Model ID» и введя значение вручную. Можно выбрать устройства, которые оценивались в ходе наших тестов, или ввести произвольное значение. Полный список устройств, совместимых с Fast Pair, находится в корне этого репозитория.
После установки Model ID в сведениях об устройстве будет показана метаинформация о нём.
Чтобы запустить атаку, нажмите кнопку «Attack» на панели сведений об устройстве. Реализованы три атаки: проверка соблюдения предиката состояния сопряжения, повторное использование nonce и атака на недопустимую кривую. Если вы уже подключены к устройству, установка флажка «Reconnect» приведёт к отключению и повторному подключению к устройству перед выполнением атаки.
Проверка соблюдения предиката состояния сопряжения предлагает несколько дополнительных параметров конфигурации:
Пока выполняется атака, в интерфейсе в реальном времени отображаются логи. После завершения атаки будет показана её продолжительность.
Иногда атака или сопряжение может занять больше времени, чем ожидалось.
Вы можете отменить атаку или сопряжение, нажав кнопку «Cancel» в соответствующем диалоговом окне.
Если вы перезагрузили интерфейс во время атаки или сопряжения, вы можете воспользоваться диспетчером задач для отмены.
В правом верхнем углу экрана вторая кнопка справа отображает статус задач. Если активных задач нет, на ней будет написано «No active tasks». В противном случае на ней будет написано «Task in progress». Чтобы отменить задачу, нажмите кнопку «Task in progress», а затем кнопку «Cancel».
Если сервер завис из-за незавершённой задачи, которую невозможно отменить, попробуйте сбросить Bluetooth-адаптер.
[!NOTE] Отмена задач может занимать до 20 секунд.
В некоторых случаях Bluetooth-адаптер может «застрять» в «некорректном состоянии». Самое простое решение этой проблемы — сброс Bluetooth-адаптера. Чтобы выполнить сброс, откройте меню устранения неполадок, нажав значок гаечного ключа в правом верхнем углу экрана. Затем выберите «Reset BLE adapter» и подтвердите сброс, нажав «Reset» в диалоговом окне.
Если произойдёт фатальная ошибка и серверу придётся завершить работу, скрипт start.sh автоматически перезапустит сервер.
В сценариях с большим количеством находящихся поблизости BLE-устройств сервер может неожиданно завершить работу из-за ошибки D-Bus.
Это происходит очень редко, и в таких случаях скрипт ./start.sh должен автоматически перезапустить сервер.
Если вы ищете устройства, совместимые с Fast Pair, вы можете воспользоваться списком Model ID, чтобы просмотреть все сертифицированные 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 | Только в рамках той же сессии | Нет |