Вывод sensitive-информации в системный лог
Критичность: ВЫСОКИЙ | |
Способ обнаружения: 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'
}
}