Критичность: ВЫСОКИЙ
Способ обнаружения: DAST, SENSITIVE INFO

Описание

Android предоставляет приложениям возможность выводить информацию в системный журнал. Приложения могут отправлять информацию в журнал, используя класс android.util.Log.

До Android 4.0 любое приложение с разрешением READ_LOGS могло получать доступ ко всему системному логу (включая системные логи и логи других приложений). После Android 4.1 спецификация разрешения READ_LOGS была изменена, и приложение может получить доступ только к своим данным. Однако, подключив устройство Android к ПК, можно получить вывод системного журнала из других приложений.

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

Класс android.util.Log предоставляет ряд возможностей для вывода информации:

  • Log.d (Debug)

  • Log.e (Error)

  • Log.i (Info)

  • Log.v (Verbose)

  • Log.w (Warn)

Так же возможно использование аналогичных по функциональности библиотек (Одной из популярных является Timber). 

Пример уязвимого кода
Log.d("authorize", "Login Success! access_token="
      + getAccessToken() + " expires="
      + getAccessExpires());

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

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

Одним из распространенных решений является объявление и использование пользовательского класса логирования, для автоматического включения / выключения вывода информации в системный журнал в зависимости от типа сборки (release / debug).

if (BuildConfig.DEBUG) {
    	 ...
    	serverEditText.setText("http://test.test");
    	loginEditText.setText("user_test");
    	passwordEditText.setText("12345");
    	...
    }

Так же хорошей практикой является использование ProGuard для удаления определенных вызовов логирования. Для исключения из релизной сборки логирования из библиотек Timber и android.util.Log

 

Пример настроек Proguard
-assumenosideeffects class android.util.Log {
    public static boolean isLoggable(java.lang.String, int);
    public static int v(...);
    public static int i(...);
    public static int w(...);
    public static int d(...);
    public static int e(...);
}
-assumenosideeffects class timber.log.Timber* {
    public static *** v(...);
    public static *** d(...);
    public static *** i(...);
    public static *** e(...);
    public static *** w(...);
}

 

Включение использования Proguard для релизной сборки приложения
buildTypes {
    releaseSomeBuildType {
        ...
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'your-proguard-file.pro'
    }
} 
Следующая Небезопасные настройки в AndroidManifest.xml
Содержание: