
Details zu CVE-2020-14292
In der COVIDSafe-Anwendung bis Version 1.0.21 für Android ermöglicht die unsichere Verwendung der Bluetooth-Transportoption bei der GATT-Verbindung Angreifern, die Anwendung dazu zu bringen, eine Verbindung über den Bluetooth-BR/EDR-Transport herzustellen, wodurch die öffentliche Bluetooth-Adresse des Telefons des Opfers ohne Autorisierung preisgegeben wird und der Schutz des Telefons durch Bluetooth-Adress-Randomisierung umgangen wird. Dieses Problem wird unter CVE-2020-14292. verfolgt.
Die Ursache des Problems liegt in der Funktion startWork, bei der eine GATT-Verbindung mit connectGatt hergestellt wird, jedoch keine Transportoption angegeben wurde.
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}")
}
}
Dies führt dazu, dass Android beim Initiieren der Bluetooth-Verbindung die Option TRANSPORT_AUTO für den Transport verwendet. Es scheint, dass in der Android-Implementierung standardmäßig auf BR/EDR zurückgegriffen wird, wenn das Peripheriegerät, mit dem verbunden wird, ein Dual-Mode-Gerät ist (das sowohl BR/EDR als auch LE unterstützt). Dies könnte auf die folgende Implementierung des GATT-Clients in Android zurückzuführen sein, siehe zum Beispiel diesen Code (relevanter Codeausschnitt unten):
// 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;
}
Da die MAC-Adress-Randomisierung in BR/EDR nicht unterstützt wird, gibt das Central-Gerät seine Identitätsadresse an das Peripheriegerät preis.
Um einen Angriff zu starten, bewirbt der Angreifer einen GATT-Server auf einem Dual-Mode-Gerät (BR/EDR + LE) unter Verwendung der öffentlichen Adresse (dieser Teil ist wichtig, da sonst das Downgrade nicht erfolgt und das Android-Central-Gerät den LE-Transport verwendet). Dadurch verwendet die COVIDSafe-App den BR/EDR-Transport anstelle des LE-Transports, um sich mit dem Peripheriegerät zu verbinden, was dann dazu führt, dass die öffentliche Adresse des Telefons preisgegeben wird. Dies funktioniert auf allen getesteten Telefonen und Android-Versionen.
Für Android 6 und höher ist der Fix einfach: Geben Sie die Transportoption einfach explizit an.
gatt = device.connectGatt(context, false, gattCallback, BluetoothDevice.TRANSPORT_LE)
Dies funktioniert jedoch nicht unter Android 5.1 (API-Level 22), da diese Methode nicht in der API offengelegt ist. Sie ist zwar vorhanden, aber versteckt. Für Android 5.1 besteht ein möglicher Fix darin, diese versteckte Methode per Reflection aufzurufen. Diese Fixes wurden in COVIDSafe (Android) v1.0.48 implementiert.
Der Fix für Android 5.1 funktioniert jedoch möglicherweise nicht zu 100 %; meine Tests zeigten, dass weiterhin Identitätsadressen durchsickerten. Dies könnte auf das Scheitern der Reflection-Technik zur Laufzeit zurückzuführen sein; weitere Untersuchungen sind erforderlich.
Der Besitz der Identitätsadresse eines Telefons würde es einem Angreifer ermöglichen, das Telefon zu verfolgen, wenn dessen Bluetooth eingeschaltet ist und es sich in der Bluetooth-Reichweite des Angreifers befindet. Einige Bluetooth-bezogene Schwachstellen (z. B. CVE-2020-0022) stützen sich auf die Kenntnis der Identitätsadresse, um weitere Angriffe durchzuführen; es besteht also die Möglichkeit, diesen Angriff mit anderen zu verketten. Siehe dieses Dokument für einige der Konsequenzen, wenn der Angreifer die Identitätsadresse besitzt.
Benutzern der Android-Version der COVIDSafe-App wird dringend empfohlen, ihre App zu aktualisieren. Für Benutzer von Android 5 wird empfohlen, Bluetooth auszuschalten, wenn die Bluetooth-Funktionalität nicht benötigt wird.
Dieses Problem wurde am 2. Juni 2020 erstmals der Australian Government Digital Transformation Agency gemeldet. Der erste Fix wurde am 22. Juni 2020 für Android 6 und höher veröffentlicht. Es wurde bestätigt, dass dieser Fix unter Android 6 und höher funktioniert. Das Problem betraf jedoch weiterhin Android 5.1. Der zweite Fix, veröffentlicht am 30. Juli 2020, behob das verbleibende Problem mit Android 5.1.
Dank an Jim Mussared für die unabhängige Bestätigung dieses Problems und für verschiedene Diskussionen zu diesem Thema.