Получи случайную криптовалюту за регистрацию!

#mobile #frameworks Небольшой пост про анализ защищённости мо | Пост Импакта

#mobile #frameworks

Небольшой пост про анализ защищённости мобильного приложения написанного с использованием фреймворка.
Первым делом начинаем проверку с уровня верификации MASVS-R

Для Реверса React Native:
Если вам повезло и движок Hermes не используется, то вы можете просто взять js из unzipApk/assets/index.android.bundle
Попробуйте проверить версию под iOS может быть там не использован движок и javascript находится в открытом виде.
Если движок использован на обеих платформах, можно взять hbctool — утилита для дизассемблирования байт-кода Hermes.
Также полезно будет прочитать CTF-writeup по реверсу приложения на реакте.

Для Реверса Cordova:
Применить js-beautify на unzipApk/assets/www/
Также статья про дебаг таких приложений

Для реверса Flutter:
Приложение для отладки? Проверьте исходный код в файле unzipApk/assets/flutter_assets/kernel_blob.bin
В случае когда приложение скомпилировано в release и использует AOT Snapshot: флаг obfuscate может быть не использован, тогда из файла libapp.so можно вытащить имена классов и библиотек. Иногда встречал что флаг выставлен на Android, но не на iOS.
Проект reFlutter позволяет использовать уже готовые или создавать собственные движки с патчами.
JEB добавил поддержку некоторых движков.
Несколько интересных статей.

Для реверса Ionic:
Ещё один js, разархивируем apk/ipa

Для реверса Xamarin:
Используем dotPeek на dll файле из распакованного apk
Статья, и заметка

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

Справедливо можно сказать, что большинство уязвимостей привязано к платформе, а не к движку/языку. Скорее всего это будут такие вещи как IPC или файловый/сетевой ввод-вывод. Действительно, фреймворк позволяет не допускать тех ошибок, которые обычно встречаются в нативе, но это скорее из-за "ограничений" исходящих от фреймворка. Взять хотя бы баги связанные с Intent, для того чтобы передать данные другому приложению: Flutter, React Native, Xamarin им всё равно придётся использовать нативные функции. Например во flutter, чтобы использовать intent реализован пакет android_intent_plus или вот реализация в React Native.
Intent отсылается из кода Dart посредством MethodChannel в Java функцию и в финале всё равно отправляется как android.content.Intent

....

Однажды на проекте попалось Flutter приложение, код авторизации отправлялся посредством deeplink c веб страницы через html.href="myapp://host
Быстро было создано фальшивое приложение принимающее нужную схему и перехватывающее код авторизации раньше чем оригинальное. Как результат использование фреймворка не спасло.

Это был пример IPC.
Давайте обратимся к файловой системе. Вот пример отчёта #1377748 содержащего code execution путём замены lib файла. Evernote скачивает файл на несколько каталогов назад, в папку ../../../lib-1/libjnigraphics.so Приложение слишком доверяет серверу и подставляет недопустимое имя файла вложения из заголовка content-disposition.

Кстати Content Provider тоже используется через MethodChannel и уязвимость связанная с обходом пути в _display_name о которой говорится в отчёте выше также должна работать поскольку в финале у нас всё равно android.content.ContentProvider

Но не всегда баги завязаны на платформе, действительно, возможно в скором времени будут появляться баги связанные непосредственно с фреймворками.
Помните старую багу в Android ОС http://attacker.com\\\\@legitimate.com/ , когда обратный слеш не считался за путь а хост для url был legitimate.com
Эта ошибка была здесь https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/net/Uri.java#497
Функция отвечает за парсинг Uri.
А теперь откроем исходный код flutter, здесь реализована аналогичная функция парсинга Uri, но уже на стороне dart. Разработчик скорее использует её для проверки хоста, чем cделает это на стороне Java. Если здесь допущена уязвимость — issue будет создан в репозитории flutter.