July 23

MAX: мессенджер или инструмент для слежки? | Credit: Rigolit

Наши коллеги из Rigolit подготовили интересный анализ мессенджера MAX. Статья раскрывает сбор персональных данных (возраст, пол, контакты, email, телефон), системные разрешения на Android (доступ к камере, микрофону, геолокации).

Введение

Мы решили провести исследование и выяснить как MAX приобрел функцию общения в мессенджере и кросс-платформенность под инициативой РКН.

Начнем по порядку. Как разработчики позиционируют MAX:

Быстрый и лёгкий мессенджер для общения. Заявлены функции высокого качества звонков, анимированные стикеры, отправка файлов до 4 ГБ, а также наличие чат-ботов и мини-приложений. Распространяется на различных платформах: Android (через Google Play, RuStore, AppGallery), iOS (через App Store) и десктопные версии.

Разбор

Теперь начнем погружаться глубже, приступим к разбору версии на смартфон.

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

  • Собираемые данные (модуль MyTracker):

com.my.tracker (судя по MyTracker.java, MyTrackerConfig.java, MyTrackerParams.java) - отвечает за обширный сбор пользовательских данных и событий.

Основные категории собираемых данных

Пользовательские события:

  • Рекламные события (trackAdEvent): Информация о взаимодействии с рекламой.
  • События покупок (trackAppGalleryPurchaseEvent, trackPurchaseEvent): Детали о приобретениях, включая ID продукта, цены, валюты, и дополнительные параметры.
  • Общие пользовательские события (trackEvent): Универсальный сбор произвольных событий с настраиваемыми параметрами (например, название события, категория, значение).
  • События приглашений (trackInviteEvent): Отслеживание приглашений пользователей.
  • Запуски приложений (trackLaunchManually): Фиксация каждого ручного запуска приложения.
  • События уровней (trackLevelEvent): Прогресс пользователя по уровням.
  • События входа (trackLoginEvent): Информация о входах пользователя, включая ID и метод входа.
  • События мини-приложений (trackMiniAppEvent): Активность пользователя в мини-приложениях.
  • События регистрации (trackRegistrationEvent): Детали о процессе регистрации пользователя.
  • Время, проведенное в приложении/на событии (incrementEventTimeSpent, startAnytimeTimeSpent, stopAnytimeTimeSpent, startForegroundTimeSpent, stopForegroundTimeSpent): Детальная статистика использования приложения.

Персональные данные пользователя:

  • Возраст (getAge, setAge).
  • Пол (getGender, setGender).
  • Пользовательские ID (getCustomUserId/getCustomUserIds, setCustomUserId/setCustomUserIds).
  • Адреса электронной почты (getEmail/getEmails, setEmail/setEmails).
  • ID из мессенджеров и соцсетей: ICQ ID (getIcqId), OK.ru ID (getOkId), VK Connect ID (getVkConnectId), VK ID (getVkId).
  • Номера телефонов (getPhone/getPhones, setPhone/setPhones).
  • Язык интерфейса (getLang, setLang).
  • Специальные ID, связанные с MRGS (getMrgsAppId, getMrgsId, getMrgsUserId).
  • Произвольные кастомные параметры (getCustomParam, setCustomParam): Позволяют разработчикам собирать любую дополнительную информацию.

Данные атрибуции:

  • Диплинки (getDeeplink из MyTrackerAttribution): Источники перехода пользователя в приложение (например, из рекламных кампаний или внешних ссылок).

Глубокий анализ

Данные системы и действия с ней (AndroidManifest.xml):

Файл AndroidManifest.xml описывает запрошенные разрешения и компоненты, которые позволяют приложению взаимодействовать с операционной системой и собирать системные данные.

Основные запрашиваемые разрешения:

Доступ к местоположению:

  • android.permission.INTERNET: Полный доступ к сети
  • android.permission.ACCESS_WIFI_STATE, android.permission.ACCESS_NETWORK_STATE, android.permission.CHANGE_NETWORK_STATE, android.permission.CHANGE_WIFI_STATE: Доступ к состоянию Wi-Fi и сотовой сети, возможность изменять их состояние.
  • android.permission.ACCESS_FINE_LOCATION, android.permission.ACCESS_COARSE_LOCATION: Получение точного и приблизительного местоположения пользователя (GPS, Wi-Fi, сотовые сети).

Доступ к данным пользователя:

android.permission.READ_CONTACTS, android.permission.WRITE_CONTACTS: Чтение и изменение списка контактов.

