
A implementação oficial de referência e verificação de vulnerabilidade do nosso ataque WhisperPair (CVE-2025-36911), que afeta o protocolo Fast Pair da Google.
Uma ferramenta prática para testar se dispositivos Google Fast Pair são vulneráveis a ataques de emparelhamento, vinculação de conta e ao nível do protocolo.
Este repositório fornece o harness de testes WhisperPair, uma ferramenta para avaliar a segurança de dispositivos Google Fast Pair. Foi concebido tanto para investigadores como para profissionais, permitindo reproduzir as nossas descobertas e testar os seus próprios dispositivos.
Para uma visão geral do projeto, dispositivos afetados e contexto adicional, visite o nosso site.
Este repositório contém também o artefacto do artigo One Tap to Hijack Them All: A Security Analysis of the Google Fast Pair Protocol, apresentado na IEEE S&P 2026.
A versão completa do artigo pode ser encontrada aqui. Se considerar este trabalho útil, agradecemos que cite o artigo:
@inproceedings{whisperpair2026,
title = {One Tap to Hijack Them All: A Security Analysis of the Google Fast Pair Protocol},
author = {Duttagupta, Sayon and Wyns, Seppe and Antonijević, Nikola and Singelée, Dave and Preneel, Bart},
booktitle = {2026 IEEE Symposium on Security and Privacy (S\&P)},
year = {2026},
}
Os materiais são fornecidos para permitir a reprodutibilidade da nossa avaliação e para auxiliar investigadores na realização de testes defensivos. Utilize estes materiais apenas para investigação de segurança autorizada e verificação defensiva em dispositivos que possua ou para os quais tenha permissão explícita de teste. Como o código neste repositório demonstra vulnerabilidades em acessórios de consumo, não o utilize para atacar dispositivos de terceiros sem autorização escrita clara. Os autores realizaram todas as experiências em dispositivos pertencentes à equipa do projeto ou doados com consentimento informado. Ao executar estas ferramentas, concorda em utilizá-las apenas para investigação defensiva, reprodução dos nossos resultados ou autoteste de dispositivos.
[!NOTE] Resumo: certifique-se de que tem uma máquina Linux com um adaptador Bluetooth e que o Node.js (LTS) e o pnpm estão instalados.
Pode executar a interface e o servidor na mesma máquina executandobash build.shseguido debash start.sh.
Este repositório contém um harness de testes para avaliar se um dispositivo alvo implementa corretamente determinados requisitos de segurança do Google Fast Pair. O harness pode testar se o predicado de estado de emparelhamento está corretamente implementado, se mensagens com nonces reutilizados são rejeitadas e se o dispositivo é vulnerável a um ataque de curva inválida. O harness é composto por um servidor backend e uma interface web frontend.
[!NOTE] Se procura a implementação específica dos ataques:
./toolkit-server/src/fast-pair-service.tse./toolkit-server/src/protocol.tscontêm a implementação dos ataques e do protocolo Fast Pair.
O toolkit é composto por dois componentes: o servidor e a interface.
O servidor tem de ser executado num sistema Linux e foi testado com um Raspberry Pi 4.
A interface é um frontend Next.js que pode ser usado para controlar o servidor e pode ser executado em qualquer sítio onde o Node.js seja suportado.
A interface tem de conseguir ligar-se ao servidor através da rede.
Testámos o harness com Raspberry Pi OS Lite (64 bits) (6.12.47+rpt-rpi-v8), BlueZ versão 5.82.
Uma máquina Linux com BlueZ, Node.js e pnpm instalados.
Recomendamos vivamente a utilização da versão atual de Suporte de Longo Prazo (LTS) do Node.js (v24.14.0).
Garantimos que o toolkit funciona com esta versão.
Versões mais antigas podem funcionar até à v18, mas é provável que versões mais antigas falhem ou produzam resultados inesperados.
nvm.shSe utiliza nvm para gerir as suas versões do Node.js, tem de se certificar de que o utilizador root também tem acesso à versão do Node.js gerida pelo nvm.
Conforme explicado em esta publicação no StackOverflow, poderá ter de criar uma nova ligação simbólica.
# Source - https://stackoverflow.com/a/40078875
# Posted by SimpleJ, modified by community. See post 'Timeline' for change history
# Retrieved 2026-03-30, License - CC BY-SA 4.0
sudo ln -s "$NVM_DIR/versions/node/$(nvm version)/bin/node" "/usr/local/bin/node"
sudo ln -s "$NVM_DIR/versions/node/$(nvm version)/bin/npm" "/usr/local/bin/npm"
sudo ln -s "$NVM_DIR/versions/node/$(nvm version)/bin/npx" "/usr/local/bin/npx"
[!NOTE] Para executar o servidor, só precisa de criar a ligação para
node.
Se o Node.js também estiver instalado através de um gestor de pacotes externo, a versão disponível para sudo pode ser diferente da utilizada pelo nvm.
Pode verificar isto comparando o resultado de node -v e sudo node -v.
Embora recomendemos o Node.js LTS v24, o servidor deve funcionar corretamente até à v18.
pnpmSe o Node.js v24 LTS estiver instalado, deverá conseguir ativar o pnpm com o seguinte comando:
corepack enable
O harness também requer hcitool e l2ping.
Dependendo da sua distribuição Linux, o hcitool pode não estar disponível. Poderá ter de instalar o bluez-deprecated-tools.
Na versão mais recente do Raspberry Pi OS Lite à data de escrita, continua pré-instalado. (1 de outubro de 2025)
Se o adaptador Bluetooth não estiver ligado, o servidor tentará utilizar o rfkill para o ativar.
Testar a extensão Audio Switch requer o rfcomm.
[!NOTE] O servidor verificará a disponibilidade destas ferramentas no arranque. Informações adicionais sobre funcionalidades que possam não estar disponíveis serão apresentadas na consola.
Reproduzir os resultados requer acesso físico a um dispositivo vulnerável.
Tenha em atenção que a maioria dos fabricantes já lançou atualizações de software para o WhisperPair, pelo que poderá necessitar de dispositivos com firmware desatualizado.
Consulte Selecionar um dispositivo para obter mais informações sobre os dispositivos que utilizámos na nossa avaliação.
Se pretender executar a interface e o servidor na mesma máquina (Linux), pode utilizar os scripts build.sh e start.sh.
Primeiro, instale as dependências necessárias e compile os componentes com:
bash build.sh
Certifique-se de que o Bluetooth está ativado:
sudo rfkill unblock bluetooth
Em seguida, execute a interface e o servidor com:
bash start.sh
A interface deverá estar agora acessível em http://localhost:3000.