Este repositorio contiene la implementación de una prueba de concepto para grabar y reproducir audio desde un dispositivo Bluetooth sin el conocimiento del usuario legítimo.
La PoC fue demostrada durante la charla BSAM: Seguridad en Bluetooth en RootedCON 2024 en Madrid.
Está diseñado para crear conciencia sobre el uso inseguro de dispositivos Bluetooth y la necesidad de una metodología consistente para evaluaciones de seguridad. Ese es el propósito de BSAM, la Metodología de Evaluación de Seguridad Bluetooth, publicada por Tarlogic y disponible aquí.
Esta prueba de concepto explota el incumplimiento del control BSAM-PA-05 dentro de la metodología BSAM. En consecuencia, el dispositivo permite el procedimiento de pairing sin requerir interacción del usuario y expone su funcionalidad a cualquier agente dentro del rango de señal.
Más información en nuestro blog.
El código está escrito en Python y ha sido probado con Python 3.11.8, pero principalmente utiliza herramientas ampliamente disponibles en sistemas Linux.
La PoC utiliza las siguientes herramientas:
bluetoothctlbtmgmtpactlparecordpaplay
En distribuciones Arch Linux, bluetoothctl y btmgmt se pueden instalar con el paquete bluez-utils, mientras que pactl, parecord y paplay están disponibles en el paquete libpulse.
Para que la PoC funcione, es necesario tener una instalación funcional del stack Bluetooth BlueZ, disponible en el paquete bluez para distribuciones Arch Linux. También se requiere una instalación funcional de un servidor de audio compatible con PulseAudio, como PipeWire, para grabar y reproducir audio.
Asegúrate de que tu dispositivo sea capaz de funcionar como fuente de audio, es decir, que tenga un micrófono, y que sea descubrible y conectable vía Bluetooth.
Por ejemplo, para ser descubrible y conectable, los auriculares usados durante la charla deben estar fuera de su estuche de carga. Por defecto, solo activan el micrófono cuando se colocan en los oídos del usuario, aunque esta configuración se puede ajustar en la aplicación de configuración.
Además, asegúrate de que el dispositivo no esté ya conectado, o alternativamente, que soporte múltiples conexiones.
La forma más fácil de usar BlueSpy es escanear y seleccionar el dispositivo interactivamente:
python3 BlueSpy.py --scanO con tiempo de escaneo personalizado:
python3 BlueSpy.py --scan --scan-time 15Esto mostrará una lista numerada de dispositivos disponibles y podrás seleccionar el que quieras atacar.
Si ya conoces la dirección MAC del dispositivo:
python3 BlueSpy.py -a <dirección>Monitoreo en tiempo real mientras se graba:
python3 BlueSpy.py -a <dirección> -l
# o
python3 BlueSpy.py --scan -lModo verbose para ver más detalles:
python3 BlueSpy.py -a <dirección> -vEspecificar archivo de salida:
python3 BlueSpy.py -a <dirección> -f mi_grabacion.wavCombinar opciones:
python3 BlueSpy.py --scan -l -v -f grabacion.wav-a, --target-address: Dirección MAC del dispositivo (opcional si se usa--scan)--scan: Escanear y seleccionar dispositivo interactivamente--scan-time: Tiempo de escaneo en segundos (por defecto: 10)-l, --live: Escuchar audio en tiempo real mientras se graba-v, --verbose: Mostrar salida detallada-f, --file: Archivo para guardar la grabación (por defecto: recording.wav)-s, --sink: Sink para reproducir el audio (por defecto: auto-detectado)-t, --target-address-type: Tipo de dirección MAC (BR_EDR, LE_PUBLIC, LE_RANDOM)
Nota: El script puede solicitar permisos de superusuario para modificar la configuración de tu instancia de BlueZ y emparejarlo con el dispositivo remoto.
- ✅ Escaneo interactivo: Encuentra y selecciona dispositivos sin necesidad de conocer su dirección MAC
- ✅ Monitoreo en tiempo real: Escucha el audio mientras se graba con la opción
-l/--live - ✅ Detección automática: Detecta automáticamente perfiles de audio y nombres de sources
- ✅ Manejo robusto de errores: Mensajes claros y útiles para diferentes tipos de errores
- ✅ Soporte para root: Funciona correctamente cuando se ejecuta con permisos de administrador
- ✅ Reintentos automáticos: Reintenta conexiones fallidas automáticamente
- ✅ Diagnósticos mejorados: Verifica el estado del dispositivo y muestra advertencias útiles
El pairing falla con error 0x0b (Rejected)
- El dispositivo rechazó el pairing. Esto significa que probablemente no es vulnerable al ataque sin interacción.
- Algunos dispositivos requieren confirmación del usuario o tienen protecciones adicionales.
El pairing falla con error 0x05 (Authentication Failed)
- El dispositivo requiere autenticación y no es vulnerable a pairing sin interacción.
Error de conexión: br-connection-page-timeout
- El dispositivo no responde a la solicitud de conexión.
- Verifica que el dispositivo esté encendido y en rango.
- Asegúrate de que el dispositivo esté en modo descubrible/conectable.
- El script reintentará automáticamente, pero si persiste, el dispositivo puede no estar disponible.
No se graba audio / El archivo está vacío
- El dispositivo puede no estar enviando audio.
- Muchos dispositivos Bluetooth solo activan el micrófono cuando están en una llamada activa.
- Verifica que el dispositivo esté en modo de llamada o que el micrófono esté activo.
- Usa
-vpara ver el estado del source y diagnósticos.
Error: Connection refused (PulseAudio/PipeWire)
- El script detecta automáticamente si se ejecuta como root y usa el usuario correcto.
- Si persiste, verifica que PipeWire o PulseAudio estén corriendo.
- Asegúrate de tener permisos para acceder al servidor de audio.
El monitoreo en tiempo real no funciona
- Verifica que el sink especificado exista usando
pactl list sinks short. - El script intenta detectar automáticamente el sink del sistema si no se especifica uno.
Si encuentras problemas, puedes ejecutar las fases individualmente para diagnosticar:
pair.pyutilizabtmgmtpara modificar la configuración de BlueZ e iniciar el proceso de pairing.connect.pyutilizabluetoothctlpara escanear y establecer una conexión al dispositivo.just_record.pyutilizapactlyparecordpara buscar el dispositivo en las fuentes de audio e iniciar una sesión de grabación.
Los comandos exactos están en las funciones correspondientes dentro de core.py.
Usa el modo verbose (-v) para obtener más información sobre lo que está pasando:
python3 BlueSpy.py -a <dirección> -vEsto mostrará:
- Comandos ejecutados
- Estado del source de audio
- Perfiles detectados
- Errores detallados
- Advertencias sobre posibles problemas
Ver CHANGELOG.md para una lista completa de cambios.
Si tienes alguna pregunta sobre cómo funciona el estándar Bluetooth o cómo evaluar la seguridad de un dispositivo Bluetooth, consulta nuestra página web de metodología BSAM:
