Во время тестирования приложения нам пришлось «обойти» проверку геолокации.
Хотя 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 флаг, если устройство не рутировано. Однако в сочетании с 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>
Теперь вы можете открыть любое приложение, и оно отобразит ваше местоположение в выбранной точке.
Заключение
Мы обошли меры безопасности и получили доступ к функциям, которые не должны были быть доступны на этом устройстве. Мы подготовили рекомендации по повышению безопасности и предотвращению подобных ситуаций.
Спасибо за внимание, и в заключение я хотел бы добавить: не полагайтесь на пользовательскую среду — её всегда можно подделать.