
Bluetoothデバイスから音声を録音するPoC

このリポジトリには、正当なユーザーに気付かれることなくBluetoothデバイスから音声を録音・再生する概念実証(PoC)の実装が含まれています。
このPoCは、マドリードで開催されたRootedCON 2024の講演BSAM: Seguridad en Bluetoothの中でデモンストレーションされました。
これは、Bluetoothデバイスの安全でない使用方法と、セキュリティ評価のための一貫した方法論の必要性についての認識を高めるために設計されています。それが、Tarlogicが公開し、こちらで入手できる**BSAM(Bluetooth Security Assessment Methodology)**の目的です。
この概念実証は、BSAM手法におけるBSAM-PA-05コントロールの不遵守を悪用します。その結果、デバイスはユーザーの操作なしにペアリング手順を可能にし、その機能を信号範囲内の任意のエージェントにさらします。
詳細はブログをご覧ください。
コードはPythonで記述されており、Python 3.11.8でテストされていますが、主にLinuxシステムで広く利用可能なツールを使用しています。
PoCは以下のツールを使用します:
bluetoothctlbtmgmtpactlparecordpaplayArch Linuxディストリビューションでは、bluetoothctlとbtmgmtはパッケージbluez-utilsでインストールでき、pactl、parecord、paplayはlibpulseパッケージで利用できます。
PoCを機能させるには、Arch Linuxディストリビューションのbluezパッケージで利用可能なBlueZ Bluetoothスタックの動作するインストールが必要です。また、音声の録音と再生には、PipeWireなどPulseAudio互換のオーディオサーバーの動作するインストールも必要です。
お使いのデバイスがオーディオソースとして機能できること、つまりマイクを備えていること、そしてBluetooth経由で発見可能かつ接続可能であることを確認してください。
たとえば、講演中に使用したイヤホンは、充電ケースの外にある場合にのみ発見可能かつ接続可能です。デフォルトでは、ユーザーの耳に装着された場合にのみマイクが作動しますが、この設定は設定アプリで調整できます。
さらに、デバイスがすでに接続されていないこと、または複数の接続をサポートしていることを確認してください。
まず、bluetoothctlなどのツールを使用してデバイスのアドレスを発見する必要があります:
$ bluetoothctl
[bluetooth]# scan on
デバイスのアドレスが発見されたら、スクリプトが残りの処理を実行できます:
$ python BlueSpy.py -a <address>
注:スクリプトは、BlueZインスタンスの設定を変更し、リモートデバイスとペアリングするために、スーパーユーザー権限を要求する場合があります。
BlueSpy.pyは、プロセスのすべてのステップを実行するメインスクリプトです。ただし、いずれかのフェーズで問題が発生した場合は、それらを個別に実行すると役立つ場合があります:
pair.pyは、コマンドラインツールbtmgmtを使用して、BlueZの設定を変更し、リモートデバイスとのペアリングプロセスを開始します。使用される正確なコマンドは、core.py内のpair関数にあります。connect.pyは、コマンドラインツールbluetoothctlを使用して、クイックスキャン(BlueZに必要)を開始し、デバイスへの接続を確立します。使用される正確なコマンドは、core.py内のconnect関数にあります。just_record.pyは、コマンドラインツールpactlとparecordを使用して、システムのオーディオソース内でデバイスを検索し(マイクとして機能する必要があります)、録音セッションを開始します。使用される正確なコマンドは、core.py内のrecord関数にあります。core.py内の関数は、を実行してキャプチャした音声を再生します。いずれかのフェーズで問題が発生した場合は、core.py内のコマンドを調べて、シェルで実行してみてください。これにより、何が失敗しているかについての詳細情報が得られます。
Bluetooth標準の仕組みや、Bluetoothデバイスのセキュリティを評価する方法について質問がある場合は、BSAM手法のWebページを参照してください:
playbackpaplay