
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. Funcionalidades podem mudar, quebrar ou ser removidas sem aviso prévio. Use por sua conta e risco. Os dados coletados devem ser tratados como experimentais.
Painel principal mostrando a lista de dispositivos com filtragem, busca 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 detalhes do projeto e visão geral das capacidades
Este projeto foi inspirado na vulnerabilidade WhisperPair (CVE-2025-36911), que destacou riscos à privacidade em dispositivos Bluetooth.
Milhares de dispositivos Bluetooth nos cercam o tempo todo: celulares, 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 a privacidade no Bluetooth. É um projeto de fim de semana, mas as implicações valem a pena ser consideradas.
O Bluehood é um scanner de Bluetooth que:
? para visualizar)Pré-requisitos — apenas hosts Linux
O Bluehood se comunica 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 contêiner — 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 à função 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 o escaneamento BLE.
O Bluehood requer um adaptador Bluetooth compatível com BLE (Bluetooth 4.0 ou posterior) com suporte à função 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 a função BLE Central, o Bluehood encerrará com:
No Bluetooth adapters with BLE 'central' role found
Você pode verificar as capacidades do seu adaptador com bluetoothctl show e procurar por central nas funções suportadas.
# 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 ativo):
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 (or set BLUEHOOD_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 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, um serviço de notificação gratuito e de código aberto. Você pode usar o servidor público ntfy.sh ou sua própria instância auto-hospedada.
bluehood-myname-alerts), ou em seu próprio servidor ntfyhttps://ntfy.sh), o nome do seu tópico e um token de acesso se seu servidor exigir, depois habilite as notificaçõesOs dados são armazenados em ~/.local/share/bluehood/bluehood.db (SQLite).
Substitua o local com variáveis de ambiente:
BLUEHOOD_DATA_DIR - Diretório para arquivos de dadosBLUEHOOD_DB_PATH - Caminho direto para o arquivo do banco de dadosNota: As configurações de heartbeat e remoção podem ser configuradas pela interface web (Configurações > Operações) ou via variáveis de ambiente. Valores da GUI têm prioridade sobre variáveis de ambiente.
O Bluehood classifica dispositivos usando múltiplos sinais (em ordem de prioridade):
Dispositivos modernos aleatorizam seus endereços MAC por privacidade. O Bluehood:
O Bluehood analisa timestamps 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 aparecem frequentemente 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 passam no alcance analisando lacunas entre avistamentos. Um limiar de lacuna configurável (padrão 15 minutos) determina quando uma nova "sessão" começa.
O Bluehood pode expor métricas para coleta do Prometheus. Habilite 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 Grafana pronto para importação 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. Correção:
sudo apt install bluez # Debian/Ubuntu
sudo systemctl enable --now bluetooth
docker compose restart
Checklist geral:
systemctl status bluetoothbluetoothctl listContribuições são bem-vindas! Por favor, abra uma issue ou PR no GitHub.
Licença MIT - Veja LICENSE para detalhes.
Esta ferramenta é apenas para fins educacionais. Esteja atento às 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 para o usuário do contêiner — defina para corresponder ao seu usuário do host (id -u) ao usar bind mounts |
PGID | 1000 | GID para o usuário do contêiner — defina para corresponder ao seu grupo do host (id -g) ao usar bind mounts |
TZ | UTC | Fuso horário do contêiner (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 classic (ex.: hci1). Quando definido para um adaptador diferente, os escaneamentos BLE e classic são executados simultaneamente. |
BLUEHOOD_DATA_DIR | /data | Diretório de armazenamento do banco de dados |
BLUEHOOD_PORT | 8080 | Porta do painel web. O contêiner usa rede do host, então altere isto (em vez de um mapeamento de porta) se a 8080 estiver ocupada |
BLUEHOOD_NTFY_SERVER | https://ntfy.sh | URL base do servidor ntfy para notificações push; aponte para uma instância auto-hospedada. O valor salvo na página de Configurações tem precedência |
BLUEHOOD_METRICS_PORT | desabilitado | Porta de métricas Prometheus (ex.: 9199) |
BLUEHOOD_HEARTBEAT_URL | desabilitado | URL para POST de check-ins de heartbeat (ex.: uma URL de push do healthchecks.io ou uptime-kuma) |
BLUEHOOD_HEARTBEAT_INTERVAL | 300 | Segundos entre check-ins de heartbeat |
BLUEHOOD_PRUNE_DAYS | 0 (desabilitado) | Exclui automaticamente avistamentos mais antigos que N dias para liberar armazenamento |
BLUEHOOD_PRUNE_MIN_SIGHTINGS | 0 (desabilitado) | Quando >0, remove dispositivos obsoletos inteiros (mais antigos que BLUEHOOD_PRUNE_DAYS e com menos de N avistamentos totais) em vez de apenas cortar linhas de avistamentos antigos; dispositivos monitorados nunca são removidos |
| Tecla | Ação |
|---|
/ | Focar na barra de busca |
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 (label: 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 (label: scan_type) |
bluehood_devices_total | Gauge | Dispositivos únicos no BD (label: 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 de RSSI dos dispositivos BLE |
bluehood_build_info | Info | Informações de versão |