Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
| SuperMax |
16.4.2026, 12:43
Сообщение
#1
|
![]() Администратор ![]() ![]() ![]() ![]() ![]() Группа: Root Admin Сообщений: 6 376 Регистрация: 7.1.2006 Из: Красноярск Пользователь №: 1 |
отсюда https://pikabu.ru/story/ kak_max_pomogaet_rkn_stroit_zheleznyiy_zanaves_vpndetekt_sbor_ip_i_proverki_na_g osuslugi_13874594 TL;DR для тех, кому лень читать
Это первая статья в цикле Я провожу полный аудит безопасности мессенджера MAX. Эта статья — про систему сбора IP и VPN-детект. Если тема зайдёт, дальше будет:
Предыстория Я занимаюсь аудитом безопасности мобильных приложений. Недавно взялся за MAX — мессенджер от VK, который активно продвигают как «замену Telegram». Скачал APK из Google Play и RuStore, декомпилировал через JADX и начал копаться в коде. При анализе сетевого трафика заметил странность: при каждом запуске приложение лезет на checkip.amazonaws.com. Это сервис Amazon, который возвращает твой внешний IP-адрес. Зачем мессенджеру знать мой IP через Amazon? Потянул за ниточку — и нашёл не баг, а целую подсистему. Спроектированную, отлаженную, с защитой от обнаружения и гарантированной доставкой данных на сервер. Это не аналитика. Это инфраструктура сетевой слежки. Часть 1: Что я нашёл Здесь — суть без кода. Что делает приложение, зачем и чем это грозит. 1. Шесть сервисов, чтобы узнать ваш IP Каждый раз, когда вы открываете MAX, приложение тайно определяет ваш внешний IP-адрес. Для этого у него есть 6 сервисов:
Но самое интересное: адреса этих сервисов спрятаны в коде. Не как обычные строки вроде "https://ip.mail.ru/", а как массивы чисел: {104, 116, 116, 112, 115, 58, 47, 47, 105, 112, 46, 109, 97, 105, 108, 46, 114, 117, 47}Каждое число — это ASCII-код буквы. 104 = «h», 116 = «t», и так далее. Получается https://ip.mail.ru/. Обычный поиск по коду (grep, strings) эти URL никогда не найдёт. Это не ошибка и не оптимизация — это намеренное сокрытие. И ещё: приложение использует для запросов не стандартную библиотеку OkHttp (которую легко перехватить), а низкоуровневые raw-сокеты (java.net.Socket). Это обходит сетевые перехватчики, прокси и мониторинг трафика. Для понимания: обычное приложение, которому нужен ваш IP для легитимных целей (например, геолокация для контента), делает один запрос через стандартную библиотеку. MAX делает 6 резервных запросов через скрытые URL по raw-сокетам. Это инженерия уровня малвари. 2. Пять проверок доступности: приложение определяет, в России ли вы Параллельно со сбором IP приложение проверяет доступность пяти хостов — может ли ваш телефон до них «дотянуться»:
Зачем? Комбинация ответов даёт VK полную картину:
3. VPN-детект: MAX знает и докладывает MAX определяет VPN через стандартный API Android. Ловит любой — NordVPN, WireGuard, OpenVPN корпоративный, встроенный. Что происходит дальше: при каждом открытии приложения VPN-статус отправляется на сервер VK вместе с вашим IP и остальными данными. Это подтверждено и анализом кода, и наблюдением трафика. VK точно знает: пользуетесь ли вы VPN, в какой момент и с какого IP. Кроме того, в коде найден виджет «Лучше без VPN» — панель, которая должна появляться во время звонков при включённом VPN. В ресурсах приложения есть строки на русском и английском. Динамически (на реальном устройстве) я это пока не воспроизводил, но код и ресурсы — на месте. 4. Полное досье при каждом открытии Каждый раз, когда вы открываете MAX (или приложение просыпается в фоне), оно собирает и отправляет на сервер VK следующие данные:
Кто: пользователь #123456789 (аккаунт MAX)Это не анонимная аналитика. Каждая запись однозначно привязана к вашему аккаунту. А поскольку VK Group владеет OK.ru, VK.com и Mail.ru — аккаунт MAX связывается с профилем ВКонтакте, почтой и другими сервисами экосистемы. Масштаб У MAX 107 миллионов зарегистрированных пользователей и 77 миллионов ежедневной аудитории (данные VK, март 2026). С сентября 2025 приложение обязательно предустановлено на все Android-устройства, продаваемые в России и Беларуси. Представьте: 77 миллионов человек открывают MAX каждый день. При каждом открытии — пакет с IP, VPN-статусом, оператором. Это десятки миллионов точек данных ежедневно: кто использует VPN, кто нет, с какого IP, через какого оператора, доступны ли заблокированные сервисы. В реальном времени. Это не просто «аналитика одного приложения». Это инфраструктура мониторинга сетевой среды в масштабе целой страны. С каждой новой блокировкой РКН данные HOST_REACHABILITY становятся ценнее — они показывают, работает ли блокировка и кто её обходит. 5. Домены Telegram и WhatsApp в коде В том же файле, где хранятся адреса активных сервисов, закодированы домены конкурентов: main.telegram.org и mmg.whatsapp.net. В текущей версии они не используются. Я не утверждаю, что проверка доступности Telegram «готова к мгновенной активации». Но сам факт — домены конкурентов лежат в одном файле с рабочей системой сбора данных — примечателен. Отдельно: MAX проверяет, установлен ли Telegram на вашем устройстве — ищет три варианта приложения: основной, бета и веб-версию. Официально это для кнопки «Поделиться» (Telegram ставится первым в списке). Подробности — в технической части ниже. 6. Сервер контролирует всё Вся система слежки управляется одним серверным флагом через систему PMS (Push Management System) от VK. Это как remote config, только мощнее: PMS-значения доставляются через постоянное TCP-соединение и применяются мгновенно. Что это значит на практике:
И ещё: данные никогда не теряются. Если отправка не удалась — 3 повтора. Если и после 3 раз не получилось — данные сохраняются в локальное хранилище и отправляются позже. При сворачивании приложения — принудительный flush всех накопленных событий. VK спроектировал это так, чтобы получить 100% собранных данных. 7. Правовая реальность Я не буду спекулировать о том, передаёт ли VK эти данные спецслужбам. Вместо этого — факты. VK/MAX — зарегистрированный «организатор распространения информации» по 149-ФЗ. По закону Яровой (374-ФЗ) он обязан хранить метаданные коммуникаций 1 год и предоставлять их по запросу. IP-адрес + userId + timestamp + VPN-статус — это именно те метаданные, которые подлежат хранению. А 276-ФЗ (поправки 2024) ужесточил ответственность за использование VPN для обхода блокировок — и HOST_REACHABILITY даёт точные доказательства: кто, когда и откуда использовал VPN. При этом IP-адрес — это персональные данные по 152-ФЗ. Согласие на такой сбор у пользователя не запрашивается. Важно: я не утверждаю, что VK злоупотребляет этими данными. Я утверждаю, что код собирает их, закон обязывает хранить и отдавать, а у пользователя нет возможности отказаться. Выводы — за вами. Часть 2: Доказательства (для тех, кто хочет проверить) Ниже — конкретный код из декомпилированного APK. Все ссылки на файлы и строки — из JADX-дизассемблера, версия APK 26.12.1. 2.1 Как спрятаны URL: обфускация через int[] Файл: defpackage/f28.java:43 Вот как выглядит адрес https://ip.mail.ru/ в коде MAX: // f28.java:53 x = new int[]{104, 116, 116, 112, 115, 58, 47, 47, 105, 112, 46, 109, 97, 105, 108, 46, 114, 117, 47};Декодируем вручную: 104 → h 116 → t 116 → t 112 → p 115 → s 58 → : 47 → / 47 → / 105 → i 112 → p 46 → . 109 → m 97 → a 105 → i 108 → l 46 → . 114 → r 117 → u 47 → /Результат: https://ip.mail.ru/ Все 16 URL в файле f28.java закодированы таким образом. Декодирование происходит лениво через rd4.java (cases 17-22 для IP-сервисов, 12-16 для проверок). Это не минификация и не оптимизация. ProGuard обфусцирует имена классов и методов, но не превращает строковые литералы в массивы int. Это ручная работа разработчиков, цель которой — сделать URL невидимыми для инструментов статического анализа (grep, strings, jadx string search). 2.2 Сбор IP: w18.java Файл: defpackage/w18.java:139-140 // Собираем все 6 IP-сервисов в списокДальше — последовательный перебор: первый сервис, который вернул IP ≠ 127.0.0.1, побеждает. Остальные не опрашиваются. Ключевой момент: запросы идут через java.net.Socket + ByteArrayOutputStream — это raw TCP, не OkHttp. OkHttp — стандартная HTTP-библиотека Android, которую легко перехватить через прокси (Burp Suite, Charles, mitmproxy). Raw-сокеты обходят всё это. Исследователь, настроивший прокси на устройстве, не увидит эти запросы в стандартных инструментах. 2.3 Сборка пакета данных: c28.java Файл: defpackage/c28.java:100-116 ro9 ro9Var = new ro9();Реконструированный JSON, который уходит на сервер: {Адрес назначения: api.ok.ru/api/log/externalLog (POST, gzip, аутентифицирован через session_key). 2.4 Гарантированная доставка Файл: defpackage/lg9.java:49-103 Отправка → Ошибка? → Повтор 1 → Ошибка? → Повтор 2 → Ошибка? → Повтор 3 → Ошибка? → Сохранить в локальное хранилище (vgh) → Отправить позже при подключении До 3 повторов (строка 66: intValue() > 3). После 3 неудач — данные сохраняются в локальное хранилище vgh (строки 68-77) для отправки позже. При сворачивании приложения — принудительный flush (r87.java:68. Результат: ваши данные отправятся серверу VK в любом случае. Нет сети? Подождёт. Сервер упал? Повторит. Вы закрыли приложение? Дошлёт при следующем запуске. Система спроектирована так, что ни одно событие не теряется. 2.5 Виджет «Лучше без VPN» и аналитика VPN-событий Файл: one/me/calls/ui/ui/call/panels/VpnPanelWidget.java, defpackage/dy1.java:46 // dy1.java:46 — VPN обнаружен во время звонка Состояния VPN-уведомления Файл: defpackage/l4j.java l4j.a // ENABLED — VPN включёнАналитическое событие при показе баннера: BAD_CONNECTION_ALERT с типом VPN (m82.java:43. 2.6 Неактивные проверки доступности Telegram и WhatsApp Файл: defpackage/rd4.java:87 case 15: return hb0.a(f28.l); // main.telegram.orgФайл: defpackage/c28.java:150 — список активных проверок: List U = sz3.U(f28.l (Telegram) и f28.m (WhatsApp) — есть в декодере rd4.java, но отсутствуют в активном списке c28.java. Более того, на уровне smali-байткода для этих полей нет move-result-object / sput-object — результат декодирования отбрасывается. Это мёртвый код или заготовка, но не работающая функциональность. Также в f28 есть неактивные домены Huawei Push:
2.7 Когда это срабатывает Основной триггер: каждый раз, когда приложение переходит в foreground (вы открыли MAX или вернулись к нему): r87.java:82 → app foreground callbackТакже: при логине (AccountInitializer), при фоновом пробуждении (one.me.background.wake.HostReachabilityChecker). Даже до авторизации: код в y18.java:66-100 показывает, что сетевые проверки работают в разных режимах в зависимости от состояния сессии (не подключён / подключён / залогинен). Фингерпринтинг сети начинается до того, как пользователь вошёл в аккаунт. Выводы MAX — приложение, предустановленное на 100+ миллионов устройств — содержит систему, которая при каждом открытии:
Я различаю возможность в коде и подтверждённое использование. Серверный флаг может быть не включён для всех. Но код — вот он. Проверяйте. Что дальше? Сбор IP и VPN-детект — это верхушка айсберга. В коде MAX я нашёл ещё много интересного и планирую рассказать в следующих статьях. Пишите в комментариях, что разобрать первым. Техническая справка Версия APK: 26.12.1 (6679) Разработчик: ООО «КОММУНИКАЦИОННАЯ ПЛАТФОРМА» (VK Group, Москва) Метод: статический анализ декомпилированного APK (JADX) SHA256: 47420c41b742e67daae85ee75e0aa76935736c7491bab9da942c012e2115ffa1 Примечание о названиях файлов: большинство классов в APK обфусцированы ProGuard — вместо осмысленных имён вроде HostReachabilityManager.java вы увидите f28.java, c28.java, w18.java. В JADX они попадают в defpackage/ (дефолтный пакет для классов без имени пакета). Это нормально для обфусцированного кода. Классы с нормальными именами (например, VpnPanelWidget.java) сохранили свои пути — я указываю полный путь там, где он есть. -------------------- Живы будем - Не помрем !
|
| SuperMax |
16.4.2026, 12:45
Сообщение
#2
|
![]() Администратор ![]() ![]() ![]() ![]() ![]() Группа: Root Admin Сообщений: 6 376 Регистрация: 7.1.2006 Из: Красноярск Пользователь №: 1 |
https://pikabu.ru/story/chto_skryivaet_max_...vonkov_13876232
Я не утверждаю, что MAX прямо сейчас слушает ваши разговоры в поисках слов вроде «Путин», «митинг» или «VPN». Текущая модель распознавания обучена только на фразу «не слышу» - по задумке это для определения плохой связи. Прямо сейчас функция выключена на сервере. Но....я разобрал архитектуру, проследил весь код от микрофона до отправки на сервер - и вот что важно:
TL;DR
Часть 1: Что я нашёл (для всех) 1. Что такое KWS и как это работает KWS (Keyword Spotting) - распознавание конкретных слов в аудиопотоке. Вы с этим знакомы: «Окей, Google», «Привет, Алиса», «Hey Siri» - всё это KWS. Принцип простой: нейросеть берёт звук с микрофона, режет на кусочки по 10 миллисекунд и на каждом решает - это ключевое слово или нет? VK встроил такую штуку прямо в свой модифицированный WebRTC. Нейросеть крутится локально на устройстве и слушает аудио во время звонка. 2. Что делает текущая нейронка Я скачал модель с серверов VK (https://st.okcdn.ru/static/calls_android/1-.../kws_270525.zip), разобрал её архитектуру и запустил. Текущий функционал:
3. Почему это не просто «определение качества связи» Распознавать «не слышу» - безобидно. А вот как это устроено внутри - уже нет. Нейронка приходит с сервера. KWS не зашит в код приложения. При запуске приложение получает от сервера конфиг с URL модели, забирает файл и грузит в нейросетевой движок. Сервер VK решает:
Приложение не проверяет, что именно нейронка распознаёт. Если завтра VK положит на CDN модель, обученную на слово «протест» - приложение скачает её и запустит точно так же. А что в политике конфиденциальности? Я проверил оба документа - Политику конфиденциальности (legal.max.ru/pp) и Пользовательское соглашение (legal.max.ru/ps). Упоминания KWS или анализа аудио во время звонков - ноль. При этом в Пользовательском соглашении есть описание того, как голосовые и видеосообщения переводятся в текст. 4. Что происходит при срабатывании Когда нейронка считает, что услышала ключевое слово, происходит следующее:
5. Серверный конфиг: то что я перехватил Во время анализа я перехватил реальный ответ сервера VK с конфигурацией KWS. Вот что сервер присылает приложению:
Я забрал модель по этому URL - без авторизации, без cookies. Любой может это сделать прямо сейчас. MD5 совпадает с тем, что прислал сервер.Ещё я побрутил CDN в поисках других моделей - перебрал 200+ вариантов путей. Нашёл только одну модель в трёх версиях SDK (1-0-1, 1-0-2, 1-0-3) - все три идентичны (одинаковый MD5). На данный момент VK использует только одну модель для фразы «не слышу». 6. Чего KWS не делает (чтобы не нагнетать) Работает только во время звонков - закрыли приложение, и всё. Кода для фоновой работы KWS я не нашёл. С голосовыми сообщениями не связан - те переводятся с аудио в текст на серверах VK, это другой процесс, другой код. Сейчас выключен (use: false). Нейронка уже на устройствах, но не запущена. И ищет она только «не слышу», а не что-то «опасное». 7. Что ещё я нашёл про звонки KWS - не единственная интересная вещь в работе звонков MAX: Все звонки идут через сервер VK. P2P-соединений я не увидел - все медиаданные проходят через TURN-сервер VK. Шифрование DTLS-SRTP есть, но от вас до сервера, не от вас до собеседника. На relay-сервере шифрование заканчивается - ключи у VK. Флаг записи аудио. В коде есть PMS-ключ calls-sdk-log-audio - если VK его включит, аудио звонка пишется в файл. Управляется с сервера. Модифицированный WebRTC. VK не использует стандартный WebRTC - они его модифицировали. В модификации добавлены: нативная запись аудио в Opus (nativeAudioStartRecord, nativeAudioWriteFrame), KWS-интеграция, и кастомные параметры. Часть 2: Доказательства (для тех, кто хочет проверить) Ниже - код, конфиги и результаты реверс-инжиниринга. Версия APK 26.12.1 (6679). 2.1 Где живёт KWS в коде KWS встроен в модифицированный WebRTC внутри нативной библиотеки libjingle_peerconnection_so.so. Точка входа - JNI-метод: Java_org_webrtc_PeerConnectionFactory_nativeSetKeywordSpotterParams Это вызов из Java в нативный код. Принимает два параметра: isEnabled (включить/выключить) и filePath (путь к модели на устройстве). Полная цепочка от сервера до нейросети:
<div class="story-block story-block_type_image"> <div class="story-image__content image-lazy image-lazy-processed"><a href="https://cs19.pikabu.ru/s/2026/04/12/20/hjfaqflr_lg.png" target="_blank" class="image-link"> -------------------- Живы будем - Не помрем !
|
| SuperMax |
16.4.2026, 12:45
Сообщение
#3
|
![]() Администратор ![]() ![]() ![]() ![]() ![]() Группа: Root Admin Сообщений: 6 376 Регистрация: 7.1.2006 Из: Красноярск Пользователь №: 1 |
https://pikabu.ru/story/chto_skryivaet_max_..._kniga_13877241
Третья часть цикла Сегодня затронем все те вопросы которые всплывают в комментариях: есть ли вообще в MAX шифрование? Как он смотрится в сравнении с Telegram, WhatsApp и Signal? Что там с безопасностью личных файлов? TL;DR Как сказал один "великий" человек: добавить шифрование можно, а зачем ?
Часть 1: Шифрование в MAX - его просто нет Сначала объясню простыми словами Когда вы отправляете сообщение в мессенджере, оно проходит через сервер. Вопрос: может ли сервер его прочитать? Два варианта:
Проверил все типы общения Декомпилировал APK, посмотрел wire-протокол, проанализировал трафик. Вот мои результаты: Личные сообщения - plaintext MsgPack по TCP. Из одного перехвата за 30 минут я извлёк 22 телефонных номера и 6 уведомлений о прочтении - всё открытым текстом. Групповые чаты - тот же протокол, тот же формат. Никакой разницы с личными. Каналы - аналогично. Голосовые звонки - шифрование DTLS-SRTP есть, но оно от вас до сервера VK, не от вас до собеседника. Все звонки идут через TURN-сервер VK. Ключи шифрования у VK. Видеозвонки - то же что голосовые. Тот же TURN-сервер, те же ключи у VK. Конференции - через отдельный vchat API на OK.ru, та же схема с relay. Голосовые сообщения - загружаются на CDN без шифрования. Сервер VK их ещё и переводит в текст (отдельная фича). Видеосообщения - то же что и голосовые. Файлы / фотографии / Аудио и Видеокружки - без шифрования на CDN. Про это отдельная история ниже. Секретные чаты - их нет. Вообще. В коде нашёл UI-ресурсы с названиями вроде secret_mode_started, но крипто-кода за ними ноль. Ни DH-обмена ключами, ни отдельного протокола. А что на сайте MAX написано про шифрование? Я проверил все официальные документы:
Часть 2: MAX vs Telegram vs WhatsApp vs Signal Самый частый запрос в комментариях: «а Telegram тоже так делает?» и «разбери WhatsApp». Собрал таблицу от наименее защищённого к наиболее. Данные по MAX - мой анализ кода. По Telegram - документация + open source клиент. По WhatsApp - их Whitepaper + внешние аудиты (код закрыт). По Signal - open source + аудиты. MAX единственный из четырёх, где: код закрыт + нет E2E ни для чего + сервер видит 100% + медиа без авторизации + ни одного аудита.Источники:
Часть 3: Медиафайлы для всех, удаление не удаляет Эта информация уже упоминалась в других исследованиях, но не мог не затронуть это. Я отправил фото в чат, потом удалил сообщение, а потом открыл ссылку на это фото в другом браузере без логина и фото загрузилось. Потом сделал то же самое с голосовым сообщением. Аудио тоже доступно после удаления. Фотографии - без авторизации, навсегда Каждая фотография хранится на CDN по адресу вроде i.oneme.ru/i?r=%3C%D1%82%D0%BE%D0%BA%D0%B5%D0%BD%3E. Токен - подписанная строка, которую генерирует сервер.
Вот пример отправленного фото в чат и позже удаленное из него ссылка : https://i.oneme.ru/i?r=BTExG6MjcZqk1JkYftXz...5wJnWe_slW64... Вы это можете так же легко проверить загрузите большое изображение, удалите его и попробуйте загрузить его еще раз и оно загрузится мгновенно так как файл уже есть...Аудиосообщения - без авторизации, 24 часа Голосовые сообщения хранятся на maxvd*.okcdn.ru. Тут чуть лучше - URL подписан и живёт 24 часа. Но:
https://maxvd177.okcdn.ru/?expires=17761299...&srcIp=1... Часть 4: FAQ из комментариев «TLS - это тоже шифрование. В чём проблема?» TLS шифрует канал между вами и сервером. Никто посередине (провайдер, сосед с Wi-Fi) не прочитает. Но сервер - прочитает. А сервер MAX - это сервер VK. VK зарегистрирован как «организатор распространения информации» и по закону обязан хранить переписку и отдавать по запросу. E2E шифрование решает эту проблему - даже владелец сервера не может прочитать сообщения. В MAX его нет. «Мне скрывать нечего» Не про то, есть ли что скрывать. Про то, кто контролирует ваши данные. Без E2E:
«Может, VK добавит шифрование позже?» Добавить E2E в существующий мессенджер - это не флаг на сервере переключить. Нужно:
«В Telegram обычные чаты тоже не E2E - значит то же самое?» Не совсем. У Telegram есть альтернатива:
Telegram не идеален - обычные чаты действительно сервер может читать и просматривать. Но у пользователя есть выбор открытые чаты или защищенные. В MAX выбора нет. Если вам нужен E2E для всех чатов (не только секретных) - WhatsApp или Signal. В WhatsApp E2E включён по умолчанию для всего. В Signal - E2E + open source + независимые аудиты. Так же можно еще посмотреть на мессенджер Threema Часть 5: Доказательства 5.1 Plaintext MsgPack - перехват трафика Через Frida-хуки на SSL_read/SSL_write я перехватил расшифрованный трафик MAX. Формат - MsgPack (бинарный JSON). Декодер писал сам За 30 минут работы приложения перехватил 85 фреймов. Из них:
5.2 Protos.java - нет полей шифрования Файл: ru/ok/tamtam/nano/Protos.java Класс Audio (голосовые сообщения):
Класс Video (видеосообщения):
5.3 network_security_config.xml - нет certificate pinning Файл: res/xml/network_security_config.xml Ноль элементов <pin-set>. Зато 5 доменов с cleartextTrafficPermitted="true" - это HTTP без шифрования вообще (для MobileID российских операторов). Certificate pinning - это защита от MiTM-атак (подмена сертификата на уровне провайдера или wifi). Telegram, WhatsApp, Signal - все его используют. MAX - нет. 5.4 Хранение на устройстве Вся переписка в SQLite без шифрования:
Выводы MAX - мессенджер который не шифрует ничего. Ни сообщения, ни звонки, ни файлы, ни фотографии. Сервер VK видит всё. На устройстве всё так же хранится в открытом виде. Фотографии доступны по ссылке навсегда без входа и проверки прав дотсупа. VK нигде не обещает шифрование - ни на сайте, ни в документах. Потому что его нет. В следующей части - практическая защита: что реально можно сделать если MAX приходится использовать. Split VPN, Knox, Frida, Virtual Device... -------------------- Живы будем - Не помрем !
|
![]() ![]() |
| Текстовая версия | Сейчас: 18.4.2026, 20:47 |