無線通信セキュリティ屋のブログ

Radio/IoT/Security/Mobile/Network/Carrier

Bluetooth Classicの脆弱性KNOB Attackを試してみた

先日出版した「IoTソフトウェア無線の教科書」でも紹介した、"KNOB Attack"についてPoCを使った脆弱性の確認方法を紹介します。 

KNOB Attackとは? 

2019年8月に発表された、Bluetooth Classicの脆弱性で、暗号化通信の鍵を1Byteにすることで、暗号化通信の鍵を容易に特定することができる問題です。 

詳しくは以下サイトをご確認下さい。

knobattack.com

 

脆弱性はPoCが公開されており、以下より入手可能です。

github.com

 

必要な機材

  • Nexus5 or Nexus6p
  • Ubuntu 18.04マシン

Nexus5はAmazonなどで購入可能です。 中古品であれば\5,000くらいで出品されていることもあります。今回はNexus5を使って試しました。

Ubuntu仮想マシンで用意しておきます。 

Nexus5のroot化

Nexus5をroot化しておく必要があります。以下の記事を参考にroot化します。

root化したら、インストールしたSuperSUアプリ上でADB shellにroot権限を与えておきます。

blog.livedoor.jp

 

KNOB AttackのPoC環境構築 

Ubuntu18.04の事前環境構築

KNOB attackのPoC環境を構築する前に、以下をインストールしておきます。

sudo apt-get install git cmake python-pip wireshark wireshark-dev adb

git clone https://github.com/greatscottgadgets/libbtbb.git

cd libbtbb

mkdir build

cd build

cmake ../

make

sudo make install

wiresharkを起動してユーザ権限でキャプチャできない場合は以下を試す。

sudo usermod -G wireshark [home user]
sudo dpkg-reconfigure wireshark-common
sudo chmod +x /usr/bin/dumpcap

LMPを解析するためのWireshark dissectorインストール

まず、KNOB AttackのPoCを入手します。

git clone https://github.com/francozappa/knob.git

Wiresahrkフォルダ配下の lmp_wireshark_dissectorをインストールします。

cd knob/wireshark/lmp_wireshark_dissector

mkdir build

cd build

cmake ../

make

sudo make install

ここで、PoCのサンプルログであるknob/poc-internalblue/sample-nexmaster-galaxys9slave.pcapngをWiresharkで開くと、LMP層を解釈してくれるようになります。

この脆弱性の本質である、LMP:encryption key size reqを確認することができます。ここが1byteになっています。

f:id:tansokun920:20200418174328p:plain

 

internalblueのインストール

KNOB Attackを試行する方向をマスター→スレーブなのか、スレーブ→マスターなのかをコード上決め打ちしておく必要があります。

knob/poc-internalblue/internalblue/internalblue/core.pyを編集します。

38行目と39行目に定義があります。どちらかをコメントアウトしておきます。 

f:id:tansokun920:20200418180226p:plain

 

上記が終わったらインストールしていきます。

sudo pip install pyparsing
sudo pip install markupsafe
sudo apt install binutils-arm-linux-gnueabi
cd knob/poc-internalblue/internalblue
sudo python setup.py install 

Nexus5へデバッグBluetoothスタックのバイナリをセットアップ

Nexus5をUbuntu仮想マシンに接続しておきます。

以下コマンドを実行して、Nexus5のBluetoothスタックをPoC用に置き換えます。

cd knob/poc-internalblue/internalblue/android_bluetooth_stack/nexus5_android6_0_1

adb push bluetooth.default.so /sdcard/bluetooth.default.so
adb shell 'su -c "mount -o remount,rw /system"'
adb shell 'su -c "cp /sdcard/bluetooth.default.so /system/lib/hw/bluetooth.default.so"'
adb shell 'su -c "chmod 644 /system/lib/hw/bluetooth.default.so"'
adb shell 'su -c "chown root:root /system/lib/hw/bluetooth.default.so"'

ここまで準備できたら、Nexus5の設定でHCIスヌープログを有効にします。

  

KNOB Attackを試行する 

 Nexus5をUbuntu仮想マシンに接続した状態で、internalblueを実行します。

正常にNexus5を認識したら、以下を実行します。

>monitor lmp start

すると、Wiresharkが起動して、LMP層のパケットキャプチャが開始されます。

うまくいけば以下の様な表示になります。

f:id:tansokun920:20200418223932p:plain

この状態で、Nexus5またはターゲットデバイスを操作して、ペアリングを試行します。

ペアリングシーケンスの最後の方にNexus5から送っているLMP:encryption_key_size_reqの中のkey_sizeが1byteになっていれば正常にPoCが動作しています。

ペアリングが成功して、かつターゲットデバイスからLMP:detachメッセージが送られてこなかったら、脆弱性が残存している状態です。

 特にアップデートをかけていないBTドングルなどは以下の様に動いてしまう。

f:id:tansokun920:20200418221708p:plain

 

このPoCはあくまで脆弱性有無の確認用のため、中間者攻撃を行うことができるものではありません。 

 

Bluetoothの仕様、KNOB Attackの紹介は先日出版した「IoTソフトウェア無線の教科書」に掲載しております。 もしご興味があればこちらも宜しくお願い致します。 

IoTソフトウェア無線の教科書 (ハッカーの技術書)

IoTソフトウェア無線の教科書 (ハッカーの技術書)

  • 作者:上松 亮介
  • 発売日: 2020/03/27
  • メディア: 単行本