
PoC pour enregistrer l'audio d'un appareil Bluetooth

Ce dépôt contient l'implémentation d'une preuve de concept permettant d'enregistrer et de rejouer l'audio d'un appareil Bluetooth sans que l'utilisateur légitime ne s'en aperçoive.
La preuve de concept a été présentée lors de la conférence BSAM: Seguridad en Bluetooth à la RootedCON 2024 à Madrid.
Elle vise à sensibiliser à l'utilisation non sécurisée des appareils Bluetooth et à la nécessité d'une méthodologie cohérente pour les évaluations de sécurité. C'est l'objectif de BSAM, la méthodologie d'évaluation de la sécurité Bluetooth, publiée par Tarlogic et disponible ici.
Cette preuve de concept exploite le non-respect du contrôle BSAM-PA-05 au sein de la méthodologie BSAM. Par conséquent, l'appareil autorise la procédure d'appairage sans nécessiter d'interaction de l'utilisateur et expose ses fonctionnalités à tout agent situé dans la portée du signal.
Plus d'informations sur notre blog.
Le code est écrit en Python et a été testé avec Python 3.11.8, mais il utilise principalement des outils largement disponibles sur les systèmes Linux.
La preuve de concept utilise les outils suivants :
bluetoothctlbtmgmtpactlparecordpaplaySur les distributions Arch Linux, bluetoothctl et btmgmt peuvent être installés avec le paquet bluez-utils, tandis que pactl, parecord et paplay sont disponibles dans le paquet libpulse.
Pour que la preuve de concept fonctionne, il est nécessaire d'avoir une installation fonctionnelle de la pile Bluetooth BlueZ, disponible dans le paquet bluez pour les distributions Arch Linux. Une installation fonctionnelle d'un serveur audio compatible avec PulseAudio, tel que PipeWire, est également requise pour enregistrer et lire l'audio.
Assurez-vous que votre appareil est capable de fonctionner comme source audio, c'est-à-dire qu'il dispose d'un microphone, et qu'il est détectable et connectable via Bluetooth.
Par exemple, pour être détectables et connectables, les écouteurs utilisés lors de la conférence doivent être sortis de leur boîtier de charge. Par défaut, ils n'activent le microphone que lorsqu'ils sont placés dans les oreilles de l'utilisateur, bien que ce réglage puisse être ajusté dans l'application de configuration.
De plus, assurez-vous que l'appareil n'est pas déjà connecté ou, à défaut, qu'il prend en charge plusieurs connexions.
Tout d'abord, l'adresse de l'appareil doit être découverte à l'aide d'un outil tel que bluetoothctl :
$ bluetoothctl
[bluetooth]# scan on
Une fois l'adresse de l'appareil découverte, le script peut gérer le reste :
$ python BlueSpy.py -a <adresse>
Remarque : Le script peut demander des permissions de superutilisateur pour modifier la configuration de votre instance BlueZ et l'appairer avec l'appareil distant.
BlueSpy.py est le script principal qui exécute chaque étape du processus. Cependant, si vous rencontrez des problèmes avec l'une des phases, il peut être utile de les exécuter individuellement :
pair.py utilise l'outil en ligne de commande btmgmt pour modifier la configuration de votre BlueZ et initier un processus d'appairage avec l'appareil distant. Les commandes exactes utilisées se trouvent dans la fonction pair de core.py.connect.py utilise l'outil en ligne de commande bluetoothctl pour lancer un balayage rapide (nécessaire pour BlueZ) et établir une connexion à l'appareil. Les commandes exactes utilisées se trouvent dans la fonction connect de core.py.just_record.py utilise les outils en ligne de commande pactl et parecord pour rechercher l'appareil dans les sources audio du système (il doit fonctionner comme microphone) et lancer une session d'enregistrement. Les commandes exactes utilisées se trouvent dans la fonction record de .Si vous rencontrez des problèmes avec l'une des phases, examinez les commandes dans core.py et essayez de les exécuter dans un shell. Cela fournira plus d'informations sur ce qui peut échouer.
Si vous avez des questions concernant le fonctionnement de la norme Bluetooth ou la manière d'évaluer la sécurité d'un appareil Bluetooth, veuillez consulter notre page Web sur la méthodologie BSAM :
core.pyplayback dans core.py exécute paplay pour rejouer l'audio capturé.