Перейти к содержанию

Приложение не обфусцировано

Критичность: НИЗКИЙ
Способ обнаружения: SAST, APK

Описание

Исходный код приложения не обфусцирован или обфусцирован с недостаточным покрытием.

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

Рекомендации

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

Начиная с Android Gradle Plugin 3.4.0 (2019 год) штатным механизмом сжатия (shrinking), оптимизации и обфускации кода является R8. Он включён по умолчанию и пришёл на смену устаревшему компилятору ProGuard. При этом R8 совместим с форматом конфигурационных файлов ProGuard: те же файлы proguard-rules.pro и правила (директивы -keep, -dontwarn и т. п.) продолжают использоваться — поэтому в обиходе их по-прежнему называют «правилами ProGuard». Включается R8 тем же флагом minifyEnabled true для нужного типа сборки.

Важно: ProGuard как отдельный компилятор считается legacy и не поставляется с современным AGP. Самостоятельно подключать ProGuard к проекту не требуется — нужно лишь корректно настроить правила, которые применит R8.

Пример правил (формат ProGuard, применяется R8):

optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-dontpreverify
-verbose
-dump class_files.txt
-printseeds seeds.txt
-printusage unused.txt
-printmapping mapping.txt
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-allowaccessmodification
-keepattributes *Annotation*
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
-repackageclasses ''

Включение сжатия и обфускации (R8) для релизной сборки приложения:

buildTypes {
    ...
    release {
        // minifyEnabled включает R8: сжатие, оптимизацию и обфускацию кода
        minifyEnabled true
        // shrinkResources true // дополнительно удаляет неиспользуемые ресурсы
        // proguard-android-optimize.txt — базовый набор правил с включёнными оптимизациями
        // (предпочтительнее, чем proguard-android.txt)
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
}

Также хорошей практикой может служить обфускация используемых в проекте библиотек с открытым исходным кодом. Всё больше библиотек распространяются уже с готовыми конфигурационными файлами для обфускации. R8 (как и ProGuard ранее) умеет заглядывать внутрь AAR/JAR-архива, находить упакованные в нём правила (consumer-rules.pro / proguard.txt) и автоматически применять их вместе с остальными опциями. Проверьте каждую используемую библиотеку на наличие такого файла.

Если авторы библиотеки не упаковывают конфиг в архив, возможно они позаботились и написали правила на своем сайте, страничке репозитория или в README файле. Попробуйте самостоятельно найти конфиг для той версии библиотеки, которую вы используете.

Ссылки

  1. Android Developers — Shrink, obfuscate, and optimize your app (R8)

  2. Android Developers — Enable shrinking, obfuscation, and optimization

  3. Guardsquare — ProGuard Manual: Examples (формат правил)

  4. OWASP MASTG — Testing Code Quality and Build Settings (Android)

  5. OWASP MASVS — MASVS-RESILIENCE

К началу