
Sweyntooth Bluetooth Low Energy (BLE) 脆弱性の概念実証 (Proof of Concept)。
このリポジトリは、ASSET Research Group による研究成果の一部です。

SweynTooth は、6 つの主要なシステムオンチップ (SoC) ベンダーのさまざまな Bluetooth Low Energy (BLE) ソフトウェア開発キット (SDK) にわたる 18 個の脆弱性 群を対象としています。これらの脆弱性は、特定の BLE SoC 実装の欠陥を露呈するもので、電波範囲内の攻撃者が状況に応じてデッドロック、クラッシュ、バッファオーバーフローを引き起こしたり、セキュリティを完全にバイパスしたりすることを可能にします。(更新) BLE KNOB 亜種に対するデバイスチェック用のテストスクリプトも追加しました。
脆弱性の詳細、利用可能なパッチ、影響を受けるデバイスについては、ASSET Research Group SweynTooth 開示ウェブサイト をご覧ください。
Fitbit、August Smart Lock、Eve Energy、CubiTag などの「スマート」デバイスが影響を受けます。
この PoC は、Scapy や Colorama などのよくメンテナンスされたライブラリを使用しています。BLE パケットの生成と解析は、カスタマイズされた Scapy プロトコルレイヤー (bluetooth4LE と bluetooth.py) を介して行われます。Scapy のメインリポジトリに追加機能を含めるための マージが進行中 です。
まず、システムに Python2.7 と、requirements.txt ファイルに記載されている Python パッケージがインストールされていることを確認する必要があります。
Ubuntu を使用している場合は、次のコマンドを実行してください:
sudo apt-get install python2.7
sudo pip install -r requirements.txt
次に、SweynTooth は Nordic nRF52840 Dongle を使用して、脆弱なペリフェラルとの間でリンク層の生パケットを無線で送受信します。Python 2.7 スクリプトを開始する前に、ボードにドライバファームウェアを書き込む必要があります。
ファームウェアコードのバイナリは nRF52_driver_firmware.zip ファイル内にあります。ボードにファームウェアを書き込むには、nrfutil ツールをインストールする必要があります。書き込む前に nRF52840 を DFU モードにしてください (USB ドングルを PC に接続した状態で、小さなリセットボタンを押してリセットします)。
次のコマンドで Python の依存関係をインストールし、ファームウェアを書き込むことができます:
python -m pip install nrfutil pyserial pycryptodome
nrfutil dfu usb-serial -p COM_PORT -pkg nRF52_driver_firmware.zip
スクリプトは Linux または Windows で動作します。COM_PORT パラメータを nRF52840 のポート名に合わせて変更するだけです。
前述の書き込み方法が機能しない場合は、nRF Connect App for Desktop を使用してファームウェアを書き込むこともできます。このアプリは hex ファームウェア (nRF52_driver_firmware.hex) を書き込むための便利なインターフェースを提供します。
要件がインストールされたら、次のコマンドを実行してエクスプロイトスクリプトを実行できます:
python Telink_key_size_overflow.py COM7 A4:C1:38:D8:AD:A9
最初の引数はシリアルポート名 (通常 Linux では /dev/ttyACM0) で、2 番目の引数は脆弱な BLE デバイスのアドレスです。このアドレスを見つけるには、任意の BLE スキャナまたは nRF Connect App を使用できます。
例として Key Size Overflow 脆弱性を取り上げると、脆弱なデバイスがクラッシュ後にハングした場合、スクリプトは次のような出力を返します:

Python の依存関係のインストールを避けるために Docker イメージで SweynTooth を使用したい場合は、docker.sh ヘルパースクリプトを使用して Docker インスタンスをビルドおよび実行するか、リリースページで利用可能なプレビルド Docker イメージ (リンク) をダウンロードできます。docker.sh の使用方法は以下のとおりです。
--------- HELP -------------
sudo ./docker run <script_name> <serial_port> <ble_target_address> - Start any sweyntooth script by its name (<script_name>)
sudo ./docker build - Build docker container
sudo ./docker build release - Build docker container and create compressed image for release
sudo ./docker shell - Start docker container shell
---------- EXAMPLE ----------
./docker.sh run extras/Microchip_and_others_non_compliant_connection.py /dev/ttyACM0 f0:f8:f2:da:09:63
各エクスプロイトスクリプトは 1 つの欠陥に対応しています。次の概要表は、影響を受ける SoC 上の脆弱性と、その脆弱性を悪用するスクリプトとの対応関係を示しています。
一般に、影響を受ける SoC を使用する製品は、障害発生時に BLE SoC を自動再起動するウォッチドッグを採用しているため、すべての製品をデッドロックさせられるわけではありません。それでも、製品がクラッシュして再起動した場合、何らかの視覚的または音声による表示が得られる可能性があります。
最も重大な SweynTooth の脆弱性は Zero LTK インストールで、ゼロで埋められた LTK による暗号化セットアップ手順を強制することで、攻撃者が最新の Bluetooth ペアリング手順 (セキュアコネクション) を完全にバイパスすることを可能にします。この脆弱性に対してデバイスをテストするには、デバイスがペアリング方法としてセキュアコネクションを受け入れるかサポートしている必要があります。PoC は次のように実行できます:
python Telink_zero_ltk_installation.py COM7 A4:C1:38:D8:AD:A9
引数 COM7 と A4:C1:38:D8:AD:A9 は、セットアップによって異なることに注意してください。デバイスが脆弱な場合、PoC は次の出力を返します:

