
Überwachen Sie die Bluetooth-Aktivität in Ihrer Nachbarschaft
Bluetooth Neighborhood – Verfolge BLE-Geräte in deiner Umgebung und analysiere Verkehrsmuster.
WARNUNG: Alpha-Software
Dieses Projekt befindet sich in einer frühen Entwicklungsphase und ist nicht für den Produktiveinsatz geeignet. Funktionen können sich ändern, fehlschlagen oder ohne Vorankündigung entfernt werden. Nutzung auf eigenes Risiko. Gesammelte Daten sollten als experimentell betrachtet werden.
Hauptdashboard mit Geräteliste, Filterung, Suche und Echtzeitstatistiken
Tab-basierte Konfigurationsseite – Alerts, Operations, Groups und Security
Intel-Seite mit Projektinformationen und Funktionsübersicht
Dieses Projekt wurde durch die WhisperPair-Schwachstelle (CVE-2025-36911) inspiriert, die Datenschutzrisiken bei Bluetooth-Geräten aufgezeigt hat.
Tausende Bluetooth-Geräte umgeben uns ständig: Telefone, Autos, Fernseher, Kopfhörer, Hörgeräte, Lieferfahrzeuge und mehr. Bluehood demonstriert, wie einfach es ist, diese Geräte passiv zu erkennen und Muster in ihrer Anwesenheit zu beobachten.
Mit genügend Daten könnte man potenziell:
Diese Metadaten können überraschend persönliche Informationen preisgeben, ohne dass eine aktive Interaktion mit den Geräten erforderlich ist.
Bluehood ist ein Bildungswerkzeug, um das Bewusstsein für Bluetooth-Datenschutz zu schärfen. Es ist ein Wochenendprojekt, aber die Implikationen sind es wert, darüber nachzudenken.
Bluehood ist ein Bluetooth-Scanner, der:
? zum Anzeigen)Voraussetzungen – nur Linux-Hosts
Bluehood kommuniziert mit deinem Bluetooth-Adapter über BlueZ, den Linux-Bluetooth-Stack. BlueZ muss auf dem Host installiert und laufen, bevor der Container gestartet wird – das Docker-Image selbst enthält es nicht.
# Debian / Ubuntu (einschließlich Ubuntu Server) sudo apt install bluez sudo systemctl enable --now bluetooth # Arch Linux sudo pacman -S bluez bluez-utils sudo systemctl enable --now bluetoothOhne BlueZ auf dem Host siehst du einen Fehler wie:
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
Das Docker-Image ist auf der GitHub Container Registry verfügbar:
ghcr.io/dannymcc/bluehood:latest
Das Web-Dashboard ist unter http://localhost:8080 verfügbar
sudo apt install bluez && sudo systemctl enable --now bluetooth)Hinweis: Ältere Adapter (Bluetooth 2.x/3.x) unterstützen kein BLE-Scannen. Wenn dein Adapter die BLE-Central-Rolle nicht unterstützt, siehst du:
No Bluetooth adapters with BLE 'central' role found.
Hinweis: Docker läuft im privilegierten Modus mit Host-Netzwerk für den Bluetooth-Zugriff. Dies ist für BLE-Scannen erforderlich.
Bluehood erfordert einen BLE-fähigen Bluetooth-Adapter (Bluetooth 4.0 oder neuer) mit Central-Rollenunterstützung. Ältere Bluetooth 2.x/3.x-Adapter unterstützen kein BLE-Scannen und funktionieren nicht.
Wenn dein Adapter die BLE-Central-Rolle nicht unterstützt, beendet sich Bluehood mit:
No Bluetooth adapters with BLE 'central' role found
Du kannst die Fähigkeiten deines Adapters mit bluetoothctl show überprüfen und nach central in den unterstützten Rollen suchen.
# 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 .
Bluetooth-Scannen erfordert erhöhte Berechtigungen. Wähle eine:
Als root ausführen (am einfachsten):
sudo bluehood
Capabilities an Python vergeben:
sudo setcap 'cap_net_admin,cap_net_raw+eip' $(readlink -f $(which python))
bluehood
systemd-Dienst verwenden (empfohlen für Dauerbetrieb):
sudo cp bluehood.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now bluehood
Bluehood funktioniert nativ auf macOS ohne Docker. macOS verwendet CoreBluetooth anstelle von BlueZ, was automatisch von der bleak-Bibliothek gehandhabt wird.
# 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
Das Web-Dashboard ist unter http://localhost:8080 verfügbar
Hinweis: Beim ersten Start fordert macOS dich auf, den Bluetooth-Zugriff zu erlauben. Du musst diese Berechtigung erteilen, damit das Scannen funktioniert.
# 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
Das Dashboard bietet:
/settings#operations)Aktiviere den Screenshot-Modus in der Seitenleiste, um sensible Daten vor dem Teilen von Screenshots zu verschleiern:
AA:BB:XX:XX:XX:XX)Da********)Bluehood kann Push-Benachrichtigungen über ntfy senden, einen kostenlosen Open-Source-Benachrichtigungsdienst. Du kannst den öffentlichen ntfy.sh-Server oder deine eigene selbst gehostete Instanz verwenden.
bluehood-myname-alerts) oder auf deinem eigenen ntfy-Serverhttps://ntfy.sh), deinen Themennamen und ein Zugriffstoken ein, falls dein Server eines erfordert, und aktiviere dann BenachrichtigungenDaten werden in ~/.local/share/bluehood/bluehood.db (SQLite) gespeichert.
Speicherort mit Umgebungsvariablen überschreiben:
BLUEHOOD_DATA_DIR – Verzeichnis für DatendateienBLUEHOOD_DB_PATH – Direkter Pfad zur DatenbankdateiHinweis: Heartbeat- und Bereinigungs-Einstellungen können über die Web-UI (Settings > Operations) oder über Umgebungsvariablen konfiguriert werden. GUI-Werte haben Vorrang vor Umgebungsvariablen.
Bluehood klassifiziert Geräte anhand mehrerer Signale (in Prioritätsreihenfolge):
Moderne Geräte randomisieren ihre MAC-Adressen zum Schutz der Privatsphäre. Bluehood:
Bluehood analysiert Sichtungs-Zeitstempel, um Muster zu erkennen:
Beispielmuster: „Täglich, abends (17:00–21:00 Uhr)", „Werktags, morgens (8:00–12:00 Uhr)"
Bluehood erkennt Geräte, die häufig zusammen innerhalb eines konfigurierbaren Zeitfensters erscheinen. Dies kann aufdecken:
Basierend auf der RSSI-Signalstärke werden Geräte in Näherungszonen klassifiziert:
Verfolgt, wie lange Geräte in Reichweite verbringen, indem Lücken zwischen Sichtungen analysiert werden. Ein konfigurierbarer Lückenschwellenwert (Standard 15 Minuten) bestimmt, wann eine neue „Sitzung" beginnt.
Bluehood kann Metriken für Prometheus-Scraping bereitstellen. Aktivieren durch Setzen der Umgebungsvariable BLUEHOOD_METRICS_PORT oder des CLI-Flags --metrics-port.
# Via environment variable
export BLUEHOOD_METRICS_PORT=9199
# Via CLI
bluehood --metrics-port 9199
Metriken werden unter http://host:9199/metrics bereitgestellt.
Ein importbereites Grafana-Dashboard ist unter grafana/bluehood-dashboard.json enthalten. Importiere es über die Grafana-UI (Dashboards > Import) oder die 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 ist auf dem Host nicht installiert oder läuft nicht. Behebung:
sudo apt install bluez # Debian/Ubuntu
sudo systemctl enable --now bluetooth
docker compose restart
Allgemeine Checkliste:
systemctl status bluetoothbluetoothctl listBeiträge willkommen! Bitte öffne ein Issue oder PR auf GitHub.
MIT-Lizenz – Siehe LICENSE für Details.
Dieses Tool dient nur zu Bildungszwecken. Sei dir der Datenschutzgesetze in deiner Gerichtsbarkeit bewusst, wenn du Bluetooth-Geräte überwachst. Der Autor ist nicht für jeglichen Missbrauch dieser Software verantwortlich.
Erstellt von Danny McClelland
| Variable | Standard | Beschreibung |
|---|
PUID | 1000 | UID für den Container-Benutzer – auf deinen Host-Benutzer abstimmen (id -u) bei Verwendung von Bind-Mounts |
PGID | 1000 | GID für den Container-Benutzer – auf deine Host-Gruppe abstimmen (id -g) bei Verwendung von Bind-Mounts |
TZ | UTC | Container-Zeitzone (z. B. Europe/London) |
BLUEHOOD_ADAPTER | auto | Bluetooth-Adapter für BLE-Scannen (z. B. hci0) |
BLUEHOOD_CLASSIC_ADAPTER | wie BLUEHOOD_ADAPTER | Separater Adapter für Classic-Bluetooth-Scannen (z. B. hci1). Wenn auf einen anderen Adapter gesetzt, laufen BLE- und Classic-Scans gleichzeitig. |
BLUEHOOD_DATA_DIR | /data | Datenbank-Speicherverzeichnis |
BLUEHOOD_PORT | 8080 | Web-Dashboard-Port. Der Container verwendet Host-Netzwerk, also ändere dies (statt eines Port-Mappings), wenn 8080 belegt ist |
BLUEHOOD_NTFY_SERVER | https://ntfy.sh | Basis-URL des ntfy-Servers für Push-Benachrichtigungen; auf eine selbst gehostete Instanz zeigen lassen. Der in der Einstellungsseite gespeicherte Wert hat Vorrang |
BLUEHOOD_METRICS_PORT | deaktiviert | Prometheus-Metriken-Port (z. B. 9199) |
BLUEHOOD_HEARTBEAT_URL | deaktiviert | URL zum POSTen von Heartbeat-Check-ins (z. B. eine healthchecks.io- oder uptime-kuma-Push-URL) |
BLUEHOOD_HEARTBEAT_INTERVAL | 300 | Sekunden zwischen Heartbeat-Check-ins |
BLUEHOOD_PRUNE_DAYS | 0 (deaktiviert) | Automatisches Löschen von Sichtungen, die älter als N Tage sind, um Speicher freizugeben |
BLUEHOOD_PRUNE_MIN_SIGHTINGS | 0 (deaktiviert) | Wenn >0, ganze veraltete Geräte bereinigen (älter als BLUEHOOD_PRUNE_DAYS und mit weniger als N Gesamtsichtungen), anstatt nur alte Sichtungszeilen zu kürzen; überwachte Geräte werden nie bereinigt |
| Taste | Aktion |
|---|
/ | Suchleiste fokussieren |
r | Geräteliste aktualisieren |
c | Kompaktansicht umschalten |
w | Watch für ausgewähltes Gerät umschalten |
Esc | Modal schließen |
? | Tastaturkürzel anzeigen |
| Metrik | Typ | Beschreibung |
|---|
bluehood_scans_total | Counter | Abgeschlossene Scan-Zyklen insgesamt |
bluehood_scan_errors_total | Counter | Scan-Fehler (Label: scan_type) |
bluehood_sightings_total | Counter | Aufgezeichnete Gerätesichtungen insgesamt |
bluehood_new_devices_total | Counter | Neu entdeckte eindeutige Geräte |
bluehood_last_scan_devices | Gauge | Geräte im letzten Scan (Label: scan_type) |
bluehood_devices_total | Gauge | Eindeutige Geräte in der DB (Label: bt_type) |
bluehood_devices_active | Gauge | Geräte, die in den letzten 5 Minuten gesehen wurden |
bluehood_devices_watched | Gauge | Anzahl überwachter Geräte |
bluehood_devices_ignored | Gauge | Anzahl ignorierter Geräte |
bluehood_scan_duration_seconds | Histogram | Dauer des Scan-Zyklus |
bluehood_device_rssi_dbm | Histogram | RSSI-Verteilung von BLE-Geräten |
bluehood_build_info | Info | Versionsinformationen |