Při testování aplikace jsme museli „obejít“ kontrolu geolokace.

Zatímco Android nabízí mnoho snadných způsobů, jak geolokaci zfalšovat – včetně instalace pouhé jedné aplikace (simulace geolokace) –, existuje stejně mnoho metod, jak toto zfalšování odhalit. V systému Android není geolokace sama o sobě vývojáři považována za příliš spolehlivý ověřovací faktor.

V systému iOS je však považována za spolehlivější; přinejmenším průměrný uživatel iOS si nebude zakládat vývojářský účet a instalovat 9 GB velký Xcode. Co když to ale není tak složité, jak se zdá – a ve skutečnosti je to dokonce jednodušší než v systému Android?

Srovnání

Začněme tím, že se podíváme na rozdíly mezi bezpečnostními metodami, které lze použít v systému iOS a Android:

NázevAndroidiOSPopis
Kontrola aktuálního SSID/BSSID+±V systému Android závisí přístup na oprávněních a omezeních polohy. V systému iOS můžete zjistit aktuální Wi-Fi síť pouze v případě, že splníte požadavky společnosti Apple prostřednictvím NEHotspotNetwork.fetchCurrent, nikoli však seznam blízkých sítí.
Skenování blízkých Wi-Fi SSID+-Android historicky umožňuje skenování Wi-Fi s omezeními týkajícími se oprávnění, omezení rychlosti a polohy. V systému iOS nemůže standardní aplikace načíst seznam blízkých SSID; společnost Apple výslovně uvádí, že neexistuje obecné API pro seznam blízkých Wi-Fi sítí.
Mobilní vysílač+-Systém Android dokáže načíst informace o mobilním signálu prostřednictvím TelephonyManager.getAllCellInfo(), včetně registrovaných/aktivních a sousedních buněk, s ACCESS_FINE_LOCATION a podporou telefonního vysílání. Výsledky mohou být uloženy v mezipaměti, omezeny rychlostí, nedostupné nebo částečně nedostupné v závislosti na zařízení, operátorovi, verzi operačního systému a oprávněních. iOS neposkytuje veřejné API bezpečné pro App Store k získání ID obsluhujících/sousedních mobilních vysílačů, LAC/TAC, síly signálu nebo seznamu blízkých buněk. CoreTelephony poskytuje pouze omezené informace o operátorovi a poskytovateli služeb, nikoli data ze skenování signálu na úrovni vysílačů.

Na základě toho může prakticky každá aplikace pro Android navíc vyžádat informace o okolních sítích a využít je pro interní geolokaci prostřednictvím služby třetí strany. Tato data lze zfalšovat a nejedná se o spolehlivý indikátor.

Na iOS je situace mírně odlišná a požadavky na aplikace se také mírně liší. Rovněž výslovně zakazuje použití těchto dat pro geolokaci. V každém případě lze tato data zfalšovat pomocí zařízení fungujícího jako přístupový bod k síti.

Žádná z platforem nemá přímý způsob, jak detekovat režim pro vývojáře, ale na Androidu existují detektory pro falešnou polohu.

Location.isMock() — v systému Android.

CLLocation.sourceInformation?.isSimulatedBySoftware — v systému iOS.

V systému Android bude mít každá aplikace, kterou vyberete pro funkci Mock Location, nastaven příznak location.isMock=true nastavený příznak, pokud zařízení není rootnuté. Ve spojení s funkcí deviceIntegrity se tomu však teoreticky lze vyhnout nebo to výrazně zkomplikovat.

Na iOS je však situace odlišná. CLLocation může být generován samotnou aplikací; to znamená, že pokud používáte nástrojovou sadu třetí strany jinou než Xcode, můžete odstranit isSimulatedBySoftware=true

Toho využijeme. Nebudeme také používat žádný proprietární software – pouze open-source nástroje. Takže žádné Xcode, iTools ani 3uTools.

Řešení: pymobiledevice3

Instalace

Musíte mít nainstalovanou verzi Pythonu 3.9 nebo vyšší.

0. V terminálu spusťte: python3 -m pip install -U pymobiledevice3

1. Odemkněte zařízení

2. Připojte jej k počítači přes USB a povolte přístup

3. Klepněte na „Důvěřovat“ pro tento počítač

4. Zapněte režim pro vývojáře: pymobiledevice3 amfi enable-developer-mode

Pokud to napoprvé nefunguje, možná bude nutné zařízení restartovat a kroky 1–4 zopakovat.

5. Přejděte do Nastavení -> Zabezpečení a soukromí -> Zabezpečení -> Režim pro vývojáře

6. Zkontrolujme, zda je naše zařízení rozpoznáno: pymobiledevice3 usbmux list

odpověď by měla znít:

[
    {
        "BuildVersion": "23F84",
        "ConnectionType": "USB",
        "DeviceClass": "iPhone",
        "DeviceName": "******",
        "Identifier": "0000000-00000000000000",
        "ProductType": "iPhone17",
        "ProductVersion": "26.5.2",
        "UniqueDeviceID": "0000000-00000000000000"
    }
]

Zařízení bylo detekováno.

7. Vybereme a připojíme obraz disku pro vývojáře iPhone

pymobiledevice3 mounter auto-mount

Po úspěšném připojení můžeme odeslat příkaz:

pymobiledevice3 developer dvt simulate-location set --userspace -- <LAT> <LONG>

Nyní můžete otevřít libovolnou aplikaci a ta zobrazí vaši polohu ve vybraném bodě.

Závěr

Obešli jsme bezpečnostní opatření a získali přístup k funkcím, které by na tomto zařízení neměly být dostupné. Sestavili jsme doporučení, jak zlepšit bezpečnost a zabránit určitým scénářům.

Děkujeme za přečtení a na závěr bych rád dodal: nespoléhejte se na uživatelské prostředí – to lze vždy zfalšovat.