
CVE-2020-14292 の詳細
Android版COVIDSafeアプリ(バージョン1.0.21まで)において、GATT接続におけるBluetoothトランスポートオプションの安全でない使用により、攻撃者がアプリを騙してBluetooth BR/EDRトランスポート経由で接続を確立させることが可能です。これにより、ユーザーのスマートフォンの公開Bluetoothアドレスが許可なく漏洩し、スマートフォンにおけるBluetoothアドレスランダム化保護が回避されます。この問題はCVE-2020-14292として追跡されています。
問題の原因は、startWork 関数にあります。この関数では、connectGatt を使用してGATT接続を行っていますが、トランスポートオプションが指定されていません。
fun startWork(
context: Context,
gattCallback: StreetPassWorker.StreetPassGattCallback
) {
gatt = device.connectGatt(context, false, gattCallback)
if (gatt == null) {
CentralLog.e(TAG, "Unable to connect to ${device.address}")
}
}
これにより、AndroidはBluetooth接続の開始時にトランスポートにTRANSPORT_AUTOオプションを使用します。Androidの実装では、接続先のペリフェラルがデュアルモードデバイス(BR/EDRとLEの両方をサポート)の場合、デフォルトでBR/EDRにフォールバックするようです。これは、AndroidのGATTクライアント実装に起因する可能性があります(例: このコード 、関連コードスニペットを以下に示します)。
// Determine transport
if (transport_p != BT_TRANSPORT_AUTO) {
transport = transport_p;
} else {
switch (device_type) {
case BT_DEVICE_TYPE_BREDR:
transport = BT_TRANSPORT_BR_EDR;
break;
case BT_DEVICE_TYPE_BLE:
transport = BT_TRANSPORT_LE;
break;
case BT_DEVICE_TYPE_DUMO:
if (transport_p == BT_TRANSPORT_LE)
transport = BT_TRANSPORT_LE;
else
transport = BT_TRANSPORT_BR_EDR;
break;
}
BR/EDRではMACアドレスランダム化がサポートされていないため、セントラルはペリフェラルに対して自身の識別アドレスを公開します。
攻撃を実行するには、攻撃者はデュアルモードデバイス(BR/EDR + LE)上で公開アドレスを使用してGATTサーバーをアドバタイズします(この部分が重要です。そうしないとダウングレードが発生せず、AndroidセントラルはLEトランスポートを使用します)。これにより、COVIDSafeアプリはLEトランスポートではなくBR/EDRトランスポートを使用してペリフェラルに接続し、結果としてスマートフォンの公開アドレスが漏洩します。これはテストされたすべてのスマートフォンとAndroidバージョンで機能します。
Android 6以降では、修正は簡単です。トランスポートオプションを明示的に指定するだけです。
gatt = device.connectGatt(context, false, gattCallback, BluetoothDevice.TRANSPORT_LE)
ただし、Android 5.1(APIレベル22)では、そのメソッドがAPIで公開されていないため機能しません。実際には存在しますが、隠蔽されています。そのため、Android 5.1では、リフレクションを使用してその隠蔽メソッドを呼び出す修正が可能です。これらの修正はCOVIDSafe (Android) v1.0.48 で実装されています。
しかし、Android 5.1の修正は100%機能しない可能性があります。私のテストでは、識別アドレスの漏洩が依然として発生していました。これは実行時のリフレクション手法の失敗が原因である可能性があり、さらなる調査が必要です。
スマートフォンの識別アドレスを入手することで、攻撃者はBluetoothがオンになっており、攻撃者のBluetooth範囲内にある場合にそのスマートフォンを追跡できます。一部のBluetooth関連の脆弱性(例:CVE-2020-0022)は、さらなる攻撃を仕掛けるために識別アドレスの知識に依存しているため、この攻撃を他の攻撃と連鎖させる可能性があります。攻撃者が識別アドレスを保持することの結果の一部については、このドキュメント を参照してください。
COVIDSafeアプリのAndroidバージョンのユーザーは、アプリをアップデートすることを強く推奨します。Android 5を実行しているユーザーは、Bluetooth機能が不要な状況ではBluetoothをオフにすることを推奨します。
この問題は、2020年6月2日にオーストラリア政府デジタルトランスフォーメーション庁に最初に報告されました。最初の修正は2020年6月22日にリリースされ、Android 6以上に対応しました。これはAndroid 6以上で機能することが確認されています。しかし、この問題は依然としてAndroid 5.1に影響を及ぼしていました。2回目の修正は2020年7月30日にリリースされ、Android 5.1の残りの問題に対処しました。
この問題を独立して確認し、関連するさまざまな議論を提供してくれたJim Mussaredに感謝します。