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ázev | Android | iOS | Popis |
|---|---|---|---|
| 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.