Чтение и изменение списка контактов:

  • android.permission.GET_ACCOUNTS, android.permission.AUTHENTICATE_ACCOUNTS, android.permission.MANAGE_ACCOUNTS, android.permission.USE_CREDENTIALS: Доступ к учетным записям на устройстве, управление ими и использование учетных данных.
  • android.permission.READ_PHONE_NUMBERS: Чтение телефонных номеров с устройства.
  • android.permission.READ_EXTERNAL_STORAGE, android.permission.WRITE_EXTERNAL_STORAGE (до SDK 28/32): Чтение и запись файлов.
  • android.permission.READ_MEDIA_IMAGES, android.permission.READ_MEDIA_VIDEO, android.permission.READ_MEDIA_VISUAL_USER_SELECTED: Доступ к изображениям и видео.

Доступ к аппаратным возможностям:

  • android.permission.CAMERA: Доступ к камере.
  • android.permission.RECORD_AUDIO: Доступ к микрофону для записи звука.
  • android.permission.BLUETOOTH, android.permission.BLUETOOTH_ADMIN, android.permission.BLUETOOTH_CONNECT: Полный контроль над Bluetooth-соединениями.
  • android.permission.USE_BIOMETRIC, android.permission.USE_FINGERPRINT: Использование биометрических данных (отпечатков пальцев).

Управление системой и уведомлениями:

  • android.permission.POST_NOTIFICATIONS: Отправка уведомлений.
  • android.permission.SYSTEM_ALERT_WINDOW: Отображение контента поверх других окон.
  • android.permission.RECEIVE_BOOT_COMPLETED: Автозапуск при включении устройства.
  • android.permission.WAKE_LOCK: Предотвращение перехода устройства в спящий режим.
  • android.permission.DISABLE_KEYGUARD: Отключение блокировки экрана.
  • android.permission.MODIFY_AUDIO_SETTINGS: Изменение настроек звука.
  • android.permission.REQUEST_INSTALL_PACKAGES: Запрос на установку других приложений.
  • android.permission.DOWNLOAD_WITHOUT_NOTIFICATION: Загрузка файлов без уведомлений.
  • Разрешения для работы со значками уведомлений на различных лаунчерах (Samsung, Sony, Huawei, Oppo, HTC и другие).

Интеграция с сервисами Google:

  • com.google.android.gms.permission.AD_ID: Доступ к рекламному идентификатору Google.
  • com.android.vending.BILLING: Работа с платежной системой Google Play.
  • com.google.android.c2dm.permission.RECEIVE: Получение push-уведомлений.
  • com.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE: Получение данных о реферере установки.

Основные компоненты и их функции:

  • MainActivity: Основной экран, может принимать интенты для обмена данными (android.intent.action.SEND).
  • LinkInterceptorActivity: Перехватывает HTTP/HTTPS и кастомные схемы (max) для обработки диплинков, потенциально контролируя веб-трафик.
  • CallNotifierFixActivity: Отображает информацию о звонках на экране блокировки.

Service:

  • ContactsSyncService: Служба синхронизации контактов.
  • NotificationTamService, FcmMessagingService, FirebaseMessagingService: Службы для обработки push-уведомлений.
  • OneMeMediaSessionService, OneMeDownloadService, MediaProjectionService: Службы для работы с медиа-контентом, загрузками и захватом экрана.
  • UploadService: Служба для загрузки аналитических данных.
  • CallServiceImpl: Служба, связанная с функциями звонков.
  • androidx.work.impl.foreground.SystemForegroundService: Использует службы переднего плана для microphone|camera|location|mediaPlayback|dataSync, что означает, что эти функции могут работать в фоне с уведомлением.

Receiver:

  • BootCompletedReceiver: Запускает приложение при загрузке системы.
  • TimeChangeReceiver: Реагирует на изменение системного времени.
  • CallsMediaButtonReceiver: Обрабатывает нажатия на медиа-кнопки (например, на гарнитуре).

Provider:

  • FileProvider, NotificationsImagesProvider: Предоставляют контролируемый доступ к файлам.

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

Более подробный отчет: https://mega.nz/file/zJYnAZ7S#6rlkFPSFcp7Nz4B5cDkTvscwj0N8iuUvgD0nyTysjhM

Рассмотрение MAX-мессенджера на Windows

Установщик у MAX расширения .msi, что нестандартно для приложений такого типа. Более подробно о .msi можно почитать здесь

Переходим ко вскрытию этого установщика в нашей виртуальной среде, чтобы проследить всю картину разом. Для этого воспользуемся утилитой, названной msitools:

$ msitools max.msi

