
Dettagli di CVE-2020-14292
Nell'applicazione COVIDSafe fino alla versione 1.0.21 per Android, l'uso non sicuro dell'opzione di trasporto Bluetooth nella connessione GATT permette agli attaccanti di ingannare l'applicazione per stabilire una connessione tramite trasporto Bluetooth BR/EDR, rivelando l'indirizzo Bluetooth pubblico del telefono della vittima senza autorizzazione, bypassando la protezione di randomizzazione dell'indirizzo Bluetooth nel telefono dell'utente. Questo problema è tracciato con CVE-2020-14292.
La causa del problema è nella funzione startWork, dove viene creata una connessione GATT usando connectGatt, ma non è stata specificata alcuna opzione di trasporto.
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}")
}
}
Ciò farà sì che Android utilizzi l'opzione TRANSPORT_AUTO per il trasporto nell'avviare la connessione Bluetooth. Sembra che, nell'implementazione in Android, questo andrà in default a BR/EDR se il periferico a cui ci si connette è un dispositivo dual mode (che supporta sia BR/EDR che LE); ciò potrebbe essere dovuto alla seguente implementazione del client GATT in Android, vedere ad esempio, questo codice (frammento di codice rilevante incluso sotto):
// 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;
}
Poiché la randomizzazione dell'indirizzo MAC non è supportata in BR/EDR, il centrale rivelerà il suo indirizzo identità al periferico.
Per lanciare un attacco, l'attaccante pubblicizza un server GATT su un dispositivo dual mode (BR/EDR + LE), utilizzando l'indirizzo pubblico (questa parte è importante, altrimenti il downgrade non avverrà e il centrale Android utilizzerà il trasporto LE). Ciò farà sì che l'app COVIDSafe utilizzi il trasporto BR/EDR, invece del trasporto LE, per connettersi al periferico, causando così la divulgazione dell'indirizzo pubblico del telefono. Questo funziona per tutti i telefoni e le versioni di Android testate.
Per Android 6 e versioni successive, la correzione è semplice: basta specificare esplicitamente l'opzione di trasporto.
gatt = device.connectGatt(context, false, gattCallback, BluetoothDevice.TRANSPORT_LE)
Tuttavia, ciò non funziona per Android 5.1 (API Level 22), perché quel metodo non è esposto nell'API. In realtà è lì ma è nascosto. Quindi per Android 5.1, una possibile correzione prevede l'uso della reflection per chiamare quel metodo nascosto. Queste correzioni sono state implementate in COVIDSafe (Android) v1.0.48.
Tuttavia, la correzione per Android 5.1 potrebbe non funzionare al 100% delle volte; i miei test hanno indicato che c'era ancora una fuga di indirizzi identità. Ciò potrebbe essere dovuto al fallimento della tecnica di reflection in fase di esecuzione; saranno necessarie ulteriori indagini.
Il possesso dell'indirizzo identità di un telefono permetterebbe a un attaccante di tracciare il telefono quando il suo Bluetooth è acceso e si trova nel raggio d'azione Bluetooth dell'attaccante. Alcune vulnerabilità legate al Bluetooth (ad esempio, CVE-2020-0022) si basano sulla conoscenza dell'indirizzo identità per montare ulteriori attacchi, quindi c'è la possibilità di concatenare questo attacco con altri. Vedi questo documento per alcune conseguenze del possesso dell'indirizzo identità da parte dell'attaccante.
Si raccomanda vivamente agli utenti della versione Android dell'app COVIDSafe di aggiornare l'app. Per chi utilizza Android 5, si consiglia di disattivare il Bluetooth quando ci si trova in una situazione in cui la funzionalità Bluetooth non è necessaria.
Questo problema è stato segnalato per la prima volta alla Australian Government Digital Transformation Agency il 2 giugno 2020. La prima correzione è stata rilasciata il 22 giugno 2020, per Android 6 e versioni successive. È stato confermato che funziona per Android 6 e versioni successive. Ma il problema riguardava ancora Android 5.1. La seconda correzione, rilasciata il 30 luglio 2020, ha risolto il problema rimanente con Android 5.1.
Grazie a Jim Mussared per aver confermato questo problema in modo indipendente e per le varie discussioni relative a questo problema.