
お住まいの地域のBluetoothアクティビティを監視します
Bluetooth Neighborhood - 周辺のBLEデバイスを追跡し、トラフィックパターンを分析します。
警告: アルファ版ソフトウェア
このプロジェクトは開発の初期段階にあり、本番環境での使用には適していません。機能は予告なく変更、破損、削除される可能性があります。自己責任でご使用ください。収集されたデータは実験的なものとして扱うべきです。
フィルタリング、検索、リアルタイム統計を備えたデバイスリストを表示するメインダッシュボード
タブ形式の設定ページ — アラート、オペレーション、グループ、セキュリティ
プロジェクト情報と機能概要を掲載したIntelページ
このプロジェクトは、Bluetoothデバイスにおけるプライバシーリスクを浮き彫りにしたWhisperPair脆弱性(CVE-2025-36911)に触発されて生まれました。
私たちの周囲には常に何千ものBluetoothデバイスが存在しています。スマートフォン、車、テレビ、ヘッドフォン、補聴器、配送車両など、枚挙にいとまがありません。Bluehoodは、こうしたデバイスを受動的に検出し、その存在パターンを観察することがいかに簡単であるかを示します。
十分なデータがあれば、以下のようなことが可能になるかもしれません:
こうしたメタデータは、デバイスとの能動的なやり取りを一切行わずに、驚くほど個人的な情報を明らかにする可能性があります。
Bluehoodは、Bluetoothプライバシーに関する意識を高めるための教育ツールです。 週末プロジェクトではありますが、その意味するところは考える価値があります。
Bluehoodは、以下のことを行うBluetoothスキャナーです:
?を押して表示)前提条件 — Linuxホストのみ
Bluehoodは、LinuxのBluetoothスタックであるBlueZを介してBluetoothアダプターと通信します。コンテナを起動する前に、BlueZがホストにインストールされ、実行されている必要があります — Dockerイメージ自体には含まれていません。
# Debian / Ubuntu (Ubuntu Serverを含む) sudo apt install bluez sudo systemctl enable --now bluetooth # Arch Linux sudo pacman -S bluez bluez-utils sudo systemctl enable --now bluetoothホストにBlueZがない場合、次のようなエラーが表示されます:
BLE scan error: [org.freedesktop.DBus.Error.ServiceUnknown] The name org.bluez was not provided by any .service files
# docker-compose.ymlを作成するか、このリポジトリからダウンロードしてください
# その後、Docker Composeで起動します
docker compose up -d
# ログを表示
docker compose logs -f
DockerイメージはGitHub Container Registryで入手できます:
ghcr.io/dannymcc/bluehood:latest
Webダッシュボードは**http://localhost:8080**で利用可能になります
sudo apt install bluez && sudo systemctl enable --now bluetooth)注: 古いアダプター(Bluetooth 2.x/3.x)はBLEスキャンをサポートしていません。アダプターがBLE Centralロールのサポートを欠いている場合、次のように表示されます:
No Bluetooth adapters with BLE 'central' role found。
注: DockerはBluetoothアクセスのために特権モードとホストネットワーキングで実行されます。これはBLEスキャンに必要です。
Bluehoodには、CentralロールをサポートするBLE対応Bluetoothアダプター(Bluetooth 4.0以降)が必要です。古いBluetooth 2.x/3.xアダプターはBLEスキャンをサポートしておらず、動作しません。
アダプターがBLE Centralロールをサポートしていない場合、Bluehoodは次のように終了します:
No Bluetooth adapters with BLE 'central' role found
アダプターの機能はbluetoothctl showで確認でき、サポートされているロールにcentralがあるかを探してください。
# システム依存関係をインストール (Arch Linux)
sudo pacman -S bluez bluez-utils python-pip
# システム依存関係をインストール (Debian/Ubuntu)
sudo apt install bluez python3-pip
# クローンしてインストール
git clone https://github.com/dannymcc/bluehood.git
cd bluehood
pip install -e .
Bluetoothスキャンには昇格された権限が必要です。いずれかを選択してください:
rootとして実行(最も簡単):
sudo bluehood
Pythonにケイパビリティを付与:
sudo setcap 'cap_net_admin,cap_net_raw+eip' $(readlink -f $(which python))
bluehood
systemdサービスを使用(常時稼働に推奨):
sudo cp bluehood.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now bluehood
BluehoodはDockerなしでmacOS上でネイティブに動作します。macOSはBlueZの代わりにCoreBluetoothを使用し、これはbleakライブラリによって自動的に処理されます。
# リポジトリをクローン
git clone https://github.com/dannymcc/bluehood.git
cd bluehood
# 仮想環境を作成
python3 -m venv .venv
source .venv/bin/activate
# インストール
pip install -e .
# 実行
python -m bluehood.daemon
Webダッシュボードは**http://localhost:8080**で利用可能になります
注: 初回実行時、macOSはBluetoothアクセスを許可するよう促します。スキャンを機能させるにはこの権限を付与する必要があります。
# Webダッシュボード付きで起動 (デフォルトポート8080)
bluehood
# 別のポートを指定 (またはBLUEHOOD_PORTを設定)
bluehood --port 9000
# 特定のBluetoothアダプターを使用
bluehood --adapter hci1
# BLEとClassicスキャンに別々のアダプターを使用 (同時実行)
bluehood --adapter hci0 --classic-adapter hci1
# 利用可能なアダプターを一覧表示
bluehood --list-adapters
# Webダッシュボードを無効化 (スキャンのみ)
bluehood --no-web
# ポート9199でPrometheusメトリクスエクスポーターを有効化
bluehood --metrics-port 9199
ダッシュボードは以下を提供します:
/settings#operations)サイドバーからスクリーンショットモードを有効にすると、スクリーンショットを共有する前に機密データを難読化できます:
AA:BB:XX:XX:XX:XX)Da********)Bluehoodは、無料のオープンソース通知サービスであるntfyを介してプッシュ通知を送信できます。公開ntfy.shサーバーまたは独自のセルフホストインスタンスを使用できます。
bluehood-myname-alerts)または独自のntfyサーバーでトピックを作成https://ntfy.sh)、トピック名、サーバーが要求する場合はアクセストークンを入力し、通知を有効化データは~/.local/share/bluehood/bluehood.db(SQLite)に保存されます。
環境変数で場所を上書きできます:
BLUEHOOD_DATA_DIR - データファイル用のディレクトリBLUEHOOD_DB_PATH - データベースファイルへの直接パス注: ハートビートと削除の設定は、Web UI(設定 > オペレーション)または環境変数から設定できます。GUIの値が環境変数より優先されます。
Bluehoodは複数のシグナルを使用してデバイスを分類します(優先順):
現代のデバイスはプライバシーのためにMACアドレスをランダム化します。Bluehoodは:
Bluehoodは目撃のタイムスタンプを分析してパターンを検出します:
パターンの例: 「毎日、夕方(17時〜21時)」、「平日、朝(8時〜12時)」
Bluehoodは、設定可能な時間枠内で頻繁に一緒に現れるデバイスを検出します。これは以下を明らかにする可能性があります:
RSSI信号強度に基づいて、デバイスは近接ゾーンに分類されます:
目撃間のギャップを分析することで、デバイスが範囲内に滞在する時間を追跡します。設定可能なギャップしきい値(デフォルト15分)が、新しい「セッション」がいつ始まるかを決定します。
BluehoodはPrometheusスクレイピング用のメトリクスを公開できます。BLUEHOOD_METRICS_PORT環境変数または--metrics-port CLIフラグを設定して有効化します。
# 環境変数経由
export BLUEHOOD_METRICS_PORT=9199
# CLI経由
bluehood --metrics-port 9199
メトリクスはhttp://host:9199/metricsで提供されます。
すぐにインポートできるGrafanaダッシュボードがgrafana/bluehood-dashboard.jsonに含まれています。Grafana UI(Dashboards > Import)または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がホストにインストールされていないか、実行されていません。修正方法:
sudo apt install bluez # Debian/Ubuntu
sudo systemctl enable --now bluetooth
docker compose restart
一般的なチェックリスト:
systemctl status bluetoothbluetoothctl listコントリビューションを歓迎します! GitHubでissueまたはPRを作成してください。
MIT License - 詳細はLICENSEを参照してください。
このツールは教育目的のみを意図しています。Bluetoothデバイスを監視する際は、お住まいの地域のプライバシー法にご注意ください。作者は本ソフトウェアのいかなる誤用についても責任を負いません。
Created by Danny McClelland
| Variable | Default | Description |
|---|
PUID | 1000 | コンテナユーザーのUID — バインドマウントを使用する場合はホストユーザー(id -u)に合わせて設定 |
PGID | 1000 | コンテナユーザーのGID — バインドマウントを使用する場合はホストグループ(id -g)に合わせて設定 |
TZ | UTC | コンテナのタイムゾーン(例: Europe/London) |
BLUEHOOD_ADAPTER | auto | BLEスキャン用のBluetoothアダプター(例: hci0) |
BLUEHOOD_CLASSIC_ADAPTER | BLUEHOOD_ADAPTERと同じ | Classic Bluetoothスキャン用の別アダプター(例: hci1)。別のアダプターに設定すると、BLEとClassicのスキャンが同時に実行されます。 |
BLUEHOOD_DATA_DIR | /data | データベースの保存ディレクトリ |
BLUEHOOD_PORT | 8080 | Webダッシュボードのポート。コンテナはホストネットワーキングを使用するため、8080が使用中の場合は(ポートマッピングではなく)これを変更してください |
BLUEHOOD_NTFY_SERVER | https://ntfy.sh | プッシュ通知用のntfyサーバーのベースURL。セルフホストインスタンスを指定してください。設定ページで保存された値が優先されます |
BLUEHOOD_METRICS_PORT | disabled | Prometheusメトリクスポート(例: 9199) |
BLUEHOOD_HEARTBEAT_URL | disabled | ハートビートチェックインをPOSTするURL(例: healthchecks.ioやuptime-kumaのプッシュURL) |
BLUEHOOD_HEARTBEAT_INTERVAL | 300 | ハートビートチェックイン間の秒数 |
BLUEHOOD_PRUNE_DAYS | 0 (disabled) | ストレージを解放するために、N日より古い目撃情報を自動削除 |
BLUEHOOD_PRUNE_MIN_SIGHTINGS | 0 (disabled) | 0より大きい場合、古い目撃情報の行のみを削除するのではなく、古いデバイス全体(BLUEHOOD_PRUNE_DAYSより古く、合計目撃回数がN回未満)を削除します。監視対象デバイスは決して削除されません |
| Key | Action |
|---|
/ | 検索バーにフォーカス |
r | デバイスリストを更新 |
c | コンパクトビューを切り替え |
w | 選択したデバイスの監視を切り替え |
Esc | モーダルを閉じる |
? | キーボードショートカットを表示 |
| Metric | Type | Description |
|---|
bluehood_scans_total | Counter | 完了したスキャンサイクルの合計 |
bluehood_scan_errors_total | Counter | スキャンエラー(ラベル: scan_type) |
bluehood_sightings_total | Counter | 記録されたデバイス目撃の合計 |
bluehood_new_devices_total | Counter | 発見された新規ユニークデバイス |
bluehood_last_scan_devices | Gauge | 最後のスキャンでのデバイス数(ラベル: scan_type) |
bluehood_devices_total | Gauge | DB内のユニークデバイス(ラベル: bt_type) |
bluehood_devices_active | Gauge | 過去5分間に観測されたデバイス |
bluehood_devices_watched | Gauge | 監視対象デバイス数 |
bluehood_devices_ignored | Gauge | 無視されたデバイス数 |
bluehood_scan_duration_seconds | Histogram | スキャンサイクルの所要時間 |
bluehood_device_rssi_dbm | Histogram | BLEデバイスのRSSI分布 |
bluehood_build_info | Info | バージョン情報 |