
Трехэтапное извлечение Bluetooth BDADDR, DoS и перехват на устройствах Fast Pair; незапатченные примитивы за пределами области CVE-2025-36911 (Ubertooth не требуется)
Инструмент исследования Bluetooth: извлечение BDADDR, отказ в обслуживании и перехват
© 2026 @Ymsniper — Только для авторизованных исследований безопасности.
Whisper Bully — это трёхэтапный инструмент для исследования безопасности Bluetooth, нацеленный на устройства, рекламирующие Google Fast Pair (сервисный UUID fe2c). Он демонстрирует два неисправленных примитива атаки, которые находятся за пределами области действия патча прошивки CVE-2025-36911:
⚠️ Этот инструмент НЕ реализует протокол Whisper Pair (Fast Pair GATT). Он никогда не записывает в характеристику Key-Based Pairing (UUID 1236) или характеристику Account Key (UUID 1238). Описанная здесь поверхность атаки является отдельной и не учтена в патче проверки режима сопряжения CVE-2025-36911.
https://github.com/user-attachments/assets/67f2bcb6-38ad-4ba0-80c5-36dbb54f3f11
Основная причина: При установке BLE-соединения хост-стек Linux BlueZ обрабатывает событие LL_CONNECTION_COMPLETE и преобразует разрешимый приватный адрес (RPA) устройства в его постоянный идентификационный адрес, кэшируя его в таблице устройств BlueZ. Это происходит на уровне Link Layer / HCI, до любого взаимодействия с GATT-сервисом. Протокол Fast Pair не задействован.
Что на самом деле делает код:
BleakScanner) для обнаружения устройств, рекламирующих сервисный UUID Fast Pair fe2c — используется только для идентификации цели, без взаимодействия с протоколомBleakClient.connect() — никаких GATT-записей любого родаNoInputNoOutput в качестве подготовки к шагу 4wb.py)bluetoothctl pair <rpa_addr> — стандартная попытка SMP-сопряжения, а не Fast Pairbluetoothctl на наличие строки Bonded: yes, которая может содержать связанный адресbluetoothctl devices и сравнивает с исходным RPA — любая запись с тем же именем устройства, но другим адресом, является постоянным идентификационным адресом, раскрытым BlueZ на шаге 2Почему патч это не исправляет:
Исправление CVE-2025-36911 добавляет в прошивку аксессуара проверку режима сопряжения в обработчике характеристики Key-Based Pairing GATT Fast Pair. Этот инструмент никогда не записывает в эту характеристику. Утечка идентификационного адреса происходит на хосте атакующего Linux через собственный кэш устройств BlueZ — полностью вне прошивки аксессуара.
Ключевые замечания по поведению:
bluetoothctl pair завершается неудачей или тайм-аутомNoInputNoOutput означает отсутствие взаимодействия с пользователем с обеих сторон для Just WorksПосле получения постоянного адреса можно по желанию выполнить устойчивый L2CAP-флуд типа «отказ в обслуживании», используя модифицированную версию l2flood.
В инструменте используются два режима:
Флаг -R — режим EMP (флуд на этапе 2)
Тихий режим «выстрелил и забыл» с всплесками и переподключением. Все потоки синхронизируют свои циклы «подключение → всплеск → принудительное закрытие», чтобы цель получала периодические полные разрывы ACL, а не перемежающуюся перестановку L2CAP-каналов, которую она может поглотить. Использует SO_LINGER {1,0} для немедленного разрыва RST при каждом закрытии. Не выводит stdout в нормальном режиме работы — ошибки подключения подавляются в stderr и выводятся только периодически.
Обычный режим (зондирование для перехвата на этапе 3)
Используется без -R для проверки, отвечает ли цель ещё. Этот режим также был улучшен — теперь он автоматически выполняет переподключения и выводит no response from <addr>: id N, когда цель перестаёт отвечать, что wb.py отслеживает для запуска перехвата.
Результат: Целевое устройство становится недоступным для обычных попыток подключения, пока активен флуд. Устройство полностью восстанавливается, когда атака прекращается — никакого постоянного повреждения.
Поведение многопоточности:
Основная причина: Устойчивый L2CAP-флуд вызывает сбой или сброс стека Bluetooth целевого устройства. В окне восстановления — до того, как GATT-сервис Fast Pair будет перерегистрирован и Security Manager полностью переинициализируется — устройство принимает стандартную SMP-связку Just Works от NoInputNoOutput, не требуя рукопожатия Fast Pair GATT, которое обычно ограничивает связывание. Полученная связка является постоянной: она переживает сбросы BT-адаптера и показывает Paired: yes / Bonded: yes в bluetoothctl info.
Почему это отдельное открытие, а не часть CVE-2025-36911:
Патч CVE-2025-36911 внедряет проверку режима сопряжения в обработчик характеристики Key-Based Pairing GATT Fast Pair. Этап 3 никогда не обращается к этой характеристике. Связывание устанавливается на уровне SMP в окне, когда GATT-сервер FP ещё не переинициализировался, поэтому шлюз безопасности Fast Pair даже не достигается. Полностью исправленное устройство остаётся уязвимым, потому что патч не имеет видимости уровня SMP во время восстановления стека.
Что на самом деле делает код:
l2flood -c -1 -t 2) для подтверждения, что устройство не отвечает — ищет в выводе no response from <addr>: id Nbluetoothctl connect <permanent_addr>NoInputNoOutput / NoInputNoOutput → модель ассоциации Just Works → связывание завершаетсяbluetoothctl connect возвращает код выхода 0 при успехеВероятность успеха в зависимости от состояния устройства:
| Состояние устройства | Ожидаемый результат |
|---|---|
| Активно под флудом / не отвечает | Наивысший успех — стек в деградированном состоянии во время восстановления |
| Восстанавливается после флуда | Высокий успех — временное окно повторной инициализации SM |
| Полностью восстановилось | Более низкий успех — нормальная безопасность восстановлена |
Это инструмент для исследования отказа в обслуживании и несанкционированного доступа.
Использование этого инструмента на устройствах, которые вам не принадлежат, или без явного письменного разрешения является федеральным преступлением, наказуемым тюремным заключением и штрафами в соответствии с Computer Fraud and Abuse Act (18 U.S.C. § 1030) и аналогичными законами в других юрисдикциях.
Вы можете только использовать этот инструмент на:
bluetoothctl и низкоуровневого доступа к BLE)bluetoothctl / BlueZl2flood с поддержкой OpenMP — см. kovmir/l2floodUbuntu / Debian:
sudo apt update
sudo apt install -y python3 python3-pip libdbus-1-dev libglib2.0-dev bluez
Fedora / RHEL / CentOS:
sudo dnf install -y python3 python3-pip dbus-devel glib2-devel bluez
Arch Linux:
sudo pacman -S python python-pip dbus glib bluez
Alpine Linux:
apk add --no-cache python3 py3-pip dbus-dev glib-dev bluez bluez-openrc
openSUSE:
sudo zypper install -y python3 python3-pip dbus-1-devel glib2-devel bluez
Void Linux:
sudo xbps-install -S python3 python3-pip dbus-devel glib-devel bluez
git clone https://github.com/Ymsniper/Whisper_Bully.git
cd Whisper_Bully
pip3 install -r requirements.txt
# Требуется только для этапов 2/3:
make
sudo make install
# Автоматическое обнаружение и извлечение всех ближайших устройств Fast Pair
sudo python3 wb.py
# Сканирование 20 секунд, сохранение результатов
sudo python3 wb.py -s 20 -o targets.json
# Сканирование 30 секунд, пользовательский выходной файл
sudo python3 wb.py -s 30 -o extracted.json
Примечание: Если устройство ранее было подключено или сопряжено этим инструментом или вручную, BlueZ уже знает его идентификационный адрес. Сначала удалите его, чтобы извлечение прошло чисто:
sudo bluetoothctl remove <address>
sudo python3 wb.py -s 20 -o targets.json
# По завершении: "Run aggressive L2CAP test... (yes/no)" → yes
# Этап 1 + Этап 2 только
sudo python3 wb.py -s 20 -o targets.json --aggressive
# Этап 1 + Этап 2 + Этап 3
sudo python3 wb.py -s 20 -o targets.json --aggressive --hijack
# С указанием длительности и количества потоков
sudo python3 wb.py -s 20 -o targets.json --aggressive --hijack -d 120 -t 8
# Флуд из файла извлечённых целей в течение 120 секунд
sudo python3 aggressive_test.py -f targets.json -d 120 -t 4
# Флуд одного известного адреса в течение 60 секунд
sudo python3 aggressive_test.py AA:BB:CC:DD:EE:FF -d 60
# Бесконечный флуд (Ctrl+C для остановки)
sudo python3 aggressive_test.py AA:BB:CC:DD:EE:FF -f
# Интегрированный — извлечение, флуд, затем перехват
sudo python3 wb.py -s 20 -o targets.json --aggressive --hijack -d 120
# Ручной отдельный перехват по известному адресу
sudo python3 wb.py -H AA:BB:CC:DD:EE:FF
sudo python3 wb.py -s 20 -o targets.json --aggressive --hijack -d 120 -t 4
Порядок выполнения:
targets.json# Терминал 1
sudo python3 wb.py -s 20 -o targets.json --aggressive --hijack -i hci0 -d 120 -t 4 &
# Терминал 2
sudo python3 wb.py -s 20 -o targets.json --aggressive --hijack -i hci1 -d 120 -t 4
Удваивает давление DoS и увеличивает вероятность успеха перехвата в окне восстановления.
Сервисный UUID Fast Pair FE2C используется только как фильтр сканирования для идентификации потенциальных целей. После установки BLE-соединения:
LL_CONNECTION_COMPLETEbluetoothctl devices затем показывает как исходный RPA, так и только что зарегистрированный идентификационный адрес — одно и то же имя устройства, но другой адресВызов bluetoothctl pair, который выполняется параллельно, может завершиться успешно или нет — BDADDR обычно уже находится в таблице к моменту завершения или сбоя команды pair.
l2flood -R)Эта модифицированная версия l2flood имеет два режима в зависимости от предполагаемого этапа:
Флаг -R — режим EMP (только DoS, без перехвата)
Используется при запуске Этапа 2 отдельно без перехода к Этапу 3.
Тихий режим «выстрелил и забыл» — все потоки синхронизируют свои
циклы «подключение → всплеск → принудительное закрытие», чтобы гарантировать
периодические полные разрывы ACL. Не выводит stdout в нормальном режиме работы.
Обычный режим (DoS + зондирование для перехвата)
Используется, когда планируется Этап 3. Обычный режим был улучшен для
автоматического выполнения переподключений и выводит no response from <addr>: id N,
когда цель перестаёт отвечать — это сигнал, который wb.py отслеживает
для запуска попытки перехвата.
Полученная связка — это не временное соединение, а полная SMP-связка, хранимая BlueZ:
bluetoothctl info <addr> показывает Paired: yes, Bonded: yes, Trusted: nobluetoothctl power off/on/var/lib/bluetooth/)bluetoothctlУстройства не найдены
bluetoothctl работает: sudo bluetoothctl list-s 30Ошибка подключения BLE / сбой извлечения
sudo bluetoothctl remove <addr>Флуд не оказывает эффекта
-t 16Отказано в доступе
sudobluetooth, или запускайте от rootОшибка импорта bleak
sudo apt install libdbus-1-dev libglib2.0-devsudo dnf install dbus-devel glib2-develsudo pacman -S dbus glibОшибки D-Bus
sudo systemctl start dbus && sudo systemctl start bluetoothMIT. Подробнее в LICENSE.
Этот инструмент предназначен только для авторизованного тестирования безопасности и оборонительных исследований. Несанкционированный доступ к Bluetooth-устройствам незаконен. Используйте только на устройствах, которые вам принадлежат или на которые у вас есть явное письменное разрешение на тестирование. Автор не несёт ответственности за несанкционированное или незаконное использование.
| Выключено | Сбой |
| CVE-2025-36911 (WhisperPair) | Этот инструмент |
|---|
| Используемый протокол | Fast Pair GATT KBP (запись UUID 1236) | Нет — только простое BLE-подключение |
| Путь утечки BDADDR | Зашифрованное уведомление KBP (BR/EDR адрес) | Преобразование RPA BlueZ при LL_CONNECTION_COMPLETE |
| Путь обхода аутентификации | Отсутствует проверка режима сопряжения FP | SMP Just Works во время окна восстановления стека BT |
| Исправлено патчем 36911? | Да | Нет |
| Работает на исправленных устройствах? | Нет | Да |
| CWE | CWE-287 | CWE-200 (Stage 1) + CWE-362/CWE-287 (Stage 3) |
| Флаг | Описание |
|---|
-s, --scan-time | Длительность BLE-сканирования в секундах (по умолчанию: 10) |
-o, --output | Сохранить извлечённые адреса в JSON-файл |
--aggressive | Пропустить запросы, сразу запустить Этап 2 (требуется предварительное письменное разрешение) |
-H, --hijack | Попытаться выполнить Этап 3 после Этапа 2 (требует --aggressive или интерактивного yes) |
-d, --duration | Длительность флуда в секундах (по умолчанию: 60) или f для бесконечного |
-t, --threads | Количество параллельных потоков L2CAP-флуда (по умолчанию: количество CPU) |
-i, --hci | Используемый HCI-адаптер (например, hci0, hci1) |