Під час тестування додатка нам довелося «обійти» перевірку геолокації.
Хоча Android пропонує безліч простих способів підробки геолокації — зокрема, встановлення лише одного додатка (імітація геолокації) — існує не менше методів виявлення такої підробки. У Android сама геолокація не вважається розробниками надто надійним фактором верифікації.
Натомість на iOS її вважають більш надійною; принаймні, пересічний користувач iOS навряд чи буде створювати обліковий запис розробника та встановлювати Xcode розміром 9 ГБ. Але що, якщо це не так складно, як здається, — і насправді навіть простіше, ніж на Android?
Порівняння
Почнемо з розгляду відмінностей між методами безпеки, які можна використовувати на iOS та Android:
| Назва | Android | iOS | Опис |
|---|---|---|---|
| Перевірка поточного SSID/BSSID | + | ± | На Android доступ залежить від дозволів та обмежень щодо місцезнаходження. На iOS ви можете отримати інформацію про поточну мережу Wi-Fi лише за умови дотримання вимог Apple через NEHotspotNetwork.fetchCurrent, але не отримати список мереж поблизу. |
| Сканування SSID Wi-Fi поблизу | + | - | Android історично дозволяв сканування Wi-Fi з обмеженнями щодо дозволів, пропускної здатності та місцезнаходження. На iOS стандартний додаток не може отримати список SSID поблизу; Apple чітко заявляє, що загального API для списку Wi-Fi поблизу не існує. |
| Базова станція | + | - | Android може отримувати інформацію про стільниковий зв’язок через TelephonyManager.getAllCellInfo(), включаючи зареєстровані/активні та сусідні базові станції, з ACCESS_FINE_LOCATION та підтримкою радіоканалів для телефонії. Результати можуть зберігатися в кеші, мати обмеження швидкості, бути недоступними або частково недоступними залежно від пристрою, оператора, версії ОС та дозволів. iOS не надає загальнодоступного API, безпечного для App Store, для отримання ідентифікаторів обслуговуючих/сусідніх базових станцій, LAC/TAC, потужності сигналу або списку сусідніх базових станцій. CoreTelephony надає обмежену інформацію про оператора/постачальника послуг, а не дані сканування радіосигналів на рівні базових станцій. |
Виходячи з цього, практично кожен додаток для Android може додатково запитувати дані про найближчі мережі та використовувати їх для внутрішньої геолокації через сторонні сервіси. Ці дані можна підробити, і вони не є надійним показником.
На iOS ситуація дещо інша, і вимоги до додатків також дещо відрізняються. Крім того, використання цих даних для геолокації прямо заборонено. У будь-якому разі ці дані можна підробити за допомогою пристрою, що виступає точкою доступу до мережі.
Жодна з платформ не має прямого способу виявлення режиму розробника, але на Android існують детектори функції «Mock Location».
Location.isMock() — на Android.
CLLocation.sourceInformation?.isSimulatedBySoftware — на iOS.
На Android будь-який додаток, який ви оберете для Mock Location, матиме встановлений прапорець location.isMock=true прапорець, якщо пристрій не має root-доступу. Однак у поєднанні з функцією deviceIntegrity це теоретично можна уникнути або значно ускладнити.
На iOS, однак, ситуація інша. CLLocation може генеруватися самим додатком; тобто, якщо ви використовуєте сторонній інструментарій, відмінний від Xcode, ви можете видалити isSimulatedBySoftware=true
Саме цим ми й скористаємося. Ми також не будемо використовувати жодного пропрієтарного програмного забезпечення — лише інструменти з відкритим кодом. Тож ніякого Xcode, iTools чи 3uTools.
Рішення: pymobiledevice3
Встановлення
У вас має бути встановлено Python версії 3.9 або вище.
0. У терміналі виконайте: python3 -m pip install -U pymobiledevice3
1. Розблокуйте пристрій
2. Підключіть його до комп’ютера через USB і надайте доступ
3. Натисніть «Довіряти» для цього ПК
4. Увімкніть режим розробника: pymobiledevice3 amfi enable-developer-mode
Якщо це не спрацювало з першого разу, можливо, доведеться перезапустити пристрій і повторити кроки 1–4.
5. Перейдіть у «Налаштування» -> «Безпека та конфіденційність» -> «Безпека» -> «Режим розробника»
6. Перевіримо, чи розпізнається наш пристрій: pymobiledevice3 usbmux list
відповідь має бути такою:
[
{
"BuildVersion": "23F84",
"ConnectionType": "USB",
"DeviceClass": "iPhone",
"DeviceName": "******",
"Identifier": "0000000-00000000000000",
"ProductType": "iPhone17",
"ProductVersion": "26.5.2",
"UniqueDeviceID": "0000000-00000000000000"
}
]Пристрій виявлено.
7. Виберемо та підключимо образ диска розробника для iPhone
pymobiledevice3 mounter auto-mount
Після успішного підключення можна надіслати команду:
pymobiledevice3 developer dvt simulate-location set --userspace -- <LAT> <LONG>
Тепер ви можете відкрити будь-який додаток, і він відобразить ваше геоположення у вибраній точці.
Висновок
Ми обійшли заходи безпеки та отримали доступ до функцій, які не мали бути доступними на цьому пристрої. Ми підготували рекомендації щодо покращення безпеки та запобігання певним сценаріям.
Дякую за увагу, і наостанок хотів би додати: не покладайтеся на користувацьке середовище — його завжди можна підробити.