Bluehood — BLEスキャナーで見るBluetoothプライバシー
ラズベリーパイ1台で隣人の通勤パターンまで把握可能?
Bluetoothを常にオンにして生活するのが当たり前の時代だ。スマートフォン、イヤホン、スマートウォッチ、車 — すべてが常にBLE信号をブロードキャストしている。Bluehoodはこれらの信号を収集し、「Bluetoothがオンだとどんな情報が漏れるのか」を直接見せるPythonプロジェクトだ。
何を検出できるか
Bluehoodをパッシブモードで動かすとこんなことがわかる:
配達員の到着時刻と同じ配達員かどうか(同じBLEデバイスの繰り返し出現)
隣人の通勤パターン(毎日同じ時間に消えたり現れたりするデバイス)
関連デバイスの組み合わせ(スマートフォン + スマートウォッチ = 同一人物)
訪問者の滞在時間と頻度
ラズベリーパイやノートPC1台で十分。
コード構造分析
Bluehoodのコアは3つのレイヤー:
1. BLEスキャナー(scanner.py)
bleakライブラリでBLE広告パケットを継続収集。BleakScannerのdetection_callbackを登録し、デバイス検出ごとにコールバック実行。MACアドレス、RSSI(信号強度)、デバイス名、メーカー情報、BLEサービスUUIDを抽出。
from bleak import BleakScanner
async def scan():
scanner = BleakScanner(detection_callback=on_device_found)
await scanner.start()
2. データ保存(database.py)
SQLiteに検出記録を保存。テーブル構造はデバイスごとの初検出・最終検出時刻、総検出回数、RSSI履歴を含む。ランダムMACアドレス(最新デバイスのプライバシー機能)はフィルタリングオプション提供。
3. パターン分析 + Webダッシュボード
時間帯別ヒートマップ、滞在時間グラフ、関連デバイス検出(同時に現れるデバイス = 同一人物の可能性大)。FlaskベースのWeb UIでリアルタイムモニタリング。ntfy.sh経由の新規デバイス検出時プッシュ通知も対応。
ユーザーが制御できないデバイス
問題はユーザーが制御できないデバイス:
補聴器:遠隔調整・診断用BLE常時アクティブ
ペースメーカー:医療用インプラントもBLE信号送出(コミュニティで父のペースメーカーがnRF Connectアプリに検出されたという事例も)
車両:診断・管理用BLE継続送信。Teslaなどはteslaradar.comのような追跡サイトも存在
TPMS:タイヤ空気圧センサーも固有IDを常にブロードキャスト
プライバシーツールの逆説
Briarはインターネット切断時でもBluetooth/WiFiメッシュでメッセージを同期するアプリ。活動家・ジャーナリストの通信保護が目的だが、使うにはBluetoothをオンにする必要がある。
BitChatは完全なBLEメッシュベースの分散型メッセンジャー。インターネット・サーバー・電話番号不要だが、BLE有効化が必須。
保護手段が同時に露出経路になるという矛盾。
MACアドレスランダム化の限界
BLEにはすでに「resolvable private address」方式のランダム化がある。定期的にMACアドレスを変更するが、ローテーションのタイミングを追跡すれば依然同じデバイスを推定可能。iPhone + Apple Watchのように常に一緒に現れるパターンもデバイス識別に利用できる。
実行方法
Dockerまたは手動インストール。Bluetoothアダプタがある任意のデバイスで実行可能。
git clone https://github.com/dannymcc/bluehood
cd bluehood
docker compose up -d
root権限またはsystemdサービスで実行。Webダッシュボードでリアルタイムモニタリング。
キーポイント
bleakライブラリでBLE広告パケット継続収集 → MAC、RSSI、デバイス名、サービスUUID抽出
SQLiteにデバイスごとの初/最終検出時刻、回数、RSSI履歴を保存
時間帯別ヒートマップ + 関連デバイス分析で行動パターンを推論
Flask Webダッシュボードでリアルタイムモニタリング + ntfy.shプッシュ通知