
Официальная эталонная реализация и проверка уязвимости нашей атаки 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.