先週のCanSecWestセキュリティ・カンファレンスで、私はAndroid 4.3以上に適用されるBluetoothスタックへのリモート攻撃について取り上げました。この投稿では、このバグについて簡単に説明します。
忍耐のない読者は、ここをクリックして直接見ることができます。
この脆弱性は、BluedroidのBLEパケット解析コードに存在します。この脆弱性をテストするには、攻撃者が悪意のあるBLE(Bluetooth Smart)デバイスにユーザーを強制的に接続させる必要があります。接続すると、悪意のあるデバイスは不正なGATT通知パケットを投稿し、プロトコルスタックをクラッシュさせます。
攻撃者がユーザーを強制的にデバイスに接続させることができるというのは、少し大げさに聞こえるかもしれません。しかし、AndroidのBLEアプリの多くが、広告されたデバイスに日和見的に接続し、それがアプリに関連付けられたデバイスかどうかを判断するという事実を考えてみてください。アプリが攻撃目的で接続する限り、成功する可能性があります。
ただし、この脆弱性を悪用することはできません。クラッシュの原因は FORTIFY_SOUCE の検出エラーです。また、この脆弱性はAndroid 4.4以上で修正されています。
問題コード
問題のコードは stack/gatt/gatt_cl.c のgett_process_notificationにあります。このコードはnotificationパッケージを解析するために使用されます。次のコードは626行目にあります:
STREAM_TO_UINT16 (value.handle, p); 
value.len = len - 2; 
memcpy (value.value, p, value.len); 
value.lenはunit16_t。pもlenも攻撃者がコントロールできるが、注目すべきはlenだけ。pは攻撃者が送信したパケットの内容を示し、lenはそのパケットのサイズ。
このコードは少なくとも2バイトのサイズのパケットを出力します。攻撃者が1バイトしかない不正なフォーマットのパケットを送信した場合、value.len=len-2の計算は65534にアンダーフローします。
デモンストレーション
このために作りました。
私はBlueZ(LinuxのBluetoothスタック)の修正版を使用して攻撃プラットフォームを構築しました。BlueZはGATTサービスを実行するBLEデバイスとして動作します。BLEオーナーが接続すると、自動的に1バイトの通知パケットを送信します。
adb logcatの出力は以下のような表示になります:
F/libc    (19174): FORTIFY_SOURCE: memcpy buffer overflow. Calling abort(). 
F/libc    (19174): Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 19956 (BTU) 
繰り返しますが、この攻撃は悪用できません。その理由は、FORTIFY_SOURCEの実行検出メカニズムにあります。コードはコンパイル時にターゲット・バッファの長さを知っています。実行時に、コードはmemcpyの長さがターゲット・バッファより大きいかどうかをチェックし、大きい場合はabort()を呼び出します。
タイムフレーム
バグ追跡スケジュールは以下の通りです:
- 2013-09-30:この脆弱性をgoogleに開示 
- 2013-10-07:修正の約束 
- 2013-10-30:Android 4.4 r0.9 この脆弱性にフラグを立てる 
- 2013-10-31:Android 4.4修正リリース 
グーグルがAndroid 4.3で修正をリリースしなかったのは、すべてのユーザーに4.4にアップグレードしてほしかったからです。
詳細情報





