Уязвимый Казнет и не только / iOS
-Как ломаются гео-ограничения в iOS?
Уже достаточно давно занимаюсь тестированием iOS приложений и периодически сталкиваюсь с ситуацией, когда разработчики вводят ограничения функционала, опираясь исключительно на GPS координаты устройства. Чаще всего это используется для региональных ограничений: доступ к функциям, платежам или контенту разрешён только в определённой стране. На практике такая защита оказывается довольно слабой, поскольку координаты устройства можно подменить даже на полностью легитимном iPhone без Jailbreak
Можно использовать инструмент pymobiledevice3, который взаимодействует с устройством через стандартные developer сервисы iOS. Сначала необходимо активировать режим разработчика и подключить iPhone по USB. Заметил, что режим разработчика может отсутствовать в меню настроек, в таком случае его можно попробовать активировать командой
python3 -m pymobiledevice3 amfi enable-developer-modeПосле подготовки запускается туннель к developer сервисам устройства. В одном терминале выполняется команда:python3 -m pymobiledevice3 remote tunneldПроцесс остается запущенным обеспечивая соединение с сервисами разработчика на устройстве.
Параллельно во втором терминале можно отправлять команды симуляции геолокации. Например, можно подменить координаты устройства на координаты Пекина:
python3 -m pymobiledevice3 developer dvt simulate-location set -- 39.9027481 116.4008192После выполнения команды система начинает отдавать приложениям подменённые координаты, и большинство приложений будет воспринимать их как реальные данные GPS.
Для пробного тестирования я использовал приложение банка, в котором возможность проведения платежей была ограничена территорией Китая. Логика ограничения была реализована достаточно просто: приложение проверяло координаты устройства и, если они находились за пределами страны, функция оплаты становилась недоступной. После подмены координат на точку в Китае приложение начинало считать, что устройство действительно находится в нужном регионе, и платежная функция становилась активной, несмотря на то что физически устройство находилось в другой стране.
Иногда разработчики пытаются усложнить такую защиту и добавляют дополнительные проверки, например флаг isSimulatedBySoftware, который может указывать на программную симуляцию геолокации. Однако и этот механизм сам по себе не является надежной защитой, поскольку он также опирается на данные устройства и может быть обойден.
Если разработчик хочет реализовать географические ограничения, опираться только на GPS недостаточно. Более надёжный подход использовать несколько источников. Например, помимо GPS координат стоит учитывать геолокацию IP адреса пользователя и системный часовой пояс. Эти параметры должны соответствовать друг другу. Если GPS показывает Китай, IP принадлежит европейскому провайдеру, а часовой пояс устройства установлен на UTC+1, это явное несоответствие, которое может указывать на попытку обхода ограничений.
Также полезно анализировать поведение перемещения пользователя. Если устройство находилось в одной стране, а через несколько секунд "оказалось" на другом континенте, это физически невозможно. Даже при авиаперелётах такие перемещения занимают часы. Поэтому на стороне сервера можно анализировать расстояние между последними известными координатами и время между их получением. Если расчётная скорость перемещения превышает реалистичные значения, такое событие можно помечать как подозрительное и ограничивать выполнение операций.
При проектировании региональных ограничений лучше рассматривать GPS не как основной механизм защиты, а лишь как один из факторов в общей системе проверки.
