
Surveillez l'activité Bluetooth de votre voisinage local
Bluetooth Neighborhood - Suivez les appareils BLE dans votre zone et analysez les schémas de trafic.
AVERTISSEMENT : Logiciel Alpha
Ce projet est en développement précoce et n'est pas prêt pour une utilisation en production. Les fonctionnalités peuvent changer, se briser ou être supprimées sans préavis. Utilisez-le à vos propres risques. Les données collectées doivent être considérées comme expérimentales.
Tableau de bord principal affichant la liste des appareils avec filtrage, recherche et statistiques en temps réel
Page de configuration à onglets — Alertes, Opérations, Groupes et Sécurité
Page Intel avec informations sur le projet et aperçu des capacités
Ce projet a été inspiré par la vulnérabilité WhisperPair (CVE-2025-36911), qui a mis en évidence les risques pour la vie privée des appareils Bluetooth.
Des milliers d'appareils Bluetooth nous entourent à tout moment : téléphones, voitures, téléviseurs, écouteurs, prothèses auditives, véhicules de livraison, etc. Bluehood démontre à quel point il est simple de détecter passivement ces appareils et d'observer les schémas de leur présence.
Avec suffisamment de données, vous pourriez potentiellement :
Ces métadonnées peuvent révéler des informations étonnamment personnelles sans aucune interaction active avec les appareils.
Bluehood est un outil éducatif pour sensibiliser à la confidentialité Bluetooth. C'est un projet de week-end, mais les implications méritent réflexion.
Bluehood est un scanner Bluetooth qui :
? pour les afficher)Prérequis — Hôtes Linux uniquement
Bluehood communique avec votre adaptateur Bluetooth via BlueZ, la pile Bluetooth de Linux. BlueZ doit être installé et en cours d'exécution sur l'hôte avant de démarrer le conteneur — l'image Docker elle-même ne l'inclut pas.
# Debian / Ubuntu (y compris Ubuntu Server) sudo apt install bluez sudo systemctl enable --now bluetooth # Arch Linux sudo pacman -S bluez bluez-utils sudo systemctl enable --now bluetoothSans BlueZ sur l'hôte, vous verrez une erreur comme :
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
L'image Docker est disponible sur GitHub Container Registry :
ghcr.io/dannymcc/bluehood:latest
Le tableau de bord web sera disponible à l'adresse http://localhost:8080
sudo apt install bluez && sudo systemctl enable --now bluetooth)Remarque : Les adaptateurs plus anciens (Bluetooth 2.x/3.x) ne prennent pas en charge le scan BLE. Si votre adaptateur ne prend pas en charge le rôle BLE Central, vous verrez :
No Bluetooth adapters with BLE 'central' role found.
Remarque : Docker s'exécute en mode privilégié avec le réseau de l'hôte pour l'accès Bluetooth. Ceci est requis pour le scan BLE.
Bluehood nécessite un adaptateur Bluetooth compatible BLE (Bluetooth 4.0 ou ultérieur) avec prise en charge du rôle Central. Les adaptateurs Bluetooth 2.x/3.x plus anciens ne prennent pas en charge le scan BLE et ne fonctionneront pas.
Si votre adaptateur ne prend pas en charge le rôle BLE Central, Bluehood se fermera avec :
No Bluetooth adapters with BLE 'central' role found
Vous pouvez vérifier les capacités de votre adaptateur avec bluetoothctl show et rechercher central dans les rôles pris en charge.
# 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 .
Le scan Bluetooth nécessite des privilèges élevés. Choisissez l'une des options :
Exécuter en tant que root (le plus simple) :
sudo bluehood
Accorder les capacités à Python :
sudo setcap 'cap_net_admin,cap_net_raw+eip' $(readlink -f $(which python))
bluehood
Utiliser le service systemd (recommandé pour un fonctionnement continu) :
sudo cp bluehood.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now bluehood
Bluehood fonctionne nativement sur macOS sans Docker. macOS utilise CoreBluetooth au lieu de BlueZ, ce qui est géré automatiquement par la bibliothèque 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
Le tableau de bord web sera disponible à l'adresse http://localhost:8080
Remarque : Au premier lancement, macOS vous demandera d'autoriser l'accès Bluetooth. Vous devez accorder cette permission pour que le scan fonctionne.
# 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
Le tableau de bord fournit :
/settings#operations)Activez le mode capture d'écran depuis la barre latérale pour obscurcir les données sensibles avant de partager des captures d'écran :
AA:BB:XX:XX:XX:XX)Da********)Bluehood peut envoyer des notifications push via ntfy, un service de notification gratuit et open-source. Vous pouvez utiliser le serveur public ntfy.sh ou votre propre instance auto-hébergée.
bluehood-myname-alerts), ou sur votre propre serveur ntfyhttps://ntfy.sh), le nom de votre sujet et un jeton d'accès si votre serveur en exige un, puis activez les notificationsLes données sont stockées dans ~/.local/share/bluehood/bluehood.db (SQLite).
Remplacez l'emplacement avec des variables d'environnement :
BLUEHOOD_DATA_DIR - Répertoire pour les fichiers de donnéesBLUEHOOD_DB_PATH - Chemin direct vers le fichier de base de donnéesRemarque : Les paramètres de heartbeat et d'élagage peuvent être configurés depuis l'interface web (Paramètres > Opérations) ou via des variables d'environnement. Les valeurs de l'interface graphique sont prioritaires sur les variables d'environnement.
Bluehood classe les appareils en utilisant plusieurs signaux (par ordre de priorité) :
Les appareils modernes randomisent leurs adresses MAC pour la confidentialité. Bluehood :
Bluehood analyse les horodatages des observations pour détecter des schémas :
Exemples de schémas : « Quotidien, soirées (17h-21h) », « Jours de semaine, matin (8h-12h) »
Bluehood détecte les appareils qui apparaissent fréquemment ensemble dans une fenêtre temporelle configurable. Cela peut révéler :
En fonction de la force du signal RSSI, les appareils sont classés en zones de proximité :
Suit combien de temps les appareils passent à portée en analysant les écarts entre les observations. Un seuil d'écart configurable (par défaut 15 minutes) détermine quand une nouvelle « session » commence.
Bluehood peut exposer des métriques pour le scraping Prometheus. Activez en définissant la variable d'environnement BLUEHOOD_METRICS_PORT ou l'option CLI --metrics-port.
# Via environment variable
export BLUEHOOD_METRICS_PORT=9199
# Via CLI
bluehood --metrics-port 9199
Les métriques sont servies à http://host:9199/metrics.
Un tableau de bord Grafana prêt à importer est inclus à grafana/bluehood-dashboard.json. Importez-le via l'interface Grafana (Dashboards > Import) ou l'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
BlueZ n'est pas installé ou ne fonctionne pas sur l'hôte. Correction :
sudo apt install bluez # Debian/Ubuntu
sudo systemctl enable --now bluetooth
docker compose restart
Liste de vérification générale :
systemctl status bluetoothbluetoothctl listLes contributions sont les bienvenues ! Veuillez ouvrir une issue ou une PR sur GitHub.
Licence MIT - Voir LICENSE pour plus de détails.
Cet outil est destiné à des fins éducatives uniquement. Soyez attentif aux lois sur la vie privée dans votre juridiction lors de la surveillance d'appareils Bluetooth. L'auteur n'est pas responsable de toute mauvaise utilisation de ce logiciel.
Créé par Danny McClelland
| Variable | Défaut | Description |
|---|
PUID | 1000 | UID pour l'utilisateur du conteneur — à définir pour correspondre à votre utilisateur hôte (id -u) lors de l'utilisation de montages bind |
PGID | 1000 | GID pour l'utilisateur du conteneur — à définir pour correspondre à votre groupe hôte (id -g) lors de l'utilisation de montages bind |
TZ | UTC | Fuseau horaire du conteneur (par ex., Europe/London) |
BLUEHOOD_ADAPTER | auto | Adaptateur Bluetooth pour le scan BLE (par ex., hci0) |
BLUEHOOD_CLASSIC_ADAPTER | identique à BLUEHOOD_ADAPTER | Adaptateur séparé pour le scan Bluetooth classic (par ex., hci1). Lorsqu'il est défini sur un adaptateur différent, les scans BLE et classic s'exécutent simultanément. |
BLUEHOOD_DATA_DIR | /data | Répertoire de stockage de la base de données |
BLUEHOOD_PORT | 8080 | Port du tableau de bord web. Le conteneur utilise le réseau de l'hôte, donc modifiez ceci (plutôt qu'un mappage de port) si 8080 est occupé |
BLUEHOOD_NTFY_SERVER | https://ntfy.sh | URL de base du serveur ntfy pour les notifications push ; pointez-le vers une instance auto-hébergée. La valeur enregistrée dans la page Paramètres est prioritaire |
BLUEHOOD_METRICS_PORT | désactivé | Port des métriques Prometheus (par ex., 9199) |
BLUEHOOD_HEARTBEAT_URL | désactivé | URL pour POSTer les points de contrôle heartbeat (par ex., une URL push healthchecks.io ou uptime-kuma) |
BLUEHOOD_HEARTBEAT_INTERVAL | 300 | Secondes entre les points de contrôle heartbeat |
BLUEHOOD_PRUNE_DAYS | 0 (désactivé) | Supprimer automatiquement les observations plus anciennes que N jours pour libérer du stockage |
BLUEHOOD_PRUNE_MIN_SIGHTINGS | 0 (désactivé) | Lorsque >0, élaguer les appareils obsolètes entiers (plus anciens que BLUEHOOD_PRUNE_DAYS et avec moins de N observations totales) au lieu de simplement supprimer les anciennes lignes d'observation ; les appareils surveillés ne sont jamais élagués |
| Touche | Action |
|---|
/ | Focus sur la barre de recherche |
r | Rafraîchir la liste des appareils |
c | Basculer la vue compacte |
w | Basculer la surveillance sur l'appareil sélectionné |
Esc | Fermer la modale |
? | Afficher les raccourcis clavier |
| Métrique | Type | Description |
|---|
bluehood_scans_total | Counter | Total des cycles de scan terminés |
bluehood_scan_errors_total | Counter | Erreurs de scan (label : scan_type) |
bluehood_sightings_total | Counter | Total des observations d'appareils enregistrées |
bluehood_new_devices_total | Counter | Nouveaux appareils uniques découverts |
bluehood_last_scan_devices | Gauge | Appareils lors du dernier scan (label : scan_type) |
bluehood_devices_total | Gauge | Appareils uniques dans la base de données (label : bt_type) |
bluehood_devices_active | Gauge | Appareils vus dans les 5 dernières minutes |
bluehood_devices_watched | Gauge | Nombre d'appareils surveillés |
bluehood_devices_ignored | Gauge | Nombre d'appareils ignorés |
bluehood_scan_duration_seconds | Histogram | Durée du cycle de scan |
bluehood_device_rssi_dbm | Histogram | Distribution RSSI des appareils BLE |
bluehood_build_info | Info | Informations de version |