Ne faites pas confiance à la géolocalisation !

Avez-vous déjà utilisé la localisation sur votre ordinateur ? Il y a des chances que oui : Mac OS X intègre Core Location depuis Snow Leopard et OS X Mavericks va intégrer une application Plans. Dans Google Maps, un petit bouton permet de se positionner directement sur une carte, et ça marche généralement assez bien. Mais avez une vague idée de la façon dont cela fonctionne et savez-vous qu’il est assez simple de fausser complètement cette localisation ?

Avant de commencer, une petite vidéo du résultat : Google Maps se perd dès que je lance mon programme sur le Raspberry Pi.

Comment ça marche ?

Commençons par un peu d’histoire : votre appareil a un récepteur GPS. Il va donc capter différents satellites et effectuer une triangulation : on connaît la distance entre vous et ces satellites, il est donc assez simple de vous positionner sur une carte. Le problème, c’est que c’est assez lent : capter les différents satellites peut prendre plusieurs minutes.

Pour régler ce problème, les smartphones ont intégré une technologie qui permet de se localiser rapidement, en utilisant deux techniques distinctes.

La première, c’est une localisation en utilisant les antennes du réseau mobile. C’est la technique utilisée dans les films (et la réalité) pour trouver des personnes disparues. Le principe est simple : on connaît la position exacte de l’antenne et on peut calculer (estimer, en fait) la distance entre l’antenne et votre appareil, ce qui permet de trianguler une position. C’est peu précis — il y a rarement beaucoup d’antennes visibles et la distance est estimée de façon grossière — mais c’est suffisant pour certains services comme la gestion des fuseaux horaires, de la météo, etc. Autre souci de cette technique, il faut un appareil doté d’une puce GSM.

La seconde méthode, utilisée dans les ordinateurs, les tablettes et les smartphones, utilise les réseaux Wi-Fi. Le principe reste le même : une triangulation sur la position des réseaux Wi-Fi. C’est souvent plus efficace que le réseau mobile : il n’est pas rare de capter une dizaine de réseaux Wi-Fi différents. Il existe trois bases différentes : celle de Skyhook (utilisée par Apple dans les vieilles versions d’iOS), celle de Google, construite en partie avec les véhicules de Street View, et celle d’Apple, construite en crowdfunding à partir des appareils iOS et utilisée depuis iOS 4.

Sur un Mac, Firefox et Chrome utilisent la base de Google, les autres applications (Safari, Plans sous Mavericks, etc.) utilisent la base d’Apple, via Core Location intégré à l’OS.

Les problèmes…

Avant même de parler de l’attaque, on peut parler des faux positifs. Le cas le plus courant — ça m’est arrivé — est le déménagement : si vous déplacez votre point d’accès Wi-Fi, les bases des opérateurs ne sont tout simplement pas à jour. Et s’il y a peu de réseau Wi-Fi, la localisation sera faussée : votre point d’accès étant toujours localisé à votre ancienne adresse, la localisation continuera à considérer que vous n’avez pas bougé. La solution — en tout cas chez Apple — est de brancher un appareil avec un GPS physique (iPhone, iPad 3G), de lancer Plans, activer le Wi-Fi et d’attendre. La base d’Apple est mise à jour périodiquement en prenant en compte les données renvoyées par les appareils iOS et si votre iPhone capte vos réseaux, la base sera mise à jour avec la bonne position, plus ou moins rapidement.

Le second cas de faux positifs, c’est les routeurs 3G (MiFi) : les bases peuvent les référencer, alors qu’ils n’ont pas une position fixe. Il n’y a pas de solution à ma connaissance chez Apple pour éviter le référencement, alors que Google propose d’ajouter _nomap à la fin du nom du réseau pour supprimer le routeur de la base.

… et l’attaque

Vous voyez peut-être où je veux en venir : si la localisation utilise des réseaux Wi-Fi… il suffit d’émettre de faux réseaux Wi-Fi. Le modus operandi n’est pas nouveau : en 2008, un papier expliquait comment fausser les résultats et en 2011, un hacker montrait une vidéo de l’attaque. J’ai juste simplifié les choses en utilisant un Raspberry Pi et une simple carte Wi-Fi (un modèle puissant, environ 25 €). Dans la première attaque, il fallait du matériel onéreux et un logiciel écrit spécialement pour attaquer les iPhone, et dans la seconde, l’auteur plaçait l’appareil dans une cage de faraday pour simplifier les choses, alors que dans mon cas, il y a moins de 100 € de matériel et ça fonctionne sans précautions particulières.