Получаем огромное количество файлов, и главный max.exe. В основном мы имеем большое количество .dll-файлов, также имеется qml-директория, содержащая все нужное для Qt, и директории Resources/Translations. Они нас не особо сильно интересуют.

И начнем, традиционно, с характеристик для .exe-файла. Следует написать небольшой bash-скрипт, чтобы сразу и без танцев с бубнами точно выделить все нужное нам поле информации: основные зависимости(депенденсы), тип файла, его экспорты. Представлю этот bash-скрипт здесь, да, я использовал нативный линукс. Я понимаю, что IDA и прочие GUI-обладающие программы могут быть вам удобнее.

#!/bin/bash
if [ $# -ne 1 ]; then
echo "Usage: $0 <file.dll or file.exe>"
exit 1
fi
FILE=$1
echo "определим тип файла..."
file $FILE
echo "вытянем строки..."
strings $FILE > "${FILE}_strings.txt"
echo "ищем зависимости..."
peldd $FILE > "${FILE}_dependencies.txt"
if [[ $FILE == *.dll ]]; then
echo "смотрим экспорты..."
readpe --exports $FILE > "${FILE}_exports.txt"
fi
echo "анализ гидрой..."
/opt/ghidra/support/analyzeHeadless /home/kali/ghidra_projects MyProject -import $FILE -scriptPath /path/to/scripts -postScript ExportCode.java

Пропускаем через такой скрипт наш основной EXE, дабы увидеть все основные и первоочередные зависимости в удобном нам формате.

Уже на этом этапе мы видим крайне тревожное поведение приложения: как свои зависимости оно требует ADVAPI, shell и Kernel - DLLники критического значения, в совокупности дающие полный контроль над системой. ADVAPI позволяет редактировать реестр системы, shell - управлять процессами, и это еще может быть объяснено. Однако, это сделано с прямым доступом к системе, что делает факт очень тревожным.

Рассмотрим следующие интересующие нас факты. Среди всех .dll очень сильно выделяются network.dll, logger.dll и tracer_crash_reporter.dll. Нетворк, скорее всего, имеет в себе важные логические аспекты работы с "вебом", краш репортер и логгер по всей видимости отвечают за сбор информации о работе приложения(спойлер, не только работы приложения)).

Далее рассмотрим network.dll. Когда мы пропустили этот скрипт через наш сборщик информации на баше, мы увидели, что он также тесно связан с KERNEL32.dll и logger.dll.

Внутри мы можем начать поиск по основным интересующим нас моментам. В основном, нам следует смотреть на непосредственно работу с сетью, используя ключевые слова вроде socket, http, request, QNetwork и т.д.

При рассмотрении QNetwork-ассоциированных строк мы можем увидеть "базис" работы с сетью: создание реквестов, хидеринг, гет/пост реквесты, трекеры процесса загрузки и отправки. Однако, также есть достаточно большое количество функций с бредовыми названиями, ассоциированных с QNetwork. Их названия похожи на обфусцированные.

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

При поиске по HTTP внутри этого же DLLника мы опять видим 2 функции с обфусцированными названиями, значение и роль которых не очень понятны. Тут же мы видим и странное использование Jenkins. Что Jenkins тут забыл как локально установленная вещь, зная, сколько в нем самом уязвимостей, и сколько конкретно есть сценариев его вредоносного использования? Мы можем видеть воркспейс Jenkins.

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

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

Вот так выглядят сами по себе метрики, собираемые самим EXE.

Выводы

Приложение "Макс" является чрезвычайно интрузивным. Оно не только собирает широкий спектр персональных данных пользователя (возраст, пол, контакты, email, телефон, ID в соцсетях), но и имеет обширные возможности для взаимодействия с системой Android и Windows. Способность читать установленные приложения, записывать аудио, получать точное местоположение, управлять аккаунтами, использовать камеру и даже перехватывать диплинки, а также работать в фоновом режиме с использованием различных сенсоров и системных компонентов, делает его мощным инструментом для слежки и анализа пользовательской активности. Обфускация кода дополнительно затрудняет полный и точный анализ всех его функций. Это не просто мессенджер, ЭТО - ПОЛНОЦЕННЫЙ МАЛВАРЬ.

С более подробным отчетом по мобильной версии и со всеми фото можете ознакомиться здаесь: https://github.com/ZolManStaff/MAX-deep-analysis-of-the-messenger/tree/main

Авторы статьи:

Анализ мобильной версии: @RigOlit | @jar2dll

Анализ десктоп версии: toxxxxxxed aka leaking_system