Lors des tests de l'application, nous avons dû « contourner » le contrôle de géolocalisation.
Si Android propose de nombreux moyens simples de falsifier la géolocalisation — notamment en installant une seule application (de géolocalisation factice) —, il existe tout autant de méthodes pour détecter cette falsification. Sous Android, la géolocalisation en elle-même n’est pas considérée comme un facteur de vérification très fiable par les développeurs.
Sur iOS, en revanche, elle est jugée plus fiable ; à tout le moins, l’utilisateur iOS moyen ne va pas créer un compte développeur ni installer Xcode, qui pèse 9 Go. Mais que se passerait-il si ce n’était pas aussi intimidant qu’il n’y paraît — et si c’était en réalité encore plus simple que sur Android ?
Comparaison
Commençons par examiner les différences entre les méthodes de sécurité utilisables sur iOS et sur Android :
| Nom | Android | iOS | Description |
|---|---|---|---|
| Vérification du SSID/BSSID actuel | + | ± | Sur Android, l’accès dépend des autorisations et des restrictions de localisation. Sur iOS, vous ne pouvez récupérer le réseau Wi-Fi actuel que si vous répondez aux exigences d’Apple via NEHotspotNetwork.fetchCurrent, mais pas une liste des réseaux à proximité. |
| Analyse des SSID Wi-Fi à proximité | + | - | Android a toujours autorisé l’analyse Wi-Fi avec des restrictions en matière d’autorisations, de limitation de débit et de localisation. Sur iOS, une application standard ne peut pas récupérer la liste des SSID à proximité ; Apple précise explicitement qu’il n’existe pas d’API générale pour obtenir la liste des réseaux Wi-Fi à proximité. |
| Antenne-relais | + | - | Android peut récupérer des informations sur les antennes-relais via TelephonyManager.getAllCellInfo(), y compris les cellules enregistrées/actives et voisines, avec ACCESS_FINE_LOCATION et la prise en charge de la radio téléphonique. Les résultats peuvent être mis en cache, limités en débit, indisponibles ou partiellement indisponibles selon l’appareil, l’opérateur, la version du système d’exploitation et les autorisations. iOS ne fournit pas d’API publique compatible avec l’App Store permettant de récupérer les identifiants des antennes-relais desservantes/voisines, les codes LAC/TAC, la puissance du signal ou la liste des antennes-relais à proximité. CoreTelephony expose des informations limitées sur l’opérateur ou le fournisseur de services, et non des données de balayage radio au niveau des antennes-relais. |
De ce fait, pratiquement toutes les applications Android peuvent en outre demander les réseaux à proximité et les utiliser pour la géolocalisation interne via un service tiers. Ces données peuvent être falsifiées et ne constituent pas un indicateur fiable.
Sur iOS, la situation est légèrement différente, tout comme les exigences imposées aux applications. L’utilisation de ces données à des fins de géolocalisation y est d’ailleurs explicitement interdite. Quoi qu’il en soit, ces données peuvent être falsifiées à l’aide d’un appareil faisant office de point d’accès réseau.
Aucune des deux plateformes ne dispose d’un moyen direct de détecter le mode développeur, mais il existe des détecteurs de « Mock Location »
Location.isMock() — sur Android.
CLLocation.sourceInformation?.isSimulatedBySoftware — sur iOS.
Sur Android, toute application que vous sélectionnez pour la « Mock Location » verra le location.isMock=true drapeau activé si l’appareil n’est pas rooté. Cependant, en combinaison avec deviceIntegrity, cela peut théoriquement être contourné ou rendu beaucoup plus difficile.
Sur iOS, en revanche, les choses sont différentes. CLLocation peut être généré par l’application elle-même ; c’est-à-dire que si vous utilisez une boîte à outils tierce autre que Xcode, vous pouvez supprimer isSimulatedBySoftware=true
C’est ce dont nous allons tirer parti. Nous n’utiliserons pas non plus de logiciel propriétaire, mais uniquement des outils open source. Donc pas de Xcode, d’iTools ni de 3uTools.
Solution : pymobiledevice3
Installation
Vous devez disposer de Python version 3.9 ou supérieure.
0. Dans le terminal, exécutez : python3 -m pip install -U pymobiledevice3
1. Déverrouillez l'appareil
2. Connectez-le à votre ordinateur via USB et autorisez l'accès
3. Appuyez sur « Faire confiance » pour cet ordinateur
4. Activez le mode développeur : pymobiledevice3 amfi enable-developer-mode
Vous devrez peut-être redémarrer l'appareil et répéter les étapes 1 à 4 si cela ne fonctionne pas du premier coup.
5. Allez dans Paramètres -> Sécurité et confidentialité -> Sécurité -> Mode développeur
6. Vérifions si notre appareil est reconnu : pymobiledevice3 usbmux list
la réponse devrait être :
[
{
"BuildVersion": "23F84",
"ConnectionType": "USB",
"DeviceClass": "iPhone",
"DeviceName": "******",
"Identifier": "0000000-00000000000000",
"ProductType": "iPhone17",
"ProductVersion": "26.5.2",
"UniqueDeviceID": "0000000-00000000000000"
}
]Appareil détecté.
7. Sélectionnons et montons l'image disque de développement de l'iPhone
pymobiledevice3 mounter auto-mount
Une fois le montage effectué, nous pouvons envoyer la commande :
pymobiledevice3 developer dvt simulate-location set --userspace -- <LAT> <LONG>
Vous pouvez désormais ouvrir n’importe quelle application : elle affichera votre géolocalisation à l’endroit sélectionné.
Conclusion
Nous avons contourné les mesures de sécurité et obtenu l’accès à des fonctionnalités qui n’auraient pas dû être disponibles sur cet appareil. Nous avons rédigé des recommandations sur la manière d’améliorer la sécurité et de prévenir certains scénarios.
Merci de votre lecture, et pour finir, j’aimerais ajouter : ne vous fiez pas à l’environnement utilisateur, car il peut toujours être usurpé.