Android: обнаружение Frida, отключение проверки на root и Android 11

Сегодня в выпуске: восемь способов обнаружить внедрение Frida в приложение, три совета, как защитить нативные библиотеки от реверса, отключение проверки на root в подопытном приложении, защита от метарефлексии в Android 11, принцип работы Huawei Quick Apps, а также подборка инструментов пентестера и библиотек для разработчиков.

Почитать

Как обнаружить Frida

Detect Frida for Android — статья о том, как обнаружить, что приложение работает под управлением Frida (известный инструмент, позволяющий перехватить управление приложением и внедрить код). Автор приводит пять известных техник и три собственные:

  1. Поиск библиотек frida-agent и frida-gadget в файле /proc/<pid>/maps. Может закончиться неудачей, если взломщик изменит имена библиотек.
  2. Поиск в памяти нативных библиотек особых строк (как рассказано в этой статье). Взломщик может перекомпилировать Frida с измененными строками.
  3. Пройти по всем открытым TCP-портам, отправить в них dbus-сообщение AUTH и дождаться ответа Frida. Метод хорошо работает при использовании frida-server (на рутованном устройстве), но бесполезен, если приложение было перепаковано с включением в него frida-gadget (способ обычно применяется, когда невозможно получить root на устройстве).
  4. Проверить наличие специфических для Frida файлов в каталоге /data/local/tmp. Опять же взломщик может переименовать эти файлы.
  5. Проверить, открыты ли для записи исполняемые секции нативных библиотек. В нормальной ситуации это почти невозможно.
  6. Поиск потоков frida-server и frida-gadget, которые Frida запускает в рамках процесса подопытного приложения.
  7. Поиск специфичных для Frida именованных пайпов в каталоге /proc/<pid>/fd.
  8. Сравнение кода нативных библиотек на диске и в памяти. При внедрении Frida изменяет секцию text нативных библиотек.

Примеры использования последних трех техник опубликованы в репозитории на GitHub.

Обход детекта root с помощью Frida

Android Root Detection Bypass Using Objection and Frida Scripts — рассказ о способах отключить проверку на права root в подопытном приложении с помощью Frida или тулкита Objection на базе Frida.

В большинстве случаев будет достаточно либо скачать уже готовый скрипт из репозитория Frida, либо воспользоваться тулкитом Objection для отключения проверки на root:

android root disable

Однако эти способы могут не сработать, и тогда придется писать свой собственный скрипт. Для этого необходимо декомпилировать/дизассемблировать подопытное приложение и найти в нем функцию, ответственную за проверку наличия прав root на устройстве. Обычно она выглядит примерно так:

private static boolean detectmethods() {
    String[] arrayOfString = new String[10];
    arrayOfString[0] = "/system/app/Superuser.apk";
    arrayOfString[1] = "/sbin/su";
    arrayOfString[2] = "/system/bin/su";
    arrayOfString[3] = "/system/xbin/su";
    arrayOfString[4] = "/data/local/xbin/su";
    arrayOfString[5] = "/data/local/bin/su";
    arrayOfString[6] = "/system/sd/xbin/su";
    arrayOfString[7] = "/system/bin/failsafe/su";
    arrayOfString[8] = "/data/local/su";
    arrayOfString[9] = "/su/bin/su";
    int a = arrayOfString.length;
    int b = 0;
    while (a < b) {
        if (new File(arrayOfString[a]).exists()) {
            return true;
        }
        a += 1;
    }
    return false;
}

Допустим, она находится внутри класса roottest в Java-пакете com.test.test. Все, что нам нужно сделать, — подменить эту функцию на заглушку, которая всегда возвращает false. Для этого понадобится такой скрипт:

Java.perform(function () {
    var MainActivity = Java.use('com.test.test.roottest');
        MainActivity.root.implementation = function (detectmethods) {
            console.log('Done: bypassed');
            return false;
        };
}

Далее скармливаем наш скрипт Frida и запускаем под ее управлением приложение:

$ frida -l rootbypass.js -f имя.пакета.приложения

Как защитить нативную библиотеку

Security hardening of Android native code — статья, рассказывающая, как защитить от реверса нативные библиотеки в приложениях для Android.

Обычно разработчики выносят сенситивный код в нативные, написанные на языках C/C++ библиотеки, чтобы повысить производительность и затруднить реверс приложения (читать дизассемблерные листинги нативного кода гораздо сложнее, чем код smali, и тем более сложнее, чем декомпилированный с помощью того же jadx код на Java). Однако не стоит забывать, что одно лишь наличие нативного кода не остановит опытного и мотивированного взломщика, поэтому стоит использовать дополнительные средства, чтобы его запутать. Есть несколько несложных способов это сделать.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score! Подробнее

Евгений Зобнин: Редактор рубрики X-Mobile. По совместительству сисадмин. Большой фанат Linux, Plan 9, гаджетов и древних видеоигр.

Комментарии (1)

  • Хорошая подборка. Спасибо.
    Насчет детекта Frida, хочется добавить. Что если у вас стоит такая задача как определять перехват функций программы фридой. То имейте ввиду что на JAVA это будет сделать не возможно, какой бы способ вы не выбрали. Поскольку фрида работает через хук зиготы. Ей можно контролировать все что работает в JAVA. Нужно писать решения на нативе. Там есть возможность ловить fridу, до того как ваш натив не пропатчат в статике :)