ここ1年くらいBluetoothについて扱う機会が多く、色々ツールを試してみたものをまとめておきます。
準備
必要なデバイス
USBドングルタイプのBluetoothアダプタを利用するのが良いです。特にCSR製チップのものが割と何でも対応できる感覚です。(※詳しく調べていないので断言はできず・・・)
実行環境
OS:Ubuntu18.04で仮想マシンで問題ないです。
インストール
Bluetoothのツールは最初から入っているので、特に新たに入れる必要は無いのですが、パケット解析のためにWiresharkだけはインストールが必要です。
sudo apt-get install wireshark
パケットキャプチャできる部分については無線区間の信号ではないので注意が必要です。
Bluetoothの仕様
標準仕様を策定しているBluetooth SIGでダウンロード可能です。こちらを参照下さい。
あまり他の無線仕様では規格されていないのですが、Bluetoothの仕様で1つ変わっているのが、ホストマシン(メインマイコン)とBluetoothデバイス(無線チップ)間の通信プロトコル(HCI)が定義されていることです。
ホストマシン上のWiresharkで取得できるキャプチャデータというのは、このHCIプロトコル部分です。(無線区間のLMP層やBaseband層は直接キャプチャすることはできない)
Bluetoothのセキュリティ機能はLMP層でやり取りしますが、HCIによってホストマシンからBluetoothデバイスに設定を行う部分もあります。ここでは、ホストマシン上で動く各種ツールを使って、セキュリティ機能を制御する方法を紹介します。
LMP層については、IoTソフトウェア無線の教科書の6章で解説していますので、ぜひご覧ください。
引用:BLUETOOTH CORE SPECIFICATION Version 5.2 | Vol 4, Part B
ツールの紹介
使用するデバイスの確認
以下のコマンドでPCに接続したBluetoothデバイスのBD ADDRを確認することができます。
root@ubuntu:~# hcitool dev
Devices:
hci0 11:22:33:44:55:66
周辺デバイスの検出
以下のコマンドでスキャンできます。周辺に存在するデバイスのBD ADDRを見つけることができます。
root@ubuntu:~# bluetoothctl
[NEW] Controller 11:22:33:44:55:66 ubuntu [default]
Agent registered
[bluetooth]# scan on
Discovery started
[CHG] Controller 11:22:33:44:55:66 Discovering: yes
[NEW] Device 18:D0:C5:E6:50:A8 TestDevice[bluetooth]# scan off
他にも以下のコマンドでスキャンできます。
root@ubuntu:~# hcitool
scanScanning ...
18:D0:C5:E6:50:A8 TestDevice
ペアリング
対象デバイスのBD ADDRを知った上で、以下のコマンドで実行できます。
root@ubuntu:~# bluetoothctl
[NEW] Controller 11:22:33:44:55:66 ubuntu [default]
Agent registered
[bluetooth]# pair 18:D0:C5:E6:50:A8
他には以下でもいけます。
btmgmt pair 18:D0:C5:E6:50:A8
BD ADDRの偽装
これはCarsBluesと呼ばれる攻撃手法を試す方法です。既にペアリングしたことあるBD ADDRになりすまして接続を試行する攻撃手法です。
なんらかの手段でペアリングしたことある機器のBD ADDRの情報を手に入れ、そのBD ADDRに書き換えてペアリングを試みます。脆弱性が存在すると、ユーザ操作などなく勝手にペアリングしてしまいます。
例えば、BD ADDRを11:22:33:44:55:66に書き換えたい場合、以下のコマンドで書き換えが可能です。
root@ubuntu:~# bccmd psset -s 0 bdaddr 0x44 0x00 0x66 0x55 0x33 0x00 0x22 0x11
root@ubuntu:~# bccmd warmreset
root@ubuntu:~# service bluetooh restart
書き換え後、攻撃対象のデバイスのBDADDRにペアリングを試行します。
ダウングレード攻撃
Blluetooth Classicのセキュリティ方式は大きく分けて2つあります。PINモードと呼ばれるLegacy pairingとSSPと呼ばれる方式の2つです。
PINモードは、既に脆弱な方式として標準規格でも利用を避けるべき方式とされています。 4桁の数字のコードを入力するだけで認証される方式ということと、1111や9999といった容易に推測される値を使っている機器が多いことが問題とされています。
現在、流通しているほぼすべての機器でSSPに対応していますが、過去に販売されたPINモードのみにしか対応していないデバイス(SSPはBluetooth V2.1以降で登場しているため、V2.0以前の機器が対象)とも接続できるようにPINモードも動作させている場合があります。
以下のコマンドを実行すると、現在SSPが有効かどうか確認することができます。
root@ubuntu:~# btmgmt info
Index list with 1 item
hci0: Primary controller
addr 11:22:33:44:55:66 version 4 manufacturer 10 class 0x1c0000
supported settings: powered connectable fast-connectable discoverable bondable link-security ssp br/edr hs debug-keys
current settings: powered bondable ssp br/edr
name ubuntu
short name
以下のコマンドでSSPを無効にすることができます。
root@ubuntu:~# btmgmt ssp off
hci0 Set Secure Simple Pairing complete, settings: powered bondable br/edr
この状態で、攻撃対象のデバイスにペアリングを試行して、4桁のPINコードの入力を求められれば、PINモードが有効になっています。
IOCapabilityの偽装
SSPでのペアリングでは、デバイスの能力(IO Capability) によって、どのように認証するかを決めています。デバイスの能力は以下の4つに区分されます。
- DisplayOnly:入力I/Fがなく、表示だけできる機器
- DisplayYesNo:表示とYes/Noを選択できる機器(スマートフォンなど)
- KeyboardOnly:キー入力のみできる機器(キーボードなど)
- NoInputNoOutput:入力/出力ともにI/Fがない機器(マウスなど)
お互いのデバイスの能力によって、どのような認証方式をとるのかは、標準規格に規定されています。例えば、DisplayYesNoの機器とDisplayOnlyの機器の場合、Numeric Comparisonで行われます。これは、お互いの機器に表示された6桁の数字が同じかどうか確認して、DisplayYesNoの機器では、正しい場合yesを選択するという方式です。
引用:BLUETOOTH CORE SPECIFICATION Version 5.2 | Vol 3, Part C
ここで重要なのが、 NoInputNoOutputの機器は、「Unauthenticated」とされており、認証スキームなしで接続されるということです。標準規格で定義されている通り動作する機器の場合、NoInputNoOutputのデバイスからペアリング試行があると勝手に接続してしまう場合があります。
以下のコマンドを実行すると、IOCapabilityを書き換えることができます。
root@ubuntu:~# bluetoothctl
[NEW] Controller 11:22:33:44:55:66 ubuntu [default]
Agent registered
[bluetooth]# agent off
Agent unregistered
[bluetooth]# agent NoInputNoOutput
Agent registered
この状態で攻撃対象のデバイスにペアリングを試行して、ペアリングできる場合、勝手に接続できる状態となるため、仕様上許容していない場合は見直す必要があります。
まとめ
Bluetoothは、よく知られているようで、そのセキュリティについてはまだまだ知られていないと思います。セキュリティ機能を適切に使うことが非常に重要です。