Bluetoothのセキュリティ

Bluetoothのセキュリティは、調べれば調べるほど複雑です。なので、ここでスペックに記載されているBluetoothのセキュリティについて、勉強したことを纏めてみたいと思います。

# 大事なこと
Bluetoothには、BR/EDR(Classic)とLE(Low Energy)の二種類の無線規格が存在します。ClassicとLEではセキュリティについてもそれぞれに異なる仕様が規定されています。ClassicとLEで似たような用語が出ますが、同じ意味の場合や異なる意味の場合があるので混乱すること間違いありません。

なお、この記事では、Bluetooth Classicのセキュリティについて紹介します。BLEのセキュリティについては、[Bluetoothのセキュリティ (LE編)](https://qiita.com/n_note/items/a39b0f0a68d5badf301e)に纏める予定です。

# 基本的なこと
Bluetoothのセキュリティは2段構えになっています。
* 一段目：ペアリングを実行してリンクキーを生成する。
* 二段目：プロファイル接続時にリンクキーを使い、無線の暗号化を行う。

まずは、ペアリングについて解説します。

# ペアリングとは
ペアリングは、一般的にはBluetooth機器を使用するための接続処理で知られていると思います。スペック上は、リンクキーを生成する処理です。つまりペアリングとは、どのようにリンクキーを生成するかということになります。

## ペアリング方式
ペアリング方式には、Bluetoothのバージョンにより大きく2つの種類が存在します。

|バージョン|説明|
|---|---|
| Bluetooth 2.0+EDR以前 | ペアリングする機器同士が、共通の"PINコード"と呼ばれる数字を入力する方式です。一般的には"0000"など、4桁の数字を入力することが一般的でしたが、スペック上は0x00～0x7Fまでの値を16桁使用可能です。最新のスペック(Bluetooth 5.2)では「Legacy pairing」と呼ばれています。 |
| Bluetooth 2.1+EDR以降 | Secure Simple Pairing(SSP)と呼ばれる方式に変更されています。最近のスマホとBluetooth機器をペアリングするときに6桁の番号が表示されて、数値が合っていることを確認してペアリングする方法です。リンクキーの生成方式にECDH(楕円曲線ディフィー・ヘルマン鍵共有)などの仕組みを取り入れ、Legacy pairingからセキュリティ強度を高めています。|

これ以降のペアリングは、Secure Simple Pairingについて説明します。

## ペアリングを実行するには
まず、ペアリングを実行するにあたり、以下の3つの情報を決める必要があります。

* Bluetooth機器のI/O能力を決める
* MITMプロテクションの有効・無効を決める
* OOBを使うか決める

### Bluetooth機器のI/O能力
Bluetooth機器が持つ、Input/Output装置から、ペアリングを実行するための能力(IO Capabilities)を決定します。スペックでは次の4つのIO能力が定義されています。

| IO Capabilities | 内容  |
|---|---|---|
| DisplayOnly     | 6桁の数値を表示可能なディスプレイ装置を持つ(Input装置なし) | 
| DisplayYesNo    | 6桁の数値を表示可能なディスプレイ装置と"Yes"/"No"の確認入力機能を持つ |
| KeyboardOnly    | '0'～'9'の数値の入力機能を持つ(Output装置なし) |
| NoInputNoOutput | 一切のInput装置、Output装置を持たない |

どれを設定するかは、次のルールで決定します。

#### 1. Input能力を確認する
Bluetooth機器に備わるInput(入力)装置を確認し、以下の3つからInput能力を決定します。

| Input能力 | 説明 |
|---|---|
| No input | "Yes"/"No"の入力装置を持たない |
| Yes/No   | "Yes"/"No"を入力できる装置を持つ |
| Keyboard | '0'～'9'の数値を入力できる装置を持つ |

#### 2. Output能力を確認する
Bluetooth機器に備わるOutput(出力)装置を確認し、以下の2つからOutput能力を決定します。

| Output能力 | 説明 |
|---|---|
| No output      | 6桁の数値を表示する装置を持たない |
| Numeric output | 6桁の数値を表示(ユーザに通知)可能な装置を持つ |

#### 3. I/O能力を決定する
ここまでに確認したInput能力、Output能力を以下のマッピングに当てはめ、Bluetooth機器のI/O能力(IO Capabilities)を決定します。

||No output| Numeric output |
|---|---|---|
|**No input**|NoInputNoOutput|DisplayOnly |
|**Yes/No**  |NoInputNoOutput|DisplayYesNo|
|**Keyboard**|KeyboardOnly   |DisplayYesNo|

※指摘を受けて、上記の表を修正しました（ご迷惑お掛けしました）。

### MITMプロテクションの有効・無効を決める
SSPが採用された1つの理由は、MITM攻撃(MITM attack)からの防御があります。SSPでは、MITMプロテクションの有効・無効を1つのパラメータとしています。MITMプロテクションが有効になると、ペアリング処理に人の手を介在させることになるため、より高いセキュリティが担保できます。ただし、場合によってはMITMプロテクションを有効とすることで、ペアリングに失敗する場合もあります。例えばスマートフォンにBTヘッドフォンをペアリングさせる場合、ヘッドフォンには、Input装置もOutput装置もなく、NoInputNoOutputを選択しているにも関わらず、MITMプロテクションを有効とした場合、6桁の番号表示や、一致していることの確認が行えないため、BT機器の実装によってはペアリング失敗になる可能性があります。

### OOBを使うか決める
OOBとは、Out of Bandの略です。これはBluetoothペアリング上のデータ交換の一部シーケンス処理をBT無線以外の通信で実行することを意味します。BT無線以外の通信はスペックに定義はありません。USBやNFCなどを使用するのが一般的ですが、データを手書きメモで交換してもなんら問題はありません。ただし、OOBを使ったペアリングはあまり一部の分野に限られています。

余談となりますが、NFCにタッチすると簡単にペアリングできるBTスピーカなどで存在しますが、ほとんどの場合はBTスペック上のOOBでは実装されていません。BTスピーカのNFCにBluetoothアドレスが埋め込まれており、それをスマホのNFCリーダ機能で読み取り、自動接続している（ペアリングはJust worksで実行）のが一般的です。
※このあたりは、NFCの"Static Handover"の仕組みを参照して下さい。

## ペアリングの手順
ここからは、SSPにおけるペアリング（開始からリンクキー生成まで）の手順を説明します。

### Step.1：認証処理を開始する (Start Simple Pairing)
ペアリングを実行する機器同士は、Bluetooth無線を接続後、どちらかが認証処理の開始を実行します。この場合の認証とは、共通鍵であるリンクキーを持っているかの確認となります。要するに「認証しましょう」→「リンクキーある？」→「持ってない」→「リンクキー作ろう」という流れで、ペアリングが実行されることになります。この「認証しましょう」は、サービス接続（プロファイル用のL2CAP接続）を契機に、ホストが指示します。

> Note
> スペック上、HFPなどのL2CAP接続の際には、必ず認証が必要です。認証にはリンクキーを必要とします。ペアリング未実施の場合、認証処理を実行できないので、ペアリングしてリンクキーを生成することになります。ちなみに、SDPは認証不要でL2CAPを接続し実行することが可能です。

### Step.2：ペアリング情報の交換 (IO Capability Exchange)
ペアリングを実行する機器同士で、I/O能力などペアリングに必要な情報を交換します。この交換した情報を元に、今後のペアリングの方式が決定されることになります。なお、交換する情報は以下の通りです。

* I/O能力 (IO Capabilities)
* MITMプロテクションの有効・無効
* OOBの有無
* ボンディング情報

上記パラメータは、ホストがコントローラに設定します。ボンディングとは、リンクキーを生成後、保存するかどうかです。ペアリングした機器同士がリンクキーを保存し続けることを「ボンディング状態」と言います。また、この先OOBでペアリングするためには、Step.1の前にOOBのデータを交換しておく必要があります。


### Step.3：公開鍵の交換 (Public Key Exchange)
ここでの公開鍵(Public Key)とは、ECDHの公開鍵のことを指します。この鍵はコントローラが生成し、ペアリングを実行するコントローラ同士で交換されます。ここはホストは介在しません。

### Step.4：Numeric Comparison
Step.3以降は、Step.2で交換した情報を基に、3つのパターンでリンクキーを生成していきます。その1つがNumeric Comparisonです。ペアリングするときに、機器同士に同じ6桁の番号が表示され、どちらも「OK」を押すとペアリング完了となるアレです。

なお、「JustWorks」と呼ばれるペアリング（ユーザが確認せずにペアリングする方式）は、厳密にはNumeric Comparisonで動作しています。

### Step.4-B：Passkey Entry
2つ目のパターンはPasskey Entryです。PCとキーボードデバイスのように、一方に6桁の番号、もう一方でそれを入力する方式です。

### Step.4-C：Out of Band
3つ目のパターンはOut of Band (OOB)です。Step.1の前に交換した情報を使用してペアリングします。

### Step.5：DHKey check
Step.4のいずれかの方式でペアリング機器の確認が済むと、DHKey checkを実行します。

### Step.6：Calculate Link Key
Step.5も無事にクリアすると、やっとリンクキーが生成されます。コントローラがリンクキーを生成し、ホストに通知します。