
Détails de CVE-2020-14292
Dans l'application COVIDSafe jusqu'à la version 1.0.21 pour Android, une utilisation non sécurisée de l'option de transport Bluetooth dans la connexion GATT permet aux attaquants de tromper l'application pour qu'elle établisse une connexion via le transport Bluetooth BR/EDR, ce qui révèle l'adresse Bluetooth publique du téléphone de la victime sans autorisation, contournant ainsi la protection de randomisation d'adresse Bluetooth du téléphone de l'utilisateur. Ce problème est suivi sous CVE-2020-14292.
La cause du problème se trouve dans la fonction startWork, où une connexion GATT est établie à l'aide de connectGatt, mais aucune option de transport n'a été spécifiée.
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}")
}
}
Cela amène Android à utiliser l'option TRANSPORT_AUTO pour le transport lors de l'initiation de la connexion Bluetooth. Il semble que, dans l'implémentation d'Android, cela utilise par défaut le BR/EDR si le périphérique auquel on se connecte est un périphérique double mode (supportant à la fois BR/EDR et LE) ; cela pourrait être dû à l'implémentation suivante du client GATT dans Android, voir par exemple, ce code (extrait de code pertinent inclus ci-dessous) :
// 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;
}
Étant donné que la randomisation d'adresse MAC n'est pas prise en charge en BR/EDR, le central révèle son adresse d'identité au périphérique.
Pour lancer une attaque, l'attaquant annonce un serveur GATT sur un périphérique double mode (BR/EDR + LE), en utilisant l'adresse publique (cette partie est importante, sinon la rétrogradation ne se produira pas et le central Android utilisera le transport LE). Cela amène l'application COVIDSafe à utiliser le transport BR/EDR au lieu du transport LE pour se connecter au périphérique, ce qui entraîne la divulgation de l'adresse publique du téléphone. Cela fonctionne pour tous les téléphones et versions d'Android testés.
Pour Android 6 et ultérieur, le correctif est simple : il suffit de spécifier explicitement l'option de transport.
gatt = device.connectGatt(context, false, gattCallback, BluetoothDevice.TRANSPORT_LE)
Cependant, cela ne fonctionne pas pour Android 5.1 (API niveau 22), car cette méthode n'est pas exposée dans l'API. Elle existe bel et bien mais est masquée. Donc pour Android 5.1, un correctif possible consiste à utiliser la réflexion pour appeler cette méthode masquée. Ces correctifs ont été implémentés dans COVIDSafe (Android) v1.0.48.
Cependant, le correctif pour Android 5.1 peut ne pas fonctionner à 100% ; mes tests ont indiqué des fuites d'adresses d'identité persistantes. Cela pourrait être dû à l'échec de la technique de réflexion à l'exécution ; des investigations supplémentaires seront nécessaires.
La possession de l'adresse d'identité d'un téléphone permettrait à un attaquant de suivre le téléphone lorsque son Bluetooth est activé et qu'il se trouve à portée Bluetooth de l'attaquant. Certaines vulnérabilités liées au Bluetooth (par exemple CVE-2020-0022) reposent sur la connaissance de l'adresse d'identité pour mener d'autres attaques, il est donc possible d'enchaîner cette attaque avec d'autres. Voir ce document pour certaines conséquences de la possession de l'adresse d'identité par un attaquant.
Il est fortement recommandé aux utilisateurs de la version Android de l'application COVIDSafe de mettre à jour leur application. Pour ceux qui utilisent Android 5, il est recommandé de désactiver le Bluetooth lorsque la fonctionnalité Bluetooth n'est pas nécessaire.
Ce problème a été signalé pour la première fois à l'Agence australienne de transformation numérique (Digital Transformation Agency) le 2 juin 2020. Le premier correctif a été publié le 22 juin 2020 pour Android 6 et versions ultérieures. Il a été confirmé qu'il fonctionne pour Android 6 et versions ultérieures. Mais le problème affectait toujours Android 5.1. Le second correctif, publié le 30 juillet 2020, a résolu le problème restant avec Android 5.1.
Merci à Jim Mussared pour avoir confirmé ce problème indépendamment et pour diverses discussions liées à ce problème.