ЗАЩИТА МОБИЛЬНОГО ПРИЛОЖЕНИЯ НА ANDROID ОТ РЕВЕРС-ИНЖИНИРИНГА И ПОСЛЕДУЮЩЕЙ МОДИФИКАЦИИ

PROTECTION OF MOBILE APPLICATION ON ANDROID FROM REVERSE ENGINEERING AND SUBSEQUENT MODIFICATION

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

Для множества составных частей информационной системы есть свои практики и средства управления, контроля и анализа. Но что касается мобильных приложений – тут не всё так ясно. Если в информационной системе компании ее пользователи не имеют доступа к исходным кодам и к какому-либо исполняемому файлу, то в мобильной системе у пользователя приложение установлено на самом смартфоне. Более того, не проблема найти и сам установочный/исполняемый файл приложения.

В случае android, достаточно достать файл с расширением “.apk” – это файл, выполняющий функцию установки приложения на телефон, собирающийся из исходного кода и различных ресурсов, используемых приложением. Достать его можно из системных папок или вовсе скачать где-то на сторонних порталах (основной распространитель “apk” – Play Store, не предоставляет явного “apk”, а сам инициализирует процесс установки в телефон). Если изучить структуру “apk” более детально, то можно выяснить, что он представляет собой обычный архив, состоящий из файла манифеста и скомпилированных классов исходного кода, что дает пользователю доступ ко всем данным приложения. Проблему создает и тот факт, что нативные приложения на android создаются с помощью Java/Kotlin кода, который компилируется и запускается помощью виртуальной машины Android Runtime. Все это позволяет полностью декомпилировать исходный код приложения, разобрать внутреннюю логику и модифицировать по своему усмотрению.

Для безопасности приложения нужно использовать следующие методы защиты:

  1. Обфускация кода – поскольку android приложения весьма уязвимы к ревер-инжиниргу и декомпиляции, следует запутать код настолько, насколько это возможно. Основной инструмент для обфускации и оптимизации кода в android – ProGuard. Все операции ProGuard можно разделить на 3 категории:
    1. Code shrinking – Proguard удаляет весь лишний неиспользуемый код, что сокращает размер приложения.
    2. Optimisation – кроме избавления от ненужного кода, Proguard оптимизирует остальной код. В его арсенале имеется control flow analysis, data-flow analysis, partial evaluation, static single assignment, global value numbering, liveness analysis. Proguard также умеет выполнять peephole-оптимизации, уменьшать количество аллокаций переменных, упрощать хвостовые рекурсии и многое другое. Помимо таких общих операций, у Proguard есть оптимизации, полезные именно для Android-платформы.
    3. Obfuscation – Proguard превращает весь код приложения в нечитабельный для человека текст, переименовав все классы, методы и поля в наборы случайных букв.

Proguard работает в 3 шага в последовательности: code shrinking → optimization → obfuscation. Каждый из шагов опциональный.

  1. В случае, если существует взаимодействие с сервером – необходимо вынести весь важный функционал и хранение чувствительных данных на сторону сервера. Приложение в любой момент сможет запросить выполнение какой-либо функции и данные, а так же сервер сможет проверять корректность данных. Также, все операции следует выполнять по зашифрованному каналу передачи информации.
  2. При взаимодействии с сервером или сторонним API следует использовать ключи доступа, ключи API, защитные заголовки. Необходимо сразу разработать правильную архитектуру, которая позволит валидировать устройство.
  3. Если в приложении отсутствует сервер в качестве звена взаимодействия, и вынести чувствительный функционал не имеет возможности, можно воспользоваться NDK. NDK (Native Development Kit) – это набор инструментов, которые позволяют реализовать часть вашего приложения используя такие языки как С/С++. Связь с приложением следует осуществлять с помощью JNI. JNI (Java Native Interface) – стандартный механизм для запуска кода, под управлением виртуальной машины Java, который написан на языках С/С++ или Assembler, и скомпонован в виде динамических библиотек, позволяет не использовать статическое связывание. Это даёт возможность вызова функции С/С++ из программы на Java/Kotlin, и наоборот.
    Обусловлено это тем, что декомпиляции и реверс-инжиниринг C/C++ кода намного трудозатратнее, чем Java/Kotlin. А профилировать его еще сложнее.
  4. Следует подписывать приложение индивидуальными и уникальными ключами разработчика. Следует задавать трудно-подбираемый пароль и ключ. Также ключи и пароли необходимо хранить в безопасности и избегать утечки.
  5. Для предотвращения модификации приложения необходимо проверять целостность и сигнатуру всех модулей и всего приложения в целом. Кроме проверки внутри приложения следует осуществлять проверку и при обращении к серверу.
  6. При наличии авторизационного модуля в приложение необходимо гарантировать его корректную работу и безопасность передаваемых/получаемых данных. В случае, если используется сторонние способы авторизации, необходимо проверять сторонние сервисы на предмет уязвимости. Также не следует доверять важный функционал пользователям, которые были авторизированны через такие сервисы.
  7. Следует аккуратно использовать встроенные API операционной системы Android, которые могут сделать приложение уязвимым. Из наиболее часто встречающегося:
    1. Широковещательный broadcast receiver – в случае, если принимаемые данные никак не фильтруются и не идентифицируются, злоумышленник может послать вредную нагрузку и  эксплуатировать приложение.
    2. Неявный intent – как и в случае с broadcast receiver следует фильтровать и валидировать информацию, которая поступает из intent.
  8. Общей практикой является тестирование всех видов выпускаемого приложения. Необходимо использовать современные методы и практики для осуществления модульного, общего и интеграционного тестирования.
  9. Также общая практика – написание безопасного кода. Не следует использовать уязвимые и устаревшие функции, а также малоизвестные сторонние библиотеки. Хорошей практикой будет своевременное обновление всех зависимых компонент.

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

Список литературы:

  1. Daniel Regalado, Shon Harris, Allen Harper, Chris Eagle and others – Gray Hat Hacking The Ethical Hacker's Handbook, Fourth Edition — 4 издание. — 656 с. — ISBN-13: 978-0071832380
  2. Carlos M. Sessa – 50 Android Hacks — 2013г. — 216 с. — ISBN 9781617290565
  3. [Электронный ресурс] https://habr.com/ (дата обращения: 10.12.2019)
  4. [Электронный ресурс] https://xakep.ru/ (дата обращения: 10.12.2019)
  5. [Электронный ресурс] https://www.kaspersky.ru/ (дата обращения: 10.12.2019)