В России продолжают ужесточать меры, необходимые для самоизоляции граждан в период пандемии заболевания COVID-19, вызываемого новым коронавирусом. Впереди всех в этом плане идёт Москва, что вполне логично. Частью одной из недавно принятых мер, призванных ограничить передвижение по городу, стало мобильное приложение «Социальный мониторинг», вызвавшее ряд вопросов у специалистов по защите информации. Предлагаем изучить его изнанку и проанализировать сомнительные функции.
На днях в магазине Google Play для мобильных устройств под управлением ОС Android опубликовали приложение «Социальный мониторинг». В описании было указано, что оно предназначено «для социального мониторинга граждан и вызова помощи в экстренной ситуации».
Для авторизации требовалось предоставить абонентский номер и сфотографироваться. В интерфейсе приложения — две кнопки: вызов экстренных служб и переход на портал мэрии. По словам оппозиционера Леонида Волкова, жители г. Москвы должны будут зарегистрироваться на портале, указав «фактическое место жительства», определив «домашний район» и прикрепив собственное фото.
Приложение привлекло внимание ряда Telegram-каналов. В частности, канал «IT и СОРМ» опубликовал сообщение с просьбой провести реверс-инжиниринг «Социального мониторинга». Позже результаты декомпиляции программы появились на известном ресурсе GitHub.
В результате анализа выложенного кода удалось установить следующее.
- Данные в приложении отправляются по незашифрованному протоколу HTTP, а также отсутствует обфускация кода.
Код приложения:
public final class ConfigKt {
public static final long ALARM_JOB_PERIOD = 600000;
public static final String BUILDER_GASKAR_HOST = "http://watch.telemetry.mos.ru";
public static final long REMOVAL_FROM_HAND_JOB_PERIOD = 900000;
}
Код приложения:
public enum CustomerCategory implements KoinComponent {
PATIENT_PHONE("http://185.221.153.208", 120000, 60000),
PATIENT_WATCH("http://185.221.153.208", 120000, 60000),
BUILDER_WATCH("http://195.93.229.67:12310", 1200000, PeriodicWorkRequest.MIN_PERIODIC_FLEX_MILLIS);
…
}
- Используется множество разрешений, среди которых — доступ к местоположению, осуществление телефонных вызовов, просмотр сетевых подключений, использование камеры и т.д.
Разрешения, используемые приложением:
...android.permission.READ_PHONE_STATE"/>
...android.permission.WRITE_EXTERNAL_STORAGE"/>
...android.permission.ACCESS_FINE_LOCATION"/>
...android.permission.CAMERA"/>
...android.permission.ACCESS_COARSE_LOCATION"/>
...android.permission.INTERNET"/>
...android.permission.ACCESS_NETWORK_STATE"/>
...android.permission.RECEIVE_BOOT_COMPLETED"/>
...android.permission.BODY_SENSORS"/>
...android.permission.VIBRATE"/>
...android.permission.ACCESS_WIFI_STATE"/>
...android.permission.CHANGE_WIFI_STATE"/>
...android.permission.BLUETOOTH"/>
...android.permission.BLUETOOTH_ADMIN"/>
...android.permission.WAKE_LOCK"/>
...android.permission.CALL_PHONE"/>
...android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
...android.permission.PREVENT_POWER_KEY"/>
...com.google.android.c2dm.permission.RECEIVE"/>
...com.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE"/>
...android.permission.FOREGROUND_SERVICE"/>
...android.permission.READ_EXTERNAL_STORAGE"/>
- В приложение добавлен сервис identix.one, который предназначен для распознавания лиц. Фотоизображения передаются на адрес, принадлежащий немецкому хостинг-провайдеру Hetzner, а разработчиком данного сервиса является компания из Эстонии.
Код приложения:
public interface IdentixOneApi {
public static final Factory Factory = Factory.$$INSTANCE;
public static final String HOST = "api.identix.one";
public static final String TOKEN = "a2879be8028a654f81c5a94b7a2472e943efb927a14ede776a5f5d039717bffdffad94e14c1e68e0248be4bda355d2b747e156e508ac5fc8dadec5b600ce7bdc";
public static final String URL = "https://api.identix.one";
@Multipart
@POST("/v1/persons/search/")
@Headers({"Authorization: Token a2879be8028a654f81c5a94b7a2472e943efb927a14ede776a5f5d039717bffdffad94e14c1e68e0248be4bda355d2b747e156e508ac5fc8dadec5b600ce7bdc"})
Call<IdentixOneResponse> searchUser(@Part MultipartBody.Part part, @Part("asm") boolean z, @Part("liveness") boolean z2);
Токен API для использования сервиса identix.one:
«a2879be8028a654f81c5a94b7a2472e943efb927a14ede776a5f5d039717bffdffad94e14c1e68e0248be4bda355d2b747e156e508ac5fc8dadec5b600ce7bdc».
- При генерации QR-кода используются MAC-адрес и IMEI устройства.
Код приложения:
public static final String getID(Context context) {
Intrinsics.checkParameterIsNotNull(context, "$this$getID");
if (Build.VERSION.SDK_INT >= 29) {
return getMac(context);
}
return getImei(context);
}
public static final String getImei(Context context) {
String str;
Intrinsics.checkParameterIsNotNull(context, "$this$getImei");
if (ActivityCompat.checkSelfPermission(context, "android.permission.READ_PHONE_STATE") == -1)
{
LogKt.toLog$default("Request IMEI failed", (String) null, (String) null, (String) null, 7, (Object) null);
return FAIL_IMEI;
}
Разработчиком приложения «Социальный мониторинг» является компания «Гаскар Интеграция». Согласно информации в СМИ, у неё есть контракты на общую сумму 180 млн рублей, заключённые с Департаментом информационных технологий города Москвы.
На текущий момент программа удалена из магазина Google Play, однако, как было отмечено выше, на GitHub можно ознакомиться с исходным кодом разобранного приложения.