
Dreistufige Bluetooth-BDADDR-Extraktion, DoS & Hijack auf Fast-Pair-Geräten; ungepatchte Primitive außerhalb des CVE-2025-36911-Bereichs (kein Ubertooth erforderlich)
Bluetooth-BDADDR-Extraktion, Denial-of-Service & Hijack-Forschungswerkzeug
© 2026 @Ymsniper — Nur für autorisierte Sicherheitsforschung.
Whisper Bully ist ein dreistufiges Bluetooth-Sicherheitsforschungswerkzeug, das Geräte anvisiert, die Google Fast Pair (Dienst-UUID fe2c) bewerben. Es demonstriert zwei ungepatchte Angriffsprimitive, die außerhalb des Anwendungsbereichs des CVE-2025-36911-Firmware-Patches liegen:
⚠️ Dieses Werkzeug implementiert NICHT das Whisper Pair (Fast Pair GATT)-Protokoll. Es schreibt nie auf die Key-Based Pairing-Charakteristik (UUID 1236) oder Account-Key-Charakteristik (UUID 1238). Die hier beschriebene Angriffsfläche ist getrennt von und nicht adressiert durch den CVE-2025-36911-Pairing-Mode-Check-Patch.
https://github.com/user-attachments/assets/67f2bcb6-38ad-4ba0-80c5-36dbb54f3f11
Grundursache: Wenn eine BLE-Verbindung hergestellt wird, verarbeitet der Linux-BlueZ-Host-Stack das LL_CONNECTION_COMPLETE-Ereignis und löst die auflösbare private Adresse (RPA) des Geräts in seine permanente Identitätsadresse auf, die er in der BlueZ-Gerätetabelle zwischenspeichert. Dies geschieht auf der Link-Layer-/HCI-Ebene, bevor eine GATT-Dienstinteraktion stattfindet. Kein Fast-Pair-Protokoll ist beteiligt.
Was der Code tatsächlich tut:
BleakScanner) nach Geräten durch, die die Fast-Pair-Dienst-UUID fe2c bewerben – wird nur zur Zielidentifikation verwendet, keine ProtokollinteraktionBleakClient.connect() her – keine GATT-Schreibvorgänge jeglicher ArtNoInputNoOutput als Vorbereitung für Schritt 4wb.py)bluetoothctl pair <rpa_addr> aus – Standard-Bluetooth-SMP-Pairing-Versuch, nicht Fast Pairbluetoothctl auf die Ausgabe Bonded: yes, die die gebondete Adresse enthalten kannbluetoothctl devices auf und vergleicht mit der ursprünglichen RPA – jeder Eintrag mit demselben Gerätenamen, aber einer anderen Adresse, ist die permanente Identitätsadresse, die in Schritt 2 von BlueZ preisgegeben wurdeWarum der Patch dies nicht behebt:
Der CVE-2025-36911-Firmware-Fix fügt eine Pairing-Mode-Prüfung zum Fast-Pair-GATT-Key-Based-Pairing-Charakteristik-Handler auf dem Zubehör hinzu. Dieses Werkzeug schreibt nie auf diese Charakteristik. Der Identitätsadressen-Leak tritt auf dem Linux-Host des Angreifers über den eigenen BlueZ-Geräte-Cache auf – vollständig außerhalb der Firmware des Zubehörs.
Wichtige Verhaltenshinweise:
bluetoothctl pair fehlschlägt oder zeitlich ausläuftNoInputNoOutput bedeutet keine Benutzerinteraktion auf beiden Seiten für Just WorksSobald die permanente Adresse bekannt ist, kann optional ein anhaltender L2CAP-Denial-of-Service unter Verwendung einer modifizierten Version von l2flood ausgeführt werden.
Zwei Modi werden im gesamten Werkzeug verwendet:
-R-Flag — EMP-Modus (Stufe 2 Flood)
Stiller Fire-and-Forget-Burst-Reconnect. Alle Threads synchronisieren ihre Connect→Burst→Forced-Close-Zyklen, sodass das Ziel periodisch vollständige ACL-Takedowns erhält, anstatt gestaffeltes L2CAP-Kanal-Shuffling, das es absorbieren könnte. Verwendet SO_LINGER {1,0} für sofortigen RST-Takedown bei jedem Schließen. Erzeugt während des normalen Betriebs keine Ausgabe auf stdout – Verbindungsfehler werden nach stderr unterdrückt und nur periodisch ausgegeben.
Normalmodus (Stufe 3 Hijack-Probe)
Wird ohne -R verwendet, um zu prüfen, ob das Ziel noch antwortet. Dieser Modus wurde ebenfalls verbessert – er behandelt jetzt automatisch Wiederverbindungen und gibt no response from <addr>: id N aus, wenn das Ziel nicht mehr antwortet, was wb.py überwacht, um den Hijack auszulösen.
Ergebnis: Das Zielgerät wird während des aktiven Floods unerreichbar für normale Verbindungsversuche. Das Gerät erholt sich vollständig, wenn der Angriff stoppt – kein dauerhafter Schaden.
Multithread-Verhalten:
Grundursache: Der anhaltende L2CAP-Flood führt dazu, dass der Bluetooth-Stack des Zielgeräts abstürzt oder zurückgesetzt wird. Während des Wiederherstellungsfensters – bevor der Fast-Pair-GATT-Dienst erneut registriert wurde und bevor der Security Manager vollständig neu initialisiert wurde – akzeptiert das Gerät einen standardmäßigen SMP Just Works Bond von NoInputNoOutput, ohne den Fast-Pair-GATT-Handshake zu erfordern, der normalerweise den Bond blockieren würde. Der resultierende Bond ist persistent: Er überlebt BT-Adapter-Resets und zeigt Paired: yes / Bonded: yes in bluetoothctl info an.
Warum dies ein separater Befund von CVE-2025-36911 ist:
Der CVE-2025-36911-Patch erzwingt eine Pairing-Mode-Prüfung im FP-GATT-Key-Based-Pairing-Charakteristik-Handler. Stufe 3 greift nie auf diese Charakteristik zu. Der Bond wird auf der SMP-Ebene während eines Fensters hergestellt, in dem der FP-GATT-Server nicht neu initialisiert wurde, sodass das Fast-Pair-Sicherheitstor nie erreicht wird. Ein vollständig gepatchtes Gerät bleibt dafür anfällig, da der Patch während der Stack-Wiederherstellung keine Sichtbarkeit auf die SMP-Ebene hat.
Was der Code tatsächlich tut:
l2flood -c -1 -t 2), um zu bestätigen, dass das Gerät nicht reagiert – sucht nach no response from <addr>: id N in der Ausgabebluetoothctl connect <permanent_addr> in einer Wiederholungsschleife ausNoInputNoOutput / NoInputNoOutput → Just Works-Assoziationsmodell → Bond wird abgeschlossenbluetoothctl connect gibt bei Erfolg den Exit-Code 0 zurückErfolgswahrscheinlichkeit nach Gerätezustand:
| Gerätezustand | Erwartetes Ergebnis |
|---|---|
| Aktiv im Flood / nicht reagierend | Höchste Erfolgswahrscheinlichkeit – Stack in degradiertem Zustand während der Wiederherstellung |
| Erholung vom Flood | Hohe Erfolgswahrscheinlichkeit – temporäres SM-Neuinitialisierungsfenster |
| Vollständig erholt | Geringere Erfolgswahrscheinlichkeit – normale Sicherheit wiederhergestellt |
Dies ist ein Forschungswerkzeug für Denial-of-Service und unbefugten Zugriff.
Die Verwendung dieses Werkzeugs auf Geräten, die Ihnen nicht gehören, oder ohne ausdrückliche schriftliche Genehmigung ist ein Bundesverbrechen, das mit Gefängnis und Geldstrafen gemäß dem Computer Fraud and Abuse Act (18 U.S.C. § 1030) und entsprechenden Gesetzen in anderen Rechtsordnungen bestraft wird.
Sie dürfen dieses Werkzeug nur verwenden auf:
bluetoothctl und rohen BLE-Zugriff)bluetoothctl / BlueZ installiert und funktionsfähigl2flood mit OpenMP-Unterstützung – siehe 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
# Required for Stage 2/3 only:
make
sudo make install
# Auto-detect and extract all nearby Fast Pair devices
sudo python3 wb.py
# 20 second scan, save results
sudo python3 wb.py -s 20 -o targets.json
# 30 second scan, custom output file
sudo python3 wb.py -s 30 -o extracted.json
Hinweis: Wenn ein Gerät zuvor von diesem Werkzeug oder manuell verbunden oder gepaart wurde, kennt BlueZ bereits seine Identitätsadresse. Entfernen Sie es zuerst, damit die Extraktion sauber läuft:
sudo bluetoothctl remove <address>
sudo python3 wb.py -s 20 -o targets.json
# Bei Abschluss: "Run aggressive L2CAP test... (yes/no)" → yes
# Stufe 1 + Stufe 2 nur
sudo python3 wb.py -s 20 -o targets.json --aggressive
# Stufe 1 + Stufe 2 + Stufe 3
sudo python3 wb.py -s 20 -o targets.json --aggressive --hijack
# Mit Dauer und Thread-Anzahl
sudo python3 wb.py -s 20 -o targets.json --aggressive --hijack -d 120 -t 8
# Flood aus extrahierter Zieldatei für 120 Sekunden
sudo python3 aggressive_test.py -f targets.json -d 120 -t 4
# Flood einer einzelnen bekannten Adresse für 60 Sekunden
sudo python3 aggressive_test.py AA:BB:CC:DD:EE:FF -d 60
# Flood unendlich (Strg+C zum Stoppen)
sudo python3 aggressive_test.py AA:BB:CC:DD:EE:FF -f
# Integriert — extrahieren, flooden, dann hijacken
sudo python3 wb.py -s 20 -o targets.json --aggressive --hijack -d 120
# Manueller eigenständiger Hijack auf bekannter Adresse
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
Ausführungsablauf:
targets.json speichern# Terminal 1
sudo python3 wb.py -s 20 -o targets.json --aggressive --hijack -i hci0 -d 120 -t 4 &
# Terminal 2
sudo python3 wb.py -s 20 -o targets.json --aggressive --hijack -i hci1 -d 120 -t 4
Verdoppelt den DoS-Druck und erhöht die Hijack-Erfolgswahrscheinlichkeit während des Wiederherstellungsfensters.
Die Fast-Pair-FE2C-Dienst-UUID wird nur als Scan-Filter verwendet, um Kandidatenziele zu identifizieren. Sobald eine BLE-Verbindung hergestellt ist:
LL_CONNECTION_COMPLETE an den Hostbluetoothctl devices zeigt dann sowohl die ursprüngliche RPA als auch die neu registrierte Identitätsadresse an – gleicher Gerätename, andere AdresseDer bluetoothctl pair-Aufruf, der parallel läuft, kann erfolgreich sein oder fehlschlagen – die BDADDR befindet sich normalerweise bereits in der Tabelle, wenn der Pair-Befehl abgeschlossen ist oder fehlschlägt.
l2flood -R)Dieses modifizierte l2flood hat zwei Modi, abhängig von der beabsichtigten Stufe:
-R-Flag — EMP-Modus (DoS nur, kein Hijack)
Wird verwendet, wenn Stufe 2 eigenständig ohne Übergang zu Stufe 3 ausgeführt wird.
Stiller Fire-and-Forget-Burst-Reconnect – alle Threads synchronisieren ihre
Connect→Burst→Forced-Close-Zyklen, um periodisch vollständige ACL-Takedowns
zu garantieren. Erzeugt während des normalen Betriebs keine Ausgabe auf stdout.
Normalmodus (DoS + Hijack-Probe)
Wird verwendet, wenn Stufe 3 beabsichtigt ist. Der Normalmodus wurde verbessert,
um automatisch Wiederverbindungen zu behandeln und gibt no response from <addr>: id N
aus, wenn das Ziel nicht mehr antwortet – dies ist das Signal, das wb.py überwacht,
um den Hijack-Versuch auszulösen.
Der resultierende Bond ist keine flüchtige Verbindung – es ist ein vollständiger SMP-Bond, der von BlueZ gespeichert wird:
bluetoothctl info <addr> zeigt Paired: yes, Bonded: yes, Trusted: nobluetoothctl power off/on-Zyklen/var/lib/bluetooth/)bluetoothctlKeine Geräte gefunden
bluetoothctl funktioniert: sudo bluetoothctl list-s 30BLE-Verbindung fehlgeschlagen / Extraktion fehlschlägt
sudo bluetoothctl remove <addr>Flood hat keine Wirkung
-t 16Zugriff verweigert
sudo ausführenbluetooth-Gruppe ist, oder als root ausführenbleak-Importfehler
sudo apt install libdbus-1-dev libglib2.0-devsudo dnf install dbus-devel glib2-develsudo pacman -S dbus glibD-Bus-Fehler
sudo systemctl start dbus && sudo systemctl start bluetoothMIT. Siehe LICENSE für Details.
Dieses Werkzeug ist für autorisierte Sicherheitstests und defensive Forschung bestimmt. Unbefugter Zugriff auf Bluetooth-Geräte ist illegal. Verwenden Sie es nur auf Geräten, die Ihnen gehören oder für die Sie eine ausdrückliche schriftliche Erlaubnis zum Testen haben. Der Autor übernimmt keine Haftung für unbefugte oder illegale Nutzung.
| Ausgeschaltet | Fehlschlag |
| CVE-2025-36911 (WhisperPair) | Dieses Werkzeug |
|---|
| Verwendetes Protokoll | Fast Pair GATT KBP (UUID 1236 write) | Keines – nur einfache BLE-Verbindung |
| BDADDR-Leak-Pfad | Verschlüsselte KBP-Benachrichtigung (BR/EDR-Adresse) | BlueZ-RPA-Auflösung bei LL_CONNECTION_COMPLETE |
| Auth-Bypass-Pfad | Fehlende FP-Pairing-Mode-Prüfung | SMP Just Works während BT-Stack-Wiederherstellungsfenster |
| Durch 36911-Fix gepatcht? | Ja | Nein |
| Funktioniert auf gepatchten Geräten? | Nein | Ja |
| CWE | CWE-287 | CWE-200 (Stufe 1) + CWE-362/CWE-287 (Stufe 3) |
| Flag | Beschreibung |
|---|
-s, --scan-time | Dauer des BLE-Scans in Sekunden (Standard: 10) |
-o, --output | Extra hierte Adressen in JSON-Datei speichern |
--aggressive | Überspringe Abfragen, führe Stufe 2 sofort aus (erfordert vorherige schriftliche Genehmigung) |
-H, --hijack | Versuche Stufe 3 Hijack nach Stufe 2 (erfordert --aggressive oder interaktives Ja) |
-d, --duration | Flood-Dauer in Sekunden (Standard: 60) oder f für unendlich |
-t, --threads | Parallele L2CAP-Flood-Threads (Standard: Anzahl CPUs) |
-i, --hci | Zu verwendender HCI-Adapter (z.B. hci0, hci1) |