La localisation est-elle devenue tellement banale qu'on doit la donner à toutes les applications même quand elles n'en ont pas besoin ? Dans ce billet "coup de gueule", je vous raconte l'expérience malheureuse que j'ai vécu avec la localisation sous Android 6.0 et les conclusions techniques que j'en tire.
Je n'active jamais la localisation sur mon smartphone. Ça fait même des années que ça dure et je ne m'en porte pas plus mal. Bien sûr il m'arrive de l'activer lorsque j'ai besoin d'un accès ponctuel à Google Map mais je l'arrête dès que je n'en ai plus besoin. Donc: non je n'utilise pas Waze, non je ne m'attends pas à ce que mon smartphone me dise qu'il y a des embouteillages sur mon trajet du retour et non je ne veux pas qu'il me recommande les promos du resto en bas de la rue.
Les raisons sont multiples mais la principale est le respect de ma vie privée. L'endroit où je me trouve ne regarde que moi et je ne veux pas le partager. Je confie ma position a mon opérateur (mais bon c'est Bouygues Telecom, c'est donc la famille :-) mais je ne veux pas la confier à Google ou à quelqu'un d'autres. Par ailleurs j'utilise Qwant comme moteur de recherche, Firefox comme navigateur et je privilégie les solutions Open Source quand je le peux.
C'est mon droit.
Enfin je croyais. Car ces derniers temps ce droit est sérieusement mise en cause par Android 6.0. Je vous raconte toute l'histoire.
Allo Nokia, j'ai un problème
J'utilise une montre connectée. En fait j'en ai même testé plusieurs: Pebble, Samsung Gear et en ce moment la Nokia HR (ex Withings). Une montre connectée n'a rien d'indispensable à vrai dire mais c'est pratique: j'y reçois les notifications lors d'un appel/SMS sans devoir sortir mon smartphone de ma poche et accessoirement elle comptabilise mon activité physique.
Mon smartphone est un Android. Assez récemment j'ai changé de téléphone et par la même occasion je suis passé de la version 5.0 d'Android à la version 7.0. Et soudainement j'ai eu droit à ce message sur mon application Nokia Health qui synchronise la montre connectée avec le téléphone:
"Votre géolocalisation est désactivée": ça je sais, c'est fait exprès.
"Pour synchroniser, mettez en marche la géolocalisation": ah bon ? Mais jusqu'à présent ça a toujours fonctionné. Pourquoi donc faudrait-il que la géolocalisation soit activée ? D'autant que l'application ne fourni aucune information géolocalisée, je ne vois donc pas en quoi la géolocalisation lui serait utile.
J'active donc la géolocalisation pour voir et en effet la synchronisation se déroule correctement. Je refais l'expérience plusieurs fois et effectivement il faut que la géolocalisation soit activée pour que la montre se connecte. Par contre, lorsqu'on arrête la géolocalisation alors que la montre est connectée, elle n'arrive pas à se synchroniser mais les autres fonctionnalités (notifications d'appels et de SMS) semblent fonctionner correctement.
Bon je me dis que je vais réussir à vivre avec ça mais dès que j'ai un peu de temps j'envoi quand même un mail au support Nokia pour m'étonner de ce fonctionnement qui me semble à ce moment là, lié à une mise à jour de l'application puisqu'en changeant de téléphone j'ai aussi mis à jour l'application Nokia Health.
Le support de Nokia me répond (trop) rapidement:
Il semble que j'ai affaire au niveau 1 du support: celui qui est toujours optimiste :-) Sa réponse est simple: non il n'y a pas besoin de la localisation. Bon quelques part ça me rassure mais en réalité moi je ne peux pas faire autrement qu'activer la localisation pour que l'application fonctionne, je leur répond donc avec la copie d'écran qui démontre que leur réponse n'est pas adaptée à mon cas. Deuxième réponse un jour plus tard.
Cette fois le support (niveau 2 surement) me dit que j'ai raison (il me semblait aussi :-) et me renvoi vers un lien sur la page de leur site qui indique les pré-requis pour faire fonctionner les device Nokia.
Sans surprise, il est indiqué sur cette page qu'il faut que le Bluetooth soit activé sur le smartphone pour que la synchronisation fonctionne. C'est logique puisque les montres/bracelets connectées communiquent en Bluetooth avec le smartphone.
Par contre, une petite note indique en effet que sur Android 6 et supérieur, il faut que la localisation soit activée également pour que le device soit détecté.
Cette note renvoi sur le deuxième lien de la réponse de Nokia qui n'est autre que… la release note de la version 6 d'Android !
Ooch ! un support utilisateur qui renvoi le grand public vers un site pour les développeurs: voilà qui n'est pas banal. Et ça ressemble même à un moyen de "botter en touche" dans le genre: c'est vrai vous avez raison mais ce n'est pas de notre faute c'est la faute à Android.
Mais il se trouve que je suis développeur: voilà donc un problème amusant à explorer.
Où je reprends ma casquette de développeur
L'endroit pointé sur le site de développeur Android est une petite partie de la release note Android 6 et semble assez anodine. L'explication mentionnée n'est pas complétement claire mais en gros, elle indique que pour accéder à des périphériques Bluetooth et WiFi il faut avoir la permission localisation activée pour l'application sinon l'API va retourner une valeur bidon pour l'identifiant du device (sa Mac Address).
Hmmm, ça ressemble à mon problème mais pour être franc la première idée qui me vient c'est que les développeurs Android chez Nokia sont mauvais et qu'il doit forcément y avoir un contournement possible :-)
Je fais donc un benchmark pour voir si d'autres outils connectés ont le problème et mauvaise nouvelle: le problème semble similaire pour les montres/bracelets Fitbit comme l'indique le lien sur le support Fitbit ci-dessous.
Comme pour Nokia, Fitbit indique que le problème est lié à un changement opéré par Google dans Android 6.0. Au moins les sources convergent.
Je creuse un peu plus le sujet en recherchant sur les forums de développement Android et je tombe finalement sur un bug déclaré sur la plate-forme de déclaration d'incident de Google et qui référence explicitement le problème.
La lecture est très intéressante au milieu de l'étonnement/l'agacement des développeurs face à ce problème et leur demande de revenir en arrière sur cette implémentation, il faut surtout lire la réponse "officielle" de Google:
Si je traduis la réponse: "Ce n'est pas un bug c'est un comportement voulu, on ne le corrigera pas. Le fait d'avoir l'identifiant d'un objet revient à avoir sa position, il faut donc avoir l'accès à la localisation pour accéder à la recherche d'équipement Bluetooth ou WiFi".
Il me faut un moment pour comprendre l'implication de la réponse de Google: si on a accès à l'identifiant d'un objet via Bluetooth ou WiFi, on a accès à sa localisation. Autrement dit: si vous avez téléchargé un logiciel malveillant sur votre Android il peut déterminer votre position sans que vous ayez activé votre localisation, en utilisant uniquement le Bluetooth ou le WiFi.
Hmmm, intéressant. Étudions ça en détail.
Le Bluetooth vous espionne ?
Au Spot Bouygues nous avons développé plusieurs fois des applications utilisant la technologie iBeacon. Les iBeacons sont des petits tags qui émettent en permanence en Bluetooth (Bluetooth Low Energy précisément) un identifiant. Si on place ces petits tags à des endroits précis (dans un magasin, à côté d'un objet, …) et que l'utilisateur a installé une application qui va scanner régulièrement le Bluetooth à la recherche de ces tags, il pourra être notifié quand il arrive à proximité. Ce mécanisme a été intégré dans de nombreuses applications (y compris Facebook) pour vous alerter lorsqu'il y a des promotions d'un magasin devant lequel vous passez ou pour vous proposer plus d'informations sur un article dont vous vous approchez.
Plus fort: si vous avez préalablement "mappé" une pièce, c’est-à-dire positionné précisément sur un plan de la pièce chaque iBeacon, vous avez possibilité - via des calculs de triangulation fonction de l'intensité du signal reçu de chaque iBeacon - de vous localiser précisément dans une pièce.
Le revendeur de iBeacon estimote propose même une application spécifique qui permet de réaliser ce "mapping" (voir ci-dessous).
Du coup, on peut dire qu'effectivement, sous réserve que l'on dispose d'une base de données contenant l'identifiant et la position de différentes balises Bluetooth, on peut repérer la position de l'utilisateur simplement avec son Bluetooth.
A défaut de disposer de cette base, on peut aussi déterminer son changement de position selon ce qu'on détecte ou pas le device. Prenons par exemple, le cas d'un thermostat connecté Nest. Vous avez installé ce thermostat connecté chez vous et vous vous y connectez par Bluetooth. Pour le logiciel malveillant qui utilise le Bluetooth le simple fait de savoir que vous êtes connecté à ce thermostat permet de savoir que vous êtes chez vous.
Le Bluetooth est donc potentiellement une source d'information pour la localisation.
Le WiFi vous encercle
Est-ce le cas aussi pour le WiFi que mentionne Google dans sa réponse ?
Il est impressionnant lorsque vous activez le WiFi de votre smartphone de voir le nombre de réseaux autour de vous. Peut-on imaginer que simplement en détectant les réseaux autour de vous on puisse détecter l'endroit où vous êtes ? Il suffit pour cela que l'on puisse disposer d'une carte indiquant l'endroit où se situent tous les réseaux WiFi. Et bien figurez-vous que cette carte existe.
Voici par exemple une carte, proposée par Wigle, de tous les réseaux WiFi autour du Spot Bouygues . Pour chaque réseau la carte indique son nom (souvent FreeWiFi, LiveBox, …) mais aussi son identifiant unique (Mac Address encore) et sa position GPS.
La base de données de Wigle est réalisée de manière collaborative par les utilisateurs de l'application et s'enrichi régulièrement mais il en existe beaucoup d'autres, notamment référencées ici.
En utilisant ce genre de base de données et en écoutant les accès WiFi autour de vous, il est donc simple pour une application malveillante de déterminer votre position approximative sans avoir accès à votre localisation.
Conclusion
Il est donc bien possible de géolocaliser un téléphone en utilisant du Bluetooth et/ou du WiFi. D'ailleurs, dans les versions récentes d'Android l'utilisateur peut lui-même indiquer le mode de localisation dans le paramétrage d'Android.
Ainsi on peut indiquer d'utiliser uniquement le WiFi, le bluetooth et les réseaux mobiles (c’est-à-dire l'emplacement des bornes réseaux des opérateurs mobile qui est aussi accessible dans plusieurs bases de données publiques).
Google a-t-il pour autant raison d'imposer la géolocalisation pour synchroniser sa smartwatch ?
Non, car il lui suffirait de forcer les applications à demander l'accès à la localisation pour prévenir l'utilisateur du risque potentiel mais sans l'obliger à activer effectivement la localisation dans le système.
Non, car il est possible de faire autrement en masquant ces problématiques système à l'utilisateur. Par exemple sur iOS, lors de la 1er découverte d'un périphérique Bluetooth par l'application, le système génère un identifiant unique mais masque l'identifiant interne à l'application. Ainsi seul l'utilisateur pourra retrouver le périphérique avec cet identifiant.
Dois-je donc passer sur iOS pour vivre sans géolocalisation ?