LLID デッドロックスクリプトは、ペリフェラルとの再接続のたびに、バージョン要求またはペアリング要求を交互に送信する際に LLID フィールドをクリアします。これは、NXP と Cypress の両方の脆弱な SoC でこの脆弱性をトリガーするために行われます。脆弱な KW41Z に対してスクリプトを実行すると、スタックがデッドロックし、順序が乱れた Link Layer パケットを送信します。スクリプトはスタックがデッドロックしたことを検出しようとし、脆弱な KW41Z デバイスに対して次の出力を返します:

脆弱な Cypress デバイスは、攻撃後に一般にアドバタイズメントを無効にします。したがって、クラッシュが検出されたことを示すエラーメッセージが表示されるはずです。脆弱な Fitbit Inspire に対してこのスクリプトをテストすると、スマートウォッチは即座にクラッシュするか、一時的にアドバタイズメントを無効にします。このデバイスに対して断続的に攻撃を行うと、BLE が恒久的に誤動作する可能性があり、ユーザーは Fitbit Inspire を手動で再起動する必要があります。
KNOB は主に、キーサイズが 1 バイトに縮小された Bluetooth Classic デバイスに影響を与えましたが、SMP ペアリング手順中に Bluetooth Low Energy デバイスのキーエントロピーを 7 バイト (準拠可能な最小キーサイズ) に減らすことも依然として可能です。このような準拠した BLE エントロピー削減の影響は、"Low Entropy Key Negotiation Attacks on Bluetooth and Bluetooth Low Energy" by Antonioli, Daniele et. al で議論されています。
BLE ペリフェラルデバイスがどのキーサイズを受け入れるかを確認するための簡単なスクリプトを提供しています。BLE KNOB テスターは次のように実行できます:
# Windows
python extras\knob_tester_ble.py COM6 a4:c1:38:d8:ad:a9
# Linux
python extras/knob_tester_ble.py /dev/ttyACM0 a4:c1:38:d8:ad:a9
COM6 と a4:c1:38:d8:ad:a9 は、nRF52 ドングルのシリアルポート (通常 Linux では /dev/ttyACM0) とテスト対象の BLE デバイスのアドレスに応じて変更することを忘れないでください。ツールがペリフェラルが 16 バイト以外のキーサイズを受け入れることを検出した場合、以下のようにリスト表示されます:

captures フォルダには、各脆弱性のサンプルキャプチャがいくつか含まれています。一部の SoC で検出された非準拠のケースも追加しています。
extras フォルダ には、非準拠と一部の SweynTooth 亜種に関連する追加スクリプトが含まれています。詳細については、extras/README.md のエクストラスクリプトの表を確認してください。
この研究は Keysight Technologies によって一部支援されました。
| 脆弱性 | CVE(s) | ベンダー | スクリプトファイル |
|---|
| リンク層長さオーバーフロー | CVE-2019-16336 CVE-2019-17519 | Cypress NXP | link_layer_length_overflow.py |
| LLID デッドロック | CVE-2019-17061 CVE-2019-17060 | Cypress NXP | llid_dealock.py |
| 切り詰められた L2CAP | CVE-2019-17517 | Dialog | DA14580_exploit_att_crash.py |
| サイレント長さオーバーフロー | CVE-2019-17518 | Dialog | DA14680_exploit_silent_overflow.py |
| 公開鍵クラッシュ | CVE-2019-17520 | Texas Instruments | CC2640R2_public_key_crash.py |
| 無効な接続要求 | CVE-2019-19193 | Texas Instruments | CC_connection_req_crash.py |
| 無効な L2CAP フラグメント | CVE-2019-19195 | Microchip | Microchip_invalid_lcap_fragment.py |
| シーケンシャル ATT デッドロック | CVE-2019-19192 | STMicroelectronics | sequential_att_deadlock.py |
| キーサイズオーバーフロー | CVE-2019-19196 | Telink | Telink_key_size_overflow.py |
| Zero LTK インストール | CVE-2019-19194 | Telink | Telink_zero_ltk_installation.py |
| DHCheck スキップ | CVE-2020-13593 | Texas Instruments | non_compliance_dhcheck_skip.py |
| ESP32 HCI デシンク | CVE-2020-13595 | Espressif Systems | esp32_hci_desync.py |
| Zephyr 無効シーケンス | CVE-2020-10061 | Zephyr Project | zephyr_invalid_sequence.py |
| 無効なチャネルマップ | CVE-2020-10069 CVE-2020-13594 | Zephyr Project Espressif Systems Microchip | invalid_channel_map.py |