
Monitore a atividade Bluetooth da sua vizinhança local.
Bluetooth Neighborhood - Rastreie dispositivos BLE na sua área e analise padrões de tráfego.
AVISO: Software Alpha
Este projeto está em desenvolvimento inicial e não está pronto para uso em produção. Recursos podem mudar, quebrar ou ser removidos sem aviso. Use por sua própria conta e risco. Os dados coletados devem ser tratados como experimentais.
Painel principal mostrando lista de dispositivos com filtragem, pesquisa e estatísticas em tempo real
Página de configuração com abas — Alertas, Operações, Grupos e Segurança
Página de informações com visão geral do projeto e capacidades
Este projeto foi inspirado na vulnerabilidade WhisperPair (CVE-2025-36911), que destacou riscos de privacidade em dispositivos Bluetooth.
Milhares de dispositivos Bluetooth nos cercam o tempo todo: telefones, carros, TVs, fones de ouvido, aparelhos auditivos, veículos de entrega e muito mais. O Bluehood demonstra como é simples detectar passivamente esses dispositivos e observar padrões em sua presença.
Com dados suficientes, você poderia potencialmente:
Esses metadados podem revelar informações surpreendentemente pessoais sem qualquer interação ativa com os dispositivos.
O Bluehood é uma ferramenta educacional para conscientizar sobre privacidade em Bluetooth. É um projeto de fim de semana, mas as implicações merecem reflexão.
Bluehood é um scanner Bluetooth que:
? para visualizar)Pré-requisitos — apenas hosts Linux
O Bluehood comunica-se com seu adaptador Bluetooth via BlueZ, a pilha Bluetooth do Linux. O BlueZ deve estar instalado e em execução no host antes de iniciar o container — a imagem Docker em si não o inclui.
# Debian / Ubuntu (incluindo Ubuntu Server) sudo apt install bluez sudo systemctl enable --now bluetooth # Arch Linux sudo pacman -S bluez bluez-utils sudo systemctl enable --now bluetoothSem o BlueZ no host, você verá um erro como:
BLE scan error: [org.freedesktop.DBus.Error.ServiceUnknown] The name org.bluez was not provided by any .service files
# Create a docker-compose.yml or download the one from this repo
# Then start with Docker Compose
docker compose up -d
# View logs
docker compose logs -f
A imagem Docker está disponível no GitHub Container Registry:
ghcr.io/dannymcc/bluehood:latest
O painel web estará disponível em http://localhost:8080
sudo apt install bluez && sudo systemctl enable --now bluetooth)Nota: Adaptadores mais antigos (Bluetooth 2.x/3.x) não suportam escaneamento BLE. Se seu adaptador não tiver suporte para papel BLE Central, você verá:
No Bluetooth adapters with BLE 'central' role found.
Nota: O Docker é executado em modo privilegiado com rede do host para acesso ao Bluetooth. Isso é necessário para escaneamento BLE.
O Bluehood requer um adaptador Bluetooth compatível com BLE (Bluetooth 4.0 ou posterior) com suporte ao papel Central. Adaptadores Bluetooth 2.x/3.x mais antigos não suportam escaneamento BLE e não funcionarão.
Se seu adaptador não suportar o papel BLE Central, o Bluehood será encerrado com:
No Bluetooth adapters with BLE 'central' role found
Você pode verificar as capacidades do seu adaptador com bluetoothctl show e procurar por central nos papéis suportados.
# Install system dependencies (Arch Linux)
sudo pacman -S bluez bluez-utils python-pip
# Install system dependencies (Debian/Ubuntu)
sudo apt install bluez python3-pip
# Clone and install
git clone https://github.com/dannymcc/bluehood.git
cd bluehood
pip install -e .
O escaneamento Bluetooth requer privilégios elevados. Escolha uma opção:
Executar como root (mais simples):
sudo bluehood
Conceder capacidades ao Python:
sudo setcap 'cap_net_admin,cap_net_raw+eip' $(readlink -f $(which python))
bluehood
Usar serviço systemd (recomendado para sempre ligado):
sudo cp bluehood.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now bluehood
O Bluehood funciona nativamente no macOS sem Docker. O macOS usa CoreBluetooth em vez do BlueZ, o que é tratado automaticamente pela biblioteca bleak.
# Clone the repository
git clone https://github.com/dannymcc/bluehood.git
cd bluehood
# Create a virtual environment
python3 -m venv .venv
source .venv/bin/activate
# Install
pip install -e .
# Run
python -m bluehood.daemon
O painel web estará disponível em http://localhost:8080
Nota: Na primeira execução, o macOS solicitará que você permita o acesso ao Bluetooth. Você deve conceder essa permissão para que o escaneamento funcione.
# Start with web dashboard (default port 8080)
bluehood
# Specify a different port
bluehood --port 9000
# Use a specific Bluetooth adapter
bluehood --adapter hci1
# Use separate adapters for BLE and classic scanning (concurrent)
bluehood --adapter hci0 --classic-adapter hci1
# List available adapters
bluehood --list-adapters
# Disable web dashboard (scanning only)
bluehood --no-web
# Enable Prometheus metrics exporter on port 9199
bluehood --metrics-port 9199
O painel fornece:
/settings#operations)Ative o modo de captura de tela na barra lateral para ofuscar dados sensíveis antes de compartilhar capturas de tela:
AA:BB:XX:XX:XX:XX)Da********)O Bluehood pode enviar notificações push via ntfy.sh, um serviço de notificação gratuito e de código aberto.
bluehood-meu-nome-alertas)Os dados são armazenados em ~/.local/share/bluehood/bluehood.db (SQLite).
Substitua a localização com variáveis de ambiente:
BLUEHOOD_DATA_DIR - Diretório para arquivos de dadosBLUEHOOD_DB_PATH - Caminho direto para o arquivo de banco de dadosNota: As configurações de heartbeat e limpeza podem ser configuradas pela interface web (Configurações > Operações) ou por variáveis de ambiente. Os valores da GUI têm prioridade sobre as variáveis de ambiente.
O Bluehood classifica dispositivos usando múltiplos sinais (em ordem de prioridade):
Dispositivos modernos randomizam seus endereços MAC por privacidade. O Bluehood:
O Bluehood analisa carimbos de data/hora de avistamentos para detectar padrões:
Exemplos de padrões: "Diário, noites (17h-21h)", "Dias úteis, manhã (8h-12h)"
O Bluehood detecta dispositivos que frequentemente aparecem juntos dentro de uma janela de tempo configurável. Isso pode revelar:
Com base na intensidade do sinal RSSI, os dispositivos são classificados em zonas de proximidade:
Rastreia quanto tempo os dispositivos ficam ao alcance analisando lacunas entre avistamentos. Um limite de lacuna configurável (padrão 15 minutos) determina quando uma nova "sessão" começa.
O Bluehood pode expor métricas para coleta pelo Prometheus. Ative definindo a variável de ambiente BLUEHOOD_METRICS_PORT ou a flag CLI --metrics-port.
# Via environment variable
export BLUEHOOD_METRICS_PORT=9199
# Via CLI
bluehood --metrics-port 9199
As métricas são servidas em http://host:9199/metrics.
Um painel do Grafana pronto para importar está incluído em grafana/bluehood-dashboard.json. Importe-o pela interface do Grafana (Dashboards > Import) ou pela API:
curl -X POST "http://localhost:3000/api/dashboards/db" \
-H "Authorization: Bearer <your-api-key>" \
-H "Content-Type: application/json" \
-d "{\"dashboard\": $(cat grafana/bluehood-dashboard.json), \"overwrite\": true}"
bluetoothctl power onbluehood --list-adaptersBLE scan error: org.freedesktop.DBus.Error.ServiceUnknown / The name org.bluez was not provided
O BlueZ não está instalado ou não está em execução no host. Corrija:
sudo apt install bluez # Debian/Ubuntu
sudo systemctl enable --now bluetooth
docker compose restart
Lista de verificação geral:
systemctl status bluetoothbluetoothctl listContribuições são bem-vindas! Por favor, abra uma issue ou PR no GitHub.
Licença MIT - Consulte LICENSE para detalhes.
Esta ferramenta é apenas para fins educacionais. Esteja ciente das leis de privacidade em sua jurisdição ao monitorar dispositivos Bluetooth. O autor não é responsável por qualquer uso indevido deste software.
Criado por Danny McClelland
| Variável | Padrão | Descrição |
|---|
PUID | 1000 | UID do usuário do container — defina para corresponder ao seu usuário host (id -u) ao usar bind mounts |
PGID | 1000 | GID do usuário do container — defina para corresponder ao seu grupo host (id -g) ao usar bind mounts |
TZ | UTC | Fuso horário do container (ex.: Europe/London) |
BLUEHOOD_ADAPTER | auto | Adaptador Bluetooth para escaneamento BLE (ex.: hci0) |
BLUEHOOD_CLASSIC_ADAPTER | mesmo que BLUEHOOD_ADAPTER | Adaptador separado para escaneamento Bluetooth Clássico (ex.: hci1). Quando definido para um adaptador diferente, escaneamentos BLE e Clássico são executados simultaneamente. |
BLUEHOOD_DATA_DIR | /data | Diretório de armazenamento do banco de dados |
BLUEHOOD_METRICS_PORT | desabilitado | Porta de métricas do Prometheus (ex.: 9199) |
BLUEHOOD_HEARTBEAT_URL | desabilitado | URL para enviar check-ins de heartbeat (ex.: uma URL push do healthchecks.io ou uptime-kuma) |
BLUEHOOD_HEARTBEAT_INTERVAL | 300 | Segundos entre check-ins de heartbeat |
BLUEHOOD_PRUNE_DAYS | 0 (desabilitado) | Excluir automaticamente avistamentos mais antigos que N dias para liberar armazenamento |
| Tecla | Ação |
|---|
/ | Focar na barra de pesquisa |
r | Atualizar lista de dispositivos |
c | Alternar visualização compacta |
w | Alternar monitoramento no dispositivo selecionado |
Esc | Fechar modal |
? | Mostrar atalhos de teclado |
| Métrica | Tipo | Descrição |
|---|
bluehood_scans_total | Counter | Total de ciclos de escaneamento concluídos |
bluehood_scan_errors_total | Counter | Erros de escaneamento (rótulo: scan_type) |
bluehood_sightings_total | Counter | Total de avistamentos de dispositivos registrados |
bluehood_new_devices_total | Counter | Novos dispositivos únicos descobertos |
bluehood_last_scan_devices | Gauge | Dispositivos no último escaneamento (rótulo: scan_type) |
bluehood_devices_total | Gauge | Dispositivos únicos no banco de dados (rótulo: bt_type) |
bluehood_devices_active | Gauge | Dispositivos vistos nos últimos 5 minutos |
bluehood_devices_watched | Gauge | Contagem de dispositivos monitorados |
bluehood_devices_ignored | Gauge | Contagem de dispositivos ignorados |
bluehood_scan_duration_seconds | Histogram | Duração do ciclo de escaneamento |
bluehood_device_rssi_dbm | Histogram | Distribuição RSSI de dispositivos BLE |
bluehood_build_info | Info | Informações da versão |