Универсального механизма, который полностью исключает возможность обратного анализа программы, не существует. Если код должен выполняться на пользовательском устройстве, в определенный момент он должен быть доступен процессору.
Поэтому применяется многоуровневая защита.
Обфускация кода
Обфускация — преобразование программы таким образом, чтобы сохранить ее работоспособность, но сделать внутреннюю структуру значительно сложнее для анализа человеком.
Могут использоваться:
- изменение имен классов, методов и переменных;
- усложнение управляющей логики;
- преобразование строк;
- удаление лишней отладочной информации;
- изменение структуры кода.
Обфускация не делает приложение неуязвимым, однако повышает трудоемкость его исследования.
Защита чувствительных данных
Секреты, необходимые серверной части системы, по возможности не должны находиться непосредственно в клиентском приложении.
Критически важные операции целесообразно переносить на сервер, а клиенту предоставлять только те данные и полномочия, которые необходимы для выполнения конкретной операции.
Особое внимание необходимо уделять:
- API-ключам;
- паролям;
- токенам;
- криптографическим ключам;
- конфигурационным данным;
- учетным данным технических пользователей.
Защита от отладки
Приложение может использовать механизмы обнаружения среды, характерной для динамического анализа.
Задача таких механизмов — усложнить исследование программы во время ее выполнения.
При этом полагаться исключительно на anti-debugging нельзя: квалифицированный исследователь может попытаться обойти соответствующие проверки.
Контроль целостности
Приложение может проверять, не были ли изменены его исполняемые файлы, библиотеки или критические компоненты.
При обнаружении нарушения целостности система может ограничить выполнение чувствительных операций, зарегистрировать событие или прекратить работу.
Защита от подмены среды выполнения
Для мобильных приложений дополнительным фактором риска являются устройства с root- или jailbreak-доступом, эмуляторы и инструментированные среды.
Приложение может учитывать признаки такой среды при принятии решений о выполнении критически важных операций.
Но обнаружение root или jailbreak также не должно рассматриваться как самостоятельная гарантия безопасности.
Перенос критической логики на сервер
Один из наиболее надежных архитектурных принципов — не доверять клиенту выполнение решений, от которых зависит безопасность системы.
Например, сервер должен самостоятельно проверять права пользователя, корректность операции и допустимость запрашиваемых действий, даже если аналогичная проверка уже выполняется внутри мобильного или настольного клиента.
Это соответствует общему принципу: клиентское приложение необходимо считать потенциально контролируемым атакующим.
Мониторинг и защита серверной части
Даже хорошо защищенное приложение может быть исследовано. Поэтому инфраструктура должна быть готова к попыткам использования полученной злоумышленником информации.
Необходимо контролировать аномальные запросы, злоупотребление API, необычную активность учетных записей и другие признаки потенциальной атаки.