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`: Получение данных о реферере установки.
Основные компоненты и их функции:
- `MainActivity`: Основной экран, может принимать интенты для обмена данными (`android.intent.action.SEND`).
- `LinkInterceptorActivity`: Перехватывает HTTP/HTTPS и кастомные схемы (`max`) для обработки диплинков, потенциально контролируя веб-трафик.
- `CallNotifierFixActivity`: Отображает информацию о звонках на экране блокировки.
- `ContactsSyncService`: Служба синхронизации контактов.
- `NotificationTamService`, `FcmMessagingService`, `FirebaseMessagingService`: Службы для обработки push-уведомлений.
- `OneMeMediaSessionService`, `OneMeDownloadService`, `MediaProjectionService`: Службы для работы с медиа-контентом, загрузками и захватом экрана.
- `UploadService`: Служба для загрузки аналитических данных.
- `CallServiceImpl`: Служба, связанная с функциями звонков.
- `androidx.work.impl.foreground.SystemForegroundService`:
Использует службы переднего плана для `microphone|camera|location|mediaPlayback|dataSync`, что означает, что эти функции могут работать в фоне с уведомлением.
- `BootCompletedReceiver`: Запускает приложение при загрузке системы.
- `TimeChangeReceiver`: Реагирует на изменение системного времени.
- `CallsMediaButtonReceiver`: Обрабатывает нажатия на медиа-кнопки (например, на гарнитуре).
- `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