
GoogleのFast Pairプロトコルに影響を与える攻撃「WhisperPair」(CVE-2025-36911) の公式リファレンス実装および脆弱性検証です。
Google Fast Pair デバイスが、ペアリング、アカウントバインド、およびプロトコルレベルの攻撃に対して脆弱かどうかをテストするための実用的なツールです。
このリポジトリは、Google Fast Pair デバイスのセキュリティを評価するためのツールである WhisperPair テストハーネスを提供します。研究者と実務者の両方が、私たちの調査結果を再現し、自身のデバイスをテストできるように設計されています。
プロジェクトの概要、影響を受けるデバイス、および追加の文脈については、私たちのウェブサイト をご覧ください。
このリポジトリには、IEEE S&P 2026 で発表された論文 One Tap to Hijack Them All: A Security Analysis of the Google Fast Pair Protocol のアーティファクトも含まれています。
論文の完全版はこちらでご覧いただけます。この研究が役に立つと思われた場合は、以下の論文の引用を検討してください:
@inproceedings{whisperpair2026,
title = {One Tap to Hijack Them All: A Security Analysis of the Google Fast Pair Protocol},
author = {Duttagupta, Sayon and Wyns, Seppe and Antonijević, Nikola and Singelée, Dave and Preneel, Bart},
booktitle = {2026 IEEE Symposium on Security and Privacy (S\&P)},
year = {2026},
}
本マテリアルは、私たちの評価の再現性を確保し、研究者が防御的テストを実施できるようにするために提供されています。これらのマテリアルは、承認されたセキュリティ研究と、所有している、または明示的なテスト許可を得たデバイスに対する防御的検証にのみ使用してください。このリポジトリのコードは民生用アクセサリの脆弱性を実証するものであるため、明確な書面による許可なしに第三者デバイスへの攻撃に使用しないでください。著者らは、プロジェクトチームが所有するデバイス、またはインフォームドコンセントを得て寄贈されたデバイスでのみすべての実験を実施しました。これらのツールを実行することにより、防御的研究、当社の結果の再現、またはデバイスのセルフテストにのみ使用することに同意したものとみなされます。
[!NOTE] 概要: Bluetooth アダプタを搭載した Linux マシンがあり、Node.js (LTS) と pnpm がインストールされていることを確認してください。
同じマシン上で UI とサーバーの両方を実行するには、bash build.shを実行してからbash start.shを実行します。
このリポジトリには、対象デバイスが Google Fast Pair の特定のセキュリティ要件を正しく実装しているかどうかを評価するためのテストハーネスが含まれています。 ハーネスは、ペアリング状態述語が正しく実装されているか、再利用されたナンスを含むメッセージが拒否されるか、デバイスが invalid curve 攻撃に対して脆弱であるかをテストできます。 ハーネスは、バックエンドサーバーとフロントエンド Web UI で構成されています。
[!NOTE] 特に攻撃の実装をお探しの場合は:
./toolkit-server/src/fast-pair-service.tsと./toolkit-server/src/protocol.tsに、攻撃と Fast Pair プロトコルの実装が含まれています。
このツールキットは、サーバー と UI の2つのコンポーネントで構成されています。
サーバーは Linux システム上で実行する必要があり、Raspberry Pi 4 でテストされています。
UI はサーバーを制御するための Next.js フロントエンドで、Node.js がサポートされている場所ならどこでも実行できます。
UI はネットワーク経由でサーバーに接続できる必要があります。
ハーネスは、Raspberry Pi OS Lite (64-bit) (6.12.47+rpt-rpi-v8)、BlueZ バージョン 5.82 でテストしました。
BlueZ、Node.js、pnpm がインストールされた Linux マシン。
Node.js の現在の Long-Term-Support (LTS) バージョン (v24.14.0) を使用することを強くお勧めします。
このバージョンでツールキットが動作することを確認済みです。
古いバージョンでも v18 までは動作する可能性がありますが、それより古いバージョンではクラッシュしたり、予期しない結果が生じる可能性が高くなります。
nvm.shnvm を使用してインストール済みの Node.js バージョンを管理している場合は、root が nvm 管理下の Node.js バージョンにもアクセスできるようにする必要があります。
この StackOverflow の投稿 で説明されているように、新しいシンボリックリンクを作成する必要があるかもしれません。
# Source - https://stackoverflow.com/a/40078875
# Posted by SimpleJ, modified by community. See post 'Timeline' for change history
# Retrieved 2026-03-30, License - CC BY-SA 4.0
sudo ln -s "$NVM_DIR/versions/node/$(nvm version)/bin/node" "/usr/local/bin/node"
sudo ln -s "$NVM_DIR/versions/node/$(nvm version)/bin/npm" "/usr/local/bin/npm"
sudo ln -s "$NVM_DIR/versions/node/$(nvm version)/bin/npx" "/usr/local/bin/npx"
[!NOTE] サーバーを実行するには、
nodeをリンクするだけで十分です。
Node.js が外部のパッケージマネージャーでもインストールされている場合、sudo で利用できるバージョンが nvm で使用されているバージョンと異なる場合があります。
node -v と sudo node -v の出力を比較することで確認できます。
Node.js LTS v24 を推奨しますが、サーバーは v18 まで正しく機能するはずです。
pnpmNode.js v24 LTS がインストールされている場合は、次のコマンドで pnpm を有効にできるはずです:
corepack enable
ハーネスには hcitool と l2ping も必要です。
Linux ディストリビューションによっては、hcitool が利用できない場合があります。その場合は bluez-deprecated-tools をインストールする必要があるかもしれません。
執筆時点 (2025年10月1日) の最新の Raspberry Pi OS Lite バージョンでは、プレインストールされたままです。
Bluetooth アダプタの電源が入っていない場合、サーバーは rfkill を使用して電源をオンにしようとします。
Audio Switch 拡張機能のテストには rfcomm が必要です。
[!NOTE] サーバーは起動時にこれらのツールが利用可能かどうかをチェックします。 利用できない可能性のある機能に関する追加情報がコンソールに表示されます。
結果を再現するには、脆弱なデバイスへの物理的なアクセスが必要です。
ほとんどのベンダーが WhisperPair 向けのソフトウェアアップデートをリリースしているため、古いファームウェアを搭載したデバイスが必要になる場合があることに注意してください。
評価で使用したデバイスの詳細については、デバイスの選択 を参照してください。
UI とサーバーを同じ (Linux) マシンで実行したい場合は、build.sh と start.sh スクリプトを使用できます。
まず、次のコマンドを使用して必要な依存関係をインストールし、コンポーネントをビルドします:
bash build.sh
Bluetooth が有効になっていることを確認します:
sudo rfkill unblock bluetooth
次に、次のコマンドで UI とサーバーを実行します:
bash start.sh
UI は http://localhost:3000 でアクセスできるはずです。
UI とサーバーを異なるホストで実行できます。
これにより、UI をローカルで実行しながら、サーバーを Linux マシン上で実行できます。
推奨はされませんが、次の手順で実行できます:
toolkit-server ディレクトリが Linux マシン上で利用可能であることを確認しますbash build.sh を実行して toolkit-server をビルドしますtoolkit-ui ディレクトリ内の .env ファイルを更新して、SERVER_URL 変数がサーバーの URL に設定されるようにします。
bash update_server_url.sh <YOUR_URL> を実行すると、.env ファイルを自動的に更新できます。bash build.sh を実行して toolkit-ui をビルドしますbash start.sh を実行して toolkit-server を起動しますbash start.sh を実行して toolkit-ui を起動しますUI は http://localhost:3000 でアクセスできるはずです。
build.sh と start.sh スクリプトを使用する代わりに、サーバーを手動でビルドおよび起動することもできます。
これらの手順の詳細は、toolkit-server README に記載されています。
build.sh と start.sh スクリプトを使用する代わりに、UI を手動でビルドおよび起動することもできます。
これらの手順の詳細は、toolkit-ui README に記載されています。
攻撃を実行してツールキットを使用するには、Fast Pair 互換のアクセサリが必要です。
以下の表に示すように、16社のベンダーから25台のデバイスを評価しました。
これらのデバイスのいずれかを所有しており、2025年9月以降ファームウェアが更新されていない場合は、私たちの結果を再現できます。
私たちがテストしていないデバイスの評価にもツールキットを使用できます。
ただし、対象デバイスの Bluetooth チップセットの信頼性によっては、予期しないエラーが発生する可能性があります。
攻撃を実行する際は、対象デバイスがペアリングモードかどうかを把握していることを確認してください。
一部の攻撃では、デバイスがペアリングモードで ない ことが必要であり、そうでない場合は誤検知が発生する可能性があります。
他の攻撃では、デバイスがペアリングモードであることが必要であり、そうでない場合は機能しない可能性があります。
Fast Pair 互換デバイスを探している場合は、Model ID リスト を使用して、Fast Pair 認定済みのすべてのデバイスを確認できます。
Model not included in test set 警告メッセージテストセットに含まれていないデバイスを選択した場合、UI に警告メッセージが表示されます。
このメッセージは Model ID に基づいて表示され、同じデバイスでも色や地域によって Model ID が異なる場合があります。
例えば、青い Sony WH-1000XM6 ヘッドホンと黒い Sony WH-1000XM6 ヘッドホンでは、異なる Model ID が使用されます。
これらのデバイスは (Model ID が異なっていても) 同じファームウェアを搭載している可能性が高いため、この警告メッセージは安全に無視できます。
No device with Model ID <number> was found エラーメッセージFast Pair gRPC API によって適用されるより厳格なレート制限のため、モデルデータの一部のリクエストが空のボディで成功レスポンスを返す場合があります。
これにより、UI に No device with Model ID <number> was found と表示されます。
入力した Model ID が確かに存在すると思われる場合は、数分待ってから再試行してください。
[!NOTE] テストセットのデバイスのモデルデータはこのリポジトリに含まれており、キャッシュから読み込まれます。 これらのデバイスの評価には、gRPC サービスへの API 呼び出しは必要ありません。 同じシリーズのデバイスでも Model ID が同じとは限らないことに注意してください。詳細については Model not included in test set 警告メッセージ を参照してください。

