Критичность: ВЫСОКИЙ
Способ обнаружения: 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' } }