Ce qu’il faut

Pour le matériel : un Raspberry Pi (ou une machine sous Linux quelconque) et une carte Wi-Fi compatible avec l’injection (typiquement les RaLink en USB). Typiquement, vous pouvez trouver le tout pour un prix assez faible, le Raspberry Pi à partir de 25 €, une carte SD, une alimentation et une carte Wi-Fi pour une dizaine d’euros.

Pour le logiciel : Aircrack-NG, MDK3 (ça se trouve là et là comment l’installer). Il y a même des distributions dédiées qui intègrent directement les outils.

Enfin, il vous faut une liste de réseaux Wi-Fi. Deux solutions : la première, c’est de se déplacer dans l’endroit que vous voulez simuler (dans mon cas, mon travail) et de lancer une analyse Wi-Fi avec l’outil de diagnostic de Mac OS X. La seconde, moins précise mais plus pratique, c’est d’utiliser les services de Wigle, une base de données publique de la localisation des points d’accès Wi-Fi. Il suffit de faire une recherche sur un lieu et vous obtiendrez une liste de points d’accès.

L'Atomium à Bruxelles

L’Atomium à Bruxelles

Une fois que vous avez la liste, il suffit de faire un fichier texte contenant l’adresse MAC des points d’accès suivie d’un SSID. Le SSID n’a pas d’importance, les différentes bases de données utilisant uniquement l’adresse MAC. Vous pouvez mettre le SSID de votre choix, par exemple pour cacher votre attaque. Attention, si vous mettez un SSID déjà présent, ça peut poser des soucis de connexion.

Par exemple :

aa:bb:cc:dd:ee:ff Faites moins de bruit à 3 heures du matin
bb:cc:dd:ee:ff:aa Van de surveillance de la DGSE
cc:dd:ee:ff:aa:bb Skynet

Point important : le but est fausser la localisation, donc il faut un nombre conséquent de réseaux Wi-Fi. À mon travail, j’ai 25 réseaux Wi-Fi visibles depuis mon Mac, donc il en faut au moins le double pour que la localisation soit vraiment faussée (j’ai du monter à 65 faux réseaux pour que ça marche). Dans ma campagne, où je capte 6 réseaux Wi-Fi, il suffit d’en générer une vingtaine pour que ça fonctionne. L’attaque est donc bien plus efficace en campagne ou dans les zones où le Wi-Fi est rare.

Une fois qu’on a un fichier test, il suffit de lancer MDK3 après avoir passé la carte en mode moniteur. mon0 est la carte Wi-Fi, meswifi.txt le fichier contenant la liste des réseaux, -g indique qu’on ajoute des réseaux à la norme 11g et -t qu’on simule des réseaux protégés.

sudo mdk3 mon0 b -v meswifi.txt -g -t

La commande va simplement générer de faux réseaux Wi-Fi, que les appareils alentour vont voir. Attention à ne pas dépasser la centaine de réseaux, certaines cartes Wi-Fi ont tendance à planter s’il y a trop de réseaux.

Dans une zone avec beaucoup de réseaux (en centre-ville, plus de 25 réseaux visibles), l’efficacité est moyenne, erratique, parce que la localisation de base est efficace. Dans une zone avec peu de réseaux (chez moi), la localisation est faussée en quelques secondes.

L’attaque marche parfaitement sur tous les appareils qui utilisent le Wi-Fi pour se positionner : ordinateurs (avec la base de Google ou celle d’Apple), iPod touch, iPad Wi-Fi. Elle marche partiellement sur les appareils qui utilisent une localisation GSM (iPhone, iPad 3G, etc.) ou un vrai GPS. Avec un iPhone, par exemple, ça fonctionne en intérieur dans des zones mal couvertes, mais en extérieur, le GPS prend rapidement le pas sur la localisation Wi-Fi.

Le précepte du jour est donc… ne faites pas confiance à la localisation. Je vous rappelle d’ailleurs qu’il existe d’autres techniques pour fausser la localisation d’un appareil…