
Una herramienta de investigación de seguridad que identifica y demuestra la CVE-2025-36911: Fast Pair Pairing Mode Bypass vulnerabilidad
Un análisis profundo de CVE-2025-36911 y las brechas de seguridad en el ecosistema Fast Pair de Google
Google Fast Pair fue diseñado para hacer que el emparejamiento Bluetooth sea fluido: toca una notificación y estás conectado. Pero, ¿qué sucede cuando esa experiencia fluida se convierte en una responsabilidad de seguridad? WhisperPair-PoC-Tool es una herramienta de investigación de seguridad que expone dos clases críticas de vulnerabilidades que afectan a millones de accesorios Bluetooth: elusión de emparejamiento no autorizada y explotación del seguimiento de la Red de Encontrar Dispositivo.
Esta publicación detalla los internos técnicos de WhisperPair-PoC-Tool, las debilidades del protocolo que explota y lo que esto significa para el ecosistema de accesorios Bluetooth.
La especificación de Google Fast Pair establece explícitamente:
"Si el campo opcional de Clave Pública está presente: si el dispositivo no está en modo de emparejamiento, ignora la escritura y sal."
Esta es la puerta de seguridad crítica. Los dispositivos solo deben responder a solicitudes de Emparejamiento Basado en Clave cuando el usuario ha puesto explícitamente el dispositivo en modo de emparejamiento (generalmente manteniendo presionado un botón). Esto asegura la intención del usuario, para que no puedas emparejarte con los auriculares de alguien mientras los está usando.
El Problema: Muchos fabricantes omiten esta verificación por completo. Procesan solicitudes de emparejamiento independientemente del estado del modo de emparejamiento, lo que permite:
La Red de Encontrar Dispositivo de Google (FMDN) permite rastrear accesorios Bluetooth a través de la red de dispositivos Android obtenida de forma colaborativa. Esto requiere una Clave de Cuenta, una clave simétrica de 16 bytes que vincula el dispositivo a una cuenta de Google.
El Problema: La característica de Clave de Cuenta a menudo acepta escrituras sin autenticación:
Antes de sumergirnos en la explotación, entendamos el flujo legítimo de Fast Pair:
┌─────────────────────────────────────────────────────────────┐
│ Anuncio BLE │
├─────────────────────────────────────────────────────────────┤
│ UUID de Servicio: 0xFE2C (Fast Pair) │
│ Datos de Servicio: │
│ [Modo de Emparejamiento] → 3 bytes: Solo ID de Modelo │
│ [Sin Emparejamiento] → 4+ bytes: 0x00 + Filtro de │
│ Clave de Cuenta │
└─────────────────────────────────────────────────────────────┘
El formato del anuncio revela el estado de emparejamiento:
Buscador (Teléfono) Proveedor (Accesorio)
│ │
│───── Conexión GATT ─────────────────────────>│
│ │
│───── Descubrir Servicios ───────────────────>│
│<──── Servicio: 0xFE2C ────────────────────────│
│ │
│───── Habilitar Notificaciones (0xFE2C1234) ─>│
│ │
│───── Escribir Solicitud de Emparejamiento ──>│
│ [bloque cifrado de 16 bytes] │
│ [Clave Pública ECDH de 64 bytes] (opc) │
│ │
│ ┌────────────────────────────────────┐ │
│ │ VERIFICACIÓN DE SEGURIDAD: │ │
│ │ Si Clave Pública presente Y │ │
│ │ dispositivo NO en modo emparej.: │ │
│ │ → IGNORAR y SALIR │ │
│ │ Sino: │ │
│ │ → Procesar solicitud │ │
│ └────────────────────────────────────┘ │
│ │
│<──── Notificación: Respuesta Cifrada ────────│
│ [Dirección BR/EDR del Proveedor] │
│ │
│═══════ Emparejamiento Bluetooth Clásico ════>│
La vulnerabilidad ocurre cuando los dispositivos omiten completamente el recuadro de "VERIFICACIÓN DE SEGURIDAD".
WhisperPair-PoC-Tool es una herramienta de investigación de seguridad basada en Python construida sobre la biblioteca BLE Bleak. Opera en varias fases:
┌────────────────────────────────────────────────────────────────┐
│ WhisperPair-PoC-Tool │
├────────────────────────────────────────────────────────────────┤
│ Capa CLI │
│ ├── Análisis de argumentos (--target-name, --scan-duration) │
│ ├── Construcción de TargetPolicy │
│ └── Inicialización de REPL │
├────────────────────────────────────────────────────────────────┤
│ Motor de Descubrimiento │
│ ├── Escaneo BLE mediante Bleak │
│ ├── Análisis de anuncios │
│ ├── Detección de protocolo (Fast Pair, FMDN, Swift Pair) │
│ └── Huella digital del dispositivo (ID de Modelo, búsqueda │
│ OUI) │
├────────────────────────────────────────────────────────────────┤
│ Motores de Verificación │
│ ├── FastPairCheckEngine (análisis pasivo de anuncios) │
│ ├── FastPairBypass (prueba activa CVE-2025-36911) │
│ ├── FindHubCheckEngine (detección de estado de Clave de │
│ │ Cuenta) │
│ └── RiskScorer (evaluación compuesta de vulnerabilidades) │
├────────────────────────────────────────────────────────────────┤
│ Gestor de Conexión │
│ ├── Conexión GATT con negociación MTU │
│ ├── Descubrimiento de servicio/característica │
│ ├── Operaciones de Lectura/Escritura/Notificación │
│ └── Manejo de errores y lógica de reintento │
├────────────────────────────────────────────────────────────────┤
│ Módulos de Explotación │
│ ├── ring_device() - Activar sonido de localización │
│ ├── set_account_key() - Escribir Clave de Cuenta │
│ └── Análisis de respuesta (extracción de dirección BR/EDR) │
└────────────────────────────────────────────────────────────────┘
discovery.py)El escáner usa callbacks de detección de Bleak para capturar anuncios BLE:
async def _detection_callback(
self, device: BLEDevice, advertisement_data: AdvertisementData
) -> None:
"""Process each detected BLE advertisement."""
discovered = DiscoveredDevice(
address=device.address,
name=device.name or advertisement_data.local_name,
rssi=advertisement_data.rssi,
advertisement=self._convert_advertisement(advertisement_data),
first_seen=datetime.now(UTC),
last_seen=datetime.now(UTC),
)
self._devices[device.address] = discovered
Para cada dispositivo, la herramienta extrae:
0xFE2C, FMDN 0xFD44, etc.)0x00E0, Apple 0x004C)fastpair.py)El modo de emparejamiento se determina analizando el anuncio del dispositivo:
def _analyze_service_data(self, evidence: FastPairEvidence) -> None:
"""Analyze Fast Pair service data to infer pairing mode."""
data = evidence.service_data_bytes
# 3 bytes = Model ID only = Pairing Mode (discoverable)
if len(data) == 3:
evidence.inferred_pairing_mode = PairingModeState.IN_PAIRING_MODE
return
# 4+ bytes with version 0x00 = Not in pairing mode
if data[0] == 0x00:
akd_byte = data[1]
akd_type = akd_byte & 0x0F # Lower 4 bits
# Type 0x00 = Show UI, Type 0x02 = Hide UI
# Both indicate NOT in pairing mode
evidence.inferred_pairing_mode = PairingModeState.NOT_IN_PAIRING_MODE
Esto es crucial: si se determina que un dispositivo no está en modo de emparejamiento, y aún así responde a la solicitud de emparejamiento, es vulnerable.
fastpair_attack.py)La prueba de vulnerabilidad central envía solicitudes de Emparejamiento Basado en Clave y monitorea las respuestas:
async def check_vulnerability(self, device: DiscoveredDevice) -> BypassCheckResult:
"""Test if device responds to pairing requests when not in pairing mode."""
# Enable notifications to receive response
await self.connection_manager.start_notify(
KEY_BASED_PAIRING_CHAR,
self._notification_handler,
)
# Build and send request (multiple strategies)
for strategy in self.strategies:
request, flags = self._build_strategy_request(device.address, strategy)
await self.connection_manager.write_characteristic(
KEY_BASED_PAIRING_CHAR,
request,
)
# Wait for response
try:
await asyncio.wait_for(
self._response_received.wait(),
timeout=self.response_timeout,
)
# Response received = VULNERABLE
return BypassCheckResult(result=BypassResult.VULNERABLE, ...)
except asyncio.TimeoutError:
# No response = Device correctly ignored request
continue
return BypassCheckResult(result=BypassResult.NOT_VULNERABLE, ...)
La herramienta implementa múltiples estrategias de solicitud porque diferentes dispositivos responden a diferentes combinaciones de banderas:
Cuando un dispositivo vulnerable responde, la herramienta extrae la dirección BR/EDR (Bluetooth Clásico):
def _parse_response(self, response_data: bytes) -> str | None:
"""Extract provider's BR/EDR address from response."""
# Strategy 1: Standard response (type 0x01)
if response_data[0] == 0x01:
return self._extract_address(response_data, offset=1)
# Strategy 2: Extended response (type 0x02)
if response_data[0] == 0x02:
addr_count = response_data[2]
return self._extract_address(response_data, offset=3)
# Strategy 3: Brute force pattern matching
for offset in range(len(response_data) - 5):
addr = self._extract_address(response_data, offset)
if self._is_valid_mac(addr):
return addr
Esta dirección BR/EDR podría usarse para iniciar el emparejamiento Bluetooth Clásico (aunque WhisperPair-PoC-Tool se detiene en la detección).
La investigación identificó fallos de implementación comunes:
El problema más común: los fabricantes simplemente no implementan la verificación:
// VULNERABLE: No pairing mode check
void handle_kbp_write(uint8_t* data, size_t len) {
if (len >= 80 && has_public_key(data)) {
// Should check: if (!is_in_pairing_mode()) return;
process_pairing_request(data); // Processes regardless
}
}
La característica de Clave de Cuenta debería requerir autenticación:
// VULNERABLE: No authentication required
void handle_account_key_write(uint8_t* key, size_t len) {
if (len == 16) {
store_account_key(key); // Accepts any key from anyone
}
}
// SECURE: Verify caller knows existing key
void handle_account_key_write_secure(uint8_t* encrypted_key, size_t len) {
if (!verify_encrypted_with_existing_key(encrypted_key)) {
return; // Reject unauthorized writes
}
store_account_key(decrypt(encrypted_key));
}
Los dispositivos que anuncian datos de servicio de Fast Pair cuando no están en modo de emparejamiento revelan:
WhisperPair-PoC-Tool utiliza un enfoque de detección en capas:
No requiere conexión. La herramienta analiza lo que el dispositivo transmite:
┌─────────────────────────────────────────────────────────────┐
│ Verificaciones Pasivas │
├─────────────────────────────────────────────────────────────┤
│ ✓ UUID de servicio Fast Pair presente (0xFE2C) │
│ ✓ UUID de servicio FMDN presente (0xFD44) │
│ ✓ Modo de emparejamiento inferido de la longitud de datos │
│ de servicio │
│ ✓ ID de Modelo extraído (cuando está en modo emparej.) │
│ ✓ Filtro de Clave de Cuenta detectado (cuando NO está en │
│ modo de emparejamiento) │
│ ✓ Análisis de tipo de dirección (estática vs. aleatoria) │
└─────────────────────────────────────────────────────────────┘
Resultado: "Dispositivo anunciando datos Fast Pair mientras NO está en modo de emparejamiento"
→ Posible violación de compuerta (necesita prueba activa para confirmar)
Requiere conexión. La herramienta interactúa con los servicios GATT:
┌─────────────────────────────────────────────────────────────┐
│ Verificaciones Activas │
├─────────────────────────────────────────────────────────────┤
│ 1. Conectar al dispositivo vía BLE │
│ 2. Descubrir servicio Fast Pair (0xFE2C) │
│ 3. Localizar característica de Emparejamiento Basado en │
│ Clave (0xFE2C1234) │
│ 4. Habilitar notificaciones │
│ 5. Escribir solicitud de Emparejamiento Basado en Clave │
│ 6. Esperar respuesta (con tiempo de espera) │
│ 7. Respuesta recibida → VULNERABLE │
│ Tiempo de espera/Rechazado → NO VULNERABLE │
└─────────────────────────────────────────────────────────────┘
Se calcula una puntuación de riesgo compuesta:
Niveles de Riesgo:
WhisperPair-PoC-Tool incluye características de explotación controladas para demostrar el impacto:
ring)Activa la característica de Acciones de Baliza FMDN para reproducir el sonido de localización:
REDACTADO PARA PUBLICACIÓN
Impacto: Un atacante puede acosar a la víctima activando repetidamente el sonido, o usarlo para localizar un dispositivo que quiera robar.
set account-key)Escribe una nueva Clave de Cuenta en el dispositivo:
REDACTADO PARA PUBLICACIÓN
Impacto:
WhisperPair-PoC-Tool se detiene intencionalmente antes de la explotación completa:
if (has_public_key(request) && !is_in_pairing_mode()) {
return; // Ignore request per spec
}
Requerir autenticación para escrituras de Clave de Cuenta:
Minimizar la exposición del anuncio:
Mecanismo de actualización de firmware:
Esta herramienta está destinada para:
WhisperPair-PoC-Tool demuestra que la experiencia "fluida" de Fast Pair conlleva concesiones de seguridad que muchos fabricantes no logran abordar. La verificación del modo de emparejamiento es un solo condicional que separa un dispositivo seguro de uno vulnerable, pero con frecuencia se omite.
El modelo de confianza de Fast Pair asume que los dispositivos impondrán la intención del usuario. Cuando no lo hacen, los atacantes obtienen emparejamiento silencioso, capacidades de rastreo y vectores de denegación de servicio contra los dispositivos de las víctimas.
Esta herramienta busca ayudar al ecosistema a identificar y corregir estos problemas, haciendo que los accesorios Bluetooth sean más seguros para todos.
WhisperPair-PoC-Tool se publica solo para investigación de seguridad autorizada. No se asume ninguna responsabilidad por el mal uso de esta herramienta.
| Estrategia | Banderas | Descripción |
|---|
RAW_KBP | 0x11 | INITIATE_BONDING | EXTENDED_RESPONSE |
WITH_PUBLIC_KEY | 0x11 | Solicitud de 80 bytes con clave pública ECDH |
RETROACTIVE | 0x0A | Evita algunas verificaciones del fabricante |
EXTENDED | 0x10 | Para firmware de dispositivo más reciente |
| Señal | Puntuación | Significado |
|---|
| Violación de compuerta (pasivo) | +2 | Anunciando FP cuando no está en modo de emparejamiento |
| Bypass confirmado (activo) | +2 | Respondió a KBP cuando no estaba en modo de emparejamiento |
| FMDN sin Clave de Cuenta | +2 | Rastreable a través de la red Encontrar Dispositivo |
| Dirección BLE estática | +1 | El dispositivo es persistentemente rastreable |
| Rotación de dirección observada | -1 | Comportamiento que preserva la privacidad |
| Capacidad | Implementado | Razón |
|---|
| Detección de vulnerabilidades | ✅ Sí | Propósito principal |
| Extracción de dirección BR/EDR | ✅ Sí | Recopilación de evidencia |
| Emparejamiento Bluetooth Clásico | ❌ No | Requiere código específico de plataforma |
| Secuestro de audio HFP | ❌ No | Más allá del alcance de la herramienta BLE |
| Implante persistente | ❌ No | Capacidad maliciosa |