
PoC para grabar audio desde un dispositivo Bluetooth

Este repositorio contiene la implementación de una prueba de concepto para grabar y reproducir audio de un dispositivo Bluetooth sin que el usuario legítimo lo perciba.
La PoC fue demostrada durante la charla BSAM: Seguridad en Bluetooth en la RootedCON 2024 en Madrid.
Está diseñada para concienciar sobre el uso inseguro de los dispositivos Bluetooth y la necesidad de una metodología consistente para las 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 emparejamiento sin requerir interacción del usuario y expone su funcionalidad a cualquier agente dentro del rango de la 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:
bluetoothctlbtmgmtpactlparecordpaplayEn 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 de la pila 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 detectable y conectable mediante Bluetooth.
Por ejemplo, para que sean detectables y conectables, los auriculares utilizados 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 este ajuste se puede modificar en la aplicación de configuración.
Además, asegúrate de que el dispositivo no esté ya conectado o, alternativamente, de que soporte múltiples conexiones.
En primer lugar, se debe descubrir la dirección del dispositivo utilizando una herramienta como bluetoothctl:
$ bluetoothctl
[bluetooth]# scan on
Una vez descubierta la dirección del dispositivo, el script puede encargarse del resto:
$ python BlueSpy.py -a <dirección>
Nota: El script podría solicitar permisos de superusuario para modificar la configuración de tu instancia de BlueZ y emparejarla con el dispositivo remoto.
BlueSpy.py es el script principal que ejecuta cada paso del proceso. Sin embargo, si encuentras problemas con alguna de las fases, puede ser útil ejecutarlas individualmente:
pair.py utiliza la herramienta de línea de comandos btmgmt para modificar la configuración de tu BlueZ e iniciar un proceso de emparejamiento con el dispositivo remoto. Los comandos exactos utilizados están en la función pair dentro de core.py.connect.py utiliza la herramienta de línea de comandos bluetoothctl para iniciar un escaneo rápido (necesario para BlueZ) y establecer una conexión con el dispositivo. Los comandos exactos utilizados están en la función connect dentro de core.py.just_record.py utiliza las herramientas de línea de comandos pactl y parecord para buscar el dispositivo en las fuentes de audio del sistema (debe funcionar como micrófono) e iniciar una sesión de grabación. Los comandos exactos utilizados están en la función record dentro de .Si encuentras problemas con alguna de las fases, examina los comandos en core.py e intenta ejecutarlos en una shell. Esto proporcionará más información sobre lo que puede estar fallando.
Si tienes alguna pregunta sobre cómo funciona el estándar Bluetooth o cómo evaluar la seguridad de un dispositivo Bluetooth, consulta la página web de nuestra metodología BSAM:
core.pyplayback dentro de core.py ejecuta paplay para reproducir el audio capturado.