Beim Testen der App mussten wir die Geolokalisierungsprüfung „umgehen“.
Zwar bietet Android viele einfache Möglichkeiten, den Standort vorzutäuschen – darunter die Installation einer einzigen App (Mock-Standort) –, doch gibt es ebenso viele Methoden, um diese Täuschung zu erkennen. Unter Android wird der Standort selbst von Entwicklern nicht als besonders zuverlässiger Verifizierungsfaktor angesehen.
Unter iOS gilt sie hingegen als zuverlässiger; zumindest wird der durchschnittliche iOS-Nutzer kein Entwicklerkonto einrichten und das 9 GB große Xcode installieren. Aber was, wenn es gar nicht so abschreckend ist, wie es scheint – und tatsächlich sogar einfacher ist als unter Android?
Vergleich
Betrachten wir zunächst die Unterschiede zwischen den Sicherheitsmethoden, die unter iOS im Vergleich zu Android eingesetzt werden können:
| Name | Android | iOS | Beschreibung |
|---|---|---|---|
| Abfrage der aktuellen SSID/BSSID | + | ± | Bei Android hängt der Zugriff von Berechtigungen und Standortbeschränkungen ab. Unter iOS kann man das aktuelle WLAN-Netzwerk nur abrufen, wenn man die Anforderungen von Apple erfüllt, NEHotspotNetwork.fetchCurrent, jedoch keine Liste der Netzwerke in der Nähe abrufen. |
| Scannen von WLAN-SSIDs in der Nähe | + | - | Android erlaubt seit jeher das Scannen nach WLAN-Netzwerken mit Einschränkungen hinsichtlich Berechtigungen, Drosselung und Standort. Unter iOS kann eine Standard-App keine Liste der SSIDs in der Nähe abrufen; Apple erklärt ausdrücklich, dass es keine allgemeine API für eine Liste der WLAN-Netzwerke in der Nähe gibt. |
| Mobilfunkmast | + | - | Android kann Mobilfunkdaten abrufen über TelephonyManager.getAllCellInfo(), einschließlich registrierter/bedienender und benachbarter Zellen, mit ACCESS_FINE_LOCATION Unterstützung für Mobilfunk- und Telefoniefunk. Die Ergebnisse können je nach Gerät, Netzbetreiber, Betriebssystemversion und Berechtigungen zwischengespeichert, ratenbegrenzt, nicht verfügbar oder teilweise nicht verfügbar sein. iOS stellt keine öffentliche, App-Store-konforme API zum Abrufen von IDs aktiver/benachbarter Mobilfunkmasten, LAC/TAC, Signalstärke oder einer Liste benachbarter Mobilfunkzellen bereit. CoreTelephony stellt nur begrenzte Informationen zu Netzbetreibern und Dienstanbietern bereit, jedoch keine Funk-Scan-Daten auf Basisstationsebene. |
Auf dieser Grundlage kann praktisch jede Android-App zusätzlich nach Netzwerken in der Nähe abfragen und diese über einen Drittanbieter-Dienst für die interne Geolokalisierung nutzen. Diese Daten können gefälscht werden und sind kein verlässlicher Indikator.
Unter iOS ist die Situation etwas anders, und auch die Anforderungen an Apps unterscheiden sich geringfügig. Zudem ist die Verwendung dieser Daten zur Standortbestimmung ausdrücklich untersagt. In jedem Fall können diese Daten mithilfe eines Geräts, das als Netzwerkzugangspunkt fungiert, gefälscht werden.
Keine der beiden Plattformen verfügt über eine direkte Möglichkeit, den Entwicklermodus zu erkennen, aber es gibt Detektoren für „Mock Location“.
Location.isMock() — auf Android.
CLLocation.sourceInformation?.isSimulatedBySoftware — auf iOS.
Unter Android wird bei jeder App, die Sie für „Mock Location“ auswählen, das location.isMock=true Flag gesetzt, sofern das Gerät nicht gerootet ist. In Verbindung mit „deviceIntegrity“ lässt sich dies jedoch theoretisch vermeiden oder erheblich erschweren.
Unter iOS sieht die Sache jedoch anders aus. CLLocation kann von der App selbst generiert werden; das heißt, wenn Sie ein anderes Toolkit eines Drittanbieters als Xcode verwenden, können Sie isSimulatedBySoftware=true
Genau das werden wir uns zunutze machen. Außerdem werden wir keine proprietäre Software verwenden – nur Open-Source-Tools. Also kein Xcode, iTools oder 3uTools.
Lösung: pymobiledevice3
Installation
Sie müssen Python Version 3.9 oder höher installiert haben.
0. Führen Sie im Terminal folgenden Befehl aus: python3 -m pip install -U pymobiledevice3
1. Entsperren Sie das Gerät
2. Schließen Sie es über USB an Ihren Computer an und autorisieren Sie den Zugriff
3. Tippen Sie auf „Vertrauen“ für diesen PC
4. Aktivieren Sie den Entwicklermodus: pymobiledevice3 amfi enable-developer-mode
Möglicherweise müssen Sie das Gerät neu starten und die Schritte 1–4 wiederholen, falls es beim ersten Mal nicht funktioniert.
5. Überprüfen Sie „Einstellungen“ -> „Sicherheit & Datenschutz“ -> „Sicherheit“ -> „Entwicklermodus“
6. Überprüfen wir, ob unser Gerät erkannt wird: pymobiledevice3 usbmux list
Die Antwort sollte lauten:
[
{
"BuildVersion": "23F84",
"ConnectionType": "USB",
"DeviceClass": "iPhone",
"DeviceName": "******",
"Identifier": "0000000-00000000000000",
"ProductType": "iPhone17",
"ProductVersion": "26.5.2",
"UniqueDeviceID": "0000000-00000000000000"
}
]Gerät erkannt.
7. Wählen wir nun das iPhone-Entwickler-Disk-Image aus und mounten es
pymobiledevice3 mounter auto-mount
Nach erfolgreicher Einbindung können wir den folgenden Befehl senden:
pymobiledevice3 developer dvt simulate-location set --userspace -- <LAT> <LONG>
Jetzt können Sie eine beliebige App öffnen, und diese zeigt Ihren Standort am ausgewählten Punkt an.
Fazit
Wir haben die Sicherheitsmaßnahmen umgangen und Zugriff auf Funktionen erhalten, die auf diesem Gerät eigentlich nicht verfügbar sein sollten. Wir haben Empfehlungen verfasst, wie man die Sicherheit verbessern und bestimmte Szenarien verhindern kann.
Vielen Dank fürs Lesen, und abschließend möchte ich noch hinzufügen: Verlassen Sie sich nicht auf die Benutzerumgebung – sie lässt sich immer fälschen.