Во время тестирования приложения нам пришлось «обойти» проверку геолокации.

Хотя Android предлагает множество простых способов подделать геолокацию — в том числе установку всего одного приложения (для имитации геолокации) — существует столько же методов обнаружения такой подделки. В Android сама по себе геолокация не считается разработчиками особо надежным фактором верификации.

На iOS, однако, она считается более надёжной; по крайней мере, обычный пользователь iOS вряд ли станет создавать учётную запись разработчика и устанавливать Xcode объёмом 9 ГБ. Но что, если это не так сложно, как кажется, — и на самом деле даже проще, чем на Android?

Сравнение

Давайте для начала рассмотрим различия между методами обеспечения безопасности, которые можно использовать на iOS и Android:

НазваниеAndroidiOSОписание
Проверка текущего 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 флаг, если устройство не рутировано. Однако в сочетании с 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>

Теперь вы можете открыть любое приложение, и оно отобразит ваше местоположение в выбранной точке.

Заключение

Мы обошли меры безопасности и получили доступ к функциям, которые не должны были быть доступны на этом устройстве. Мы подготовили рекомендации по повышению безопасности и предотвращению подобных ситуаций.

Спасибо за внимание, и в заключение я хотел бы добавить: не полагайтесь на пользовательскую среду — её всегда можно подделать.