
PoC para gravar áudio de um dispositivo Bluetooth

Este repositório contém a implementação de uma prova de conceito para gravar e reproduzir áudio de um dispositivo Bluetooth sem que o utilizador legítimo tenha conhecimento.
A PoC foi demonstrada durante a palestra BSAM: Seguridad en Bluetooth na RootedCON 2024 em Madrid.
Foi concebida para sensibilizar sobre a utilização insegura de dispositivos Bluetooth e a necessidade de uma metodologia consistente para avaliações de segurança. Esse é o objetivo da BSAM, a Bluetooth Security Assessment Methodology, publicada pela Tarlogic e disponível aqui.
Esta prova de conceito explora o incumprimento do controlo BSAM-PA-05 na metodologia BSAM. Consequentemente, o dispositivo permite o procedimento de emparelhamento sem exigir interação do utilizador e expõe a sua funcionalidade a qualquer agente dentro do alcance do sinal.
Mais informações no nosso blog.
O código é escrito em Python e foi testado com Python 3.11.8, mas utiliza principalmente ferramentas amplamente disponíveis em sistemas Linux.
A PoC utiliza as seguintes ferramentas:
bluetoothctlbtmgmtpactlparecordpaplayEm distribuições Arch Linux, bluetoothctl e btmgmt podem ser instalados com o pacote bluez-utils, enquanto pactl, parecord e paplay estão disponíveis no pacote libpulse.
Para que a PoC funcione, é necessário ter uma instalação funcional da stack Bluetooth BlueZ, disponível no pacote bluez para distribuições Arch Linux. Também é necessária uma instalação funcional de um servidor de áudio compatível com PulseAudio, como o PipeWire, para gravar e reproduzir áudio.
Garanta que o seu dispositivo é capaz de funcionar como fonte de áudio, ou seja, que possui um microfone, e que está detetável e conectável via Bluetooth.
Por exemplo, para estarem detetáveis e conectáveis, os auriculares utilizados durante a palestra devem estar fora da respetiva caixa de carregamento. Por predefinição, só ativam o microfone quando colocados nos ouvidos do utilizador, embora esta definição possa ser ajustada na aplicação de configuração.
Além disso, certifique-se de que o dispositivo não está já ligado ou, em alternativa, de que suporta múltiplas ligações.
Primeiramente, o endereço do dispositivo deve ser descoberto utilizando uma ferramenta como o bluetoothctl:
$ bluetoothctl
[bluetooth]# scan on
Depois de descoberto o endereço do dispositivo, o script pode tratar do resto:
$ python BlueSpy.py -a <address>
Nota: O script pode solicitar permissões de superusuário para modificar a configuração da sua instância BlueZ e emparelhá-la com o dispositivo remoto.
BlueSpy.py é o script principal que executa todos os passos do processo. No entanto, se encontrar problemas em alguma das fases, pode ser útil executá-las individualmente:
pair.py utiliza a ferramenta de linha de comandos btmgmt para modificar a configuração da sua BlueZ e iniciar um processo de emparelhamento com o dispositivo remoto. Os comandos exatos utilizados estão na função pair dentro de core.py.connect.py utiliza a ferramenta de linha de comandos bluetoothctl para iniciar uma pesquisa rápida (necessária para o BlueZ) e estabelecer uma ligação ao dispositivo. Os comandos exatos utilizados estão na função connect dentro de core.py.just_record.py utiliza as ferramentas de linha de comandos pactl e parecord para procurar o dispositivo nas fontes de áudio do sistema (deve funcionar como microfone) e iniciar uma sessão de gravação. Os comandos exatos utilizados estão na função record dentro de core.py.Se encontrar problemas em alguma das fases, examine os comandos em core.py e tente executá-los numa shell. Isto fornecerá mais informações sobre o que pode estar a falhar.
Se tiver alguma dúvida sobre como o padrão Bluetooth funciona ou como avaliar a segurança de um dispositivo Bluetooth, consulte a nossa página da metodologia BSAM:
playback dentro de core.py executa o paplay para reproduzir o áudio capturado.