July 11

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

Независимый исследователь: @RigOlit (Zolman) • 11 июля в 1:45

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

Начнем по порядку. Как разработчики позиционируют 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`: Получение данных о реферере установки.


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

Activity:

- `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`: Предоставляют контролируемый доступ к файлам.

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

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

https://mega.nz/file/zJYnAZ7S#6rlkFPSFcp7Nz4B5cDkTvscwj0N8iuUvgD0nyTysjhM


Перейдем к рассмотрению MAX - мессенджера на Windows. При переходе на вебсайт нас встречает красивый веб-пейдж, предлагающий нам версии под Windows и MacOS.

Выбираем Windows. Начинается установка max.msi. Формат крайне интересен: установщик не в .exe нынче можно встретить довольно редко.

Но это нас особо сильно не останавливает. Мы сразу же переходим ко вскрытию этого установщика в нашей виртуальной среде, чтобы проследить всю картину разом. Для этого воспользуемся утилитой от Kali Linux, названной 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

С УВАЖЕНИЕМ КОМАНДА R͚̞I̘̺G̠͍O͎̠L̘͔I͔̝T͍͕