UI は起動時にサーバーへの接続を試みます。
接続が成功すると、画面の右下隅に「Connected to the server」というメッセージが表示されます。
デバイスが脆弱かどうかの評価には、デバイスの発見、Model ID の設定、攻撃の実行という3つのステップが必要です。
ハーネスは Bluetooth Low Energy デバイスを継続的にスキャンし、画面の左側に表示します。 Fast Pair データをアドバタイズしているデバイスが上部に表示されます。 デバイスで「Select」をクリックすると、デバイスの詳細が画面の右側に表示されます。
論文で説明されているテストを実行するには、デバイスに Model ID を設定する必要があります。 デバイスが Fast Pair GATT キャラクタリスティックを公開している場合、デバイス詳細に「Read Model ID」ボタンが表示されます。 このボタンをクリックすると、Model ID の読み取りが試みられます。
多くのデバイスはこのキャラクタリスティックを正しく実装しておらず、無効な Model ID を返すことに注意してください。 あるいは、「Set Model ID」ボタンを押して値を手動で入力することで、デバイスの Model ID を手動で設定できます。 テスト中に評価されたデバイスを選択するか、カスタム値を入力できます。 Fast Pair 互換デバイスの完全なリストは、このリポジトリのルートに含まれています。
Model ID が設定されると、デバイスに関するメタデータがデバイス詳細に表示されます。
攻撃を実行するには、デバイス詳細ペインの「Attack」ボタンをクリックします。 実装されている攻撃は、ペアリング状態述語の強制、ナンス再利用、invalid curve 攻撃の3つです。 すでにデバイスに接続している場合、「Reconnect」チェックボックスをオンにすると、攻撃を実行する前にデバイスから切断して再接続します。
ペアリング状態述語の強制チェックには、いくつかの追加設定オプションがあります:
攻撃の進行中は、ログが UI にリアルタイムで表示されます。 攻撃が完了すると、その所要時間が表示されます。
攻撃やペアリングが予想よりも長くかかることがあります。
対応するダイアログの「Cancel」ボタンをクリックすると、攻撃やペアリングをキャンセルできます。
攻撃やペアリング中に UI をリロードした場合は、代わりにタスクマネージャーを使用してキャンセルできます。
画面の右上で、右から2番目のボタンにタスクの状態が表示されます。 アクティブなタスクがない場合は「No active tasks」と表示されます。 それ以外の場合は「Task in progress」と表示されます。 タスクをキャンセルするには、「Task in progress」ボタンをクリックし、次に「Cancel」ボタンを押します。
キャンセルできない保留中のタスクが原因でサーバーがハングした場合は、Bluetooth アダプタのリセット を試してください。
[!NOTE] タスクのキャンセルには最大20秒かかる場合があります。
場合によっては、Bluetooth アダプタが「悪い状態」で「スタック」することがあります。 この問題の最も簡単な解決策は、Bluetooth アダプタをリセットすることです。 リセットを実行するには、画面の右上にあるレンチアイコンを押してトラブルシューティングメニューを開きます。 次に、「Reset BLE adapter」を選択し、ダイアログで「Reset」をクリックしてリセットを確認します。
致命的なエラーが発生してサーバーがシャットダウンしなければならない場合、start.sh スクリプトが自動的にサーバーを再起動します。
近くに多数の BLE デバイスがあるシナリオでは、D-Bus エラーによりサーバーが予期せず終了することがあります。
これは非常にまれですが、発生した場合は ./start.sh スクリプトが自動的にサーバーを再起動します。
Fast Pair 互換デバイスを探している場合は、Model ID リスト を使用して、Fast Pair 認定済みのすべてのデバイスを確認できます。
本研究は、フランドル政府の Cybersecurity Research Program (助成金番号 VOEWICS02) の支援を受けています。
| メーカー | デバイス名 | Model ID | ハイジャックに対する脆弱性 | ハイジャックまでの時間 (秒) | ナンス再利用に対する脆弱性 | invalid curve 攻撃に対する脆弱性 |
|---|
| Apple | Beats Solo Buds | 6980580 | No | Yes | No | |
| Pixel Buds Pro 2 | 12934265 | Yes | 6.89 | No | No | |
| Jabra | Elite 8 Active | 3778746 | Yes | 32.01 | No | No |
| JBL | Tune Beam | 3293323 | Yes | 6.91 | 同じセッション内のみ | No |
| Marshall | MOTIF II A.N.C. | 15473012 | Yes | 9.49 | Yes | No |
| Nothing | Ear (a) | 8625818 | Yes | 38.80 | 同じセッション内のみ | No |
| OnePlus | Nord Buds Pro 3 | 13394952 | Yes | 10.19 | 同じセッション内のみ | No |
| HP | Poly VFree 60 | 15984097 | No | No | No | |
| Redmi | Buds 5 Pro | 11155060 | Yes | 8.32 | 同じセッション内のみ | No |
| Soundcore | Liberty 4 NC | 5409858 | Yes | 15.27 | Yes | No |
| Sony | WF-1000XM5 | 12499626 | Yes | 9.43 | Yes | No |
| Audio-Technica | ATH-M20xBT | 13285048 | No | 同じセッション内のみ | No | |
| Bose | QuietComfort Ultra | 5723549 | No | No | No | |
| JBL | Live 775 NC | 14502233 | Yes | 7.62 | 同じセッション内のみ | No |
| Marshall | Major V | 12915160 | Yes | 11.70 | 同じセッション内のみ | No |
| Sonos | Ace V | 7340495 | No | No | No | |
| Sony | WH-1000XM4 | 13386638 | Yes | 9.69 | Yes | No |
| Sony | WH-1000XM5 | 13911719 | Yes | 12.38 | Yes | No |
| Sony | WH-1000XM6 | 6360443 | Yes | 12.94 | 同じセッション内のみ | No |
| Sony | WH-CH720N | 16003068 | Yes | 7.46 | Yes | No |
| Bang & Olufsen | Beosound A1 | 2431472 | No | No | No | |
| Jabra | Speak2 55 UC | 9888885 | No | No | No | |
| JBL | Clip 5 | 1917389 | Yes | 36.19 | Yes | No |
| JBL | Flip 6 | 7278954 | No | No | No | |
| Logitech | Wonderboom 4 | 11575855 | Yes | 11.96 | 同じセッション内のみ | No |