
Ferramenta de avaliação de segurança Bluetooth sem dongle e sem root para fones de ouvido sem fio afetados pela cadeia de vulnerabilidades do SDK Airoha (CVE-2025-20700/20701/20702)
Version 1.0.0
Ferramenta de avaliação de segurança Bluetooth para fones de ouvido sem fio afetados pela cadeia de vulnerabilidades do SDK Airoha (CVE-2025-20700 / CVE-2025-20701 / CVE-2025-20702). Escaneia dispositivos próximos, identifica chipsets Airoha conhecidos como afetados e testa acesso GATT não autenticado e acessibilidade do protocolo RACE - inteiramente através da pilha Bluetooth do sistema operacional (BlueZ) via bleak. Nenhum dongle Bluetooth externo é necessário e root não é necessário. Os resultados são relatados em linguagem simples junto com os detalhes técnicos, para que você possa agir sem conhecimento profundo de Bluetooth.
Esta ferramenta é para avaliar dispositivos que você possui ou para os quais tem autorização explícita para testar. Os testes GATT e RACE são operações ativas: eles conectam e enviam comandos ao dispositivo alvo. Não execute --gatt, --race, --firmware, --bd-address, --assess, --baseline, --check-drift ou --memory-read contra um dispositivo que não seja seu ou para o qual você não tenha permissão para testar. --scan é passivo e apenas escuta anúncios já transmitidos publicamente, portanto é seguro executar contra qualquer coisa ao alcance.
--memory-read vai um passo além das outras sondas ativas: ele recupera uma página real, somente leitura (256 bytes) do conteúdo real da flash do dispositivo, em um endereço fixo, como uma confirmação definitiva do CVE-2025-20702 quando a sonda --race (apenas de acessibilidade) não obtém resposta. É somente leitura (leituras de flash não apresentam risco de desgaste ou brick, ao contrário de comandos de gravação/apagamento/FOTA, que esta ferramenta nunca envia), opt-in, e requer sua própria confirmação separada além do prompt de propriedade padrão, descrevendo exatamente o que faz antes de executar qualquer coisa.
Sondar um dispositivo próximo arbitrário não é apenas uma questão de política - pode ter efeitos colaterais reais. --gatt tenta uma leitura ou inscrição de notificação em cada característica que encontra, e alguns dispositivos de consumo expõem serviços do tipo provisionamento (ex.: serviço Google Fast Pair) que reagem iniciando um handshake de emparelhamento real no dispositivo alvo, independentemente de qualquer coisa que esta ferramenta solicite explicitamente. Uma característica que requer criptografia pode desencadear a mesma coisa até mesmo contra seu próprio dispositivo, já que o BlueZ pode rotear silenciosamente essa solicitação de autenticação para qualquer agente que seu desktop tenha registrado (ex.: prompt de emparelhamento do KDE) - portanto, cada comando ativo também registra seu próprio agente BlueZ temporário que rejeita automaticamente qualquer solicitação desse tipo durante a sonda, para que nenhum prompt de emparelhamento possa aparecer. Cada comando ativo também ainda solicita confirmação de que o endereço alvo é seu antes de fazer qualquer coisa no rádio; passe --yes para pular o prompt para uso scriptado depois que você já confirmou que é seu dispositivo:
buds_audit.py --assess --target AA:BB:CC:DD:EE:FF --yes
--watch é passivo, como --scan - apenas escuta anúncios já transmitidos e nunca se conecta a nada, portanto não solicita confirmação.
python3 -m venv venv
venv/bin/pip install -r requirements.txt
Requer Python 3.10+ (desenvolvido contra 3.14) e um sistema Linux rodando BlueZ com um adaptador Bluetooth ligado.
Apenas Linux, e não automaticamente todo sistema Linux:
bleak tem um backend Windows, mas esta ferramenta não depende apenas do bleak - a descoberta Bluetooth Classic (core/scanner.py) e as verificações de estado de vinculação (core/gatt.py) ambos chamam diretamente bluetoothctl, uma ferramenta de linha de comando exclusiva do BlueZ que não existe no Windows. Esses caminhos de código simplesmente falhariam com 'comando não encontrado'.bluetoothctl no PATH, não apenas qualquer kernel Linux. A maioria das distribuições desktop inclui isso; uma imagem mínima ou servidor sem o pacote bluez instalado não terá isso de fábrica. Verificado sem root no BlueZ 5.86 - outras versões devem funcionar da mesma forma, já que bleak tem como alvo a API D-Bus padrão do BlueZ, mas isso não foi verificado independentemente novamente.usbipd-win, que apenas encaminha adaptadores conectados por USB. A maioria dos Bluetooth embutidos em laptops é conectada por um barramento não USB (SDIO/PCIe, junto com Wi-Fi), que usbipd-win geralmente não consegue encaminhar - portanto, isso depende inteiramente do hardware específico.Você não precisa de uma máquina Linux própria - você só precisa de Linux com acesso real a um rádio Bluetooth. Duas maneiras práticas de conseguir isso:
De qualquer forma, a regra é a mesma: a ferramenta em si não muda - ela só precisa de Linux com um adaptador Bluetooth que o BlueZ possa realmente alcançar.
Muitos fones de ouvido TWS param de anunciar (e encerram qualquer conexão ativa) após um período de inatividade para economizar energia, e alguns desligam completamente por conta própria. Se uma varredura não encontrar um dispositivo que encontrou há um minuto, ou uma sonda falhar no meio do caminho, geralmente é os fones entrando em espera, não um bug - tire-os do estojo ou pressione o botão de emparelhamento novamente e tente novamente.
Isso também afeta a estabilidade do endereço: a unidade de teste confirmada deste projeto (um Sony WF-1000XM3) manteve o mesmo endereço BLE em todos os ciclos de energia testados, o que é esperado para fones de ouvido projetados para reconexão via aplicativo complementar - eles geralmente usam um endereço BLE fixo/público em vez de um rotativo (diferente de telefones, que rotacionam endereços privados e não são um alvo adequado para esta ferramenta por esse motivo). Isso não é garantido para todos os modelos de fones, no entanto - alguns fabricantes usam endereços privados resolvíveis mesmo no modo de pré-emparelhamento/reconexão, o que apareceria como um endereço diferente após cada ciclo de energia para um scanner não pareado como esta ferramenta.