Телефон лежал на столе и просто работал.
Никаких уведомлений. Никаких подозрительных активностей. Обычный Android, обычный мессенджер, обычный вечер. Я смотрел на экран mitmproxy и не верил своим глазам.
Потому что мой телефон в этот момент проверял — работает ли у меня VPN. И отправлял этот ответ куда надо.
Я не нажимал никаких кнопок. Я ничего не разрешал. Приложение просто делало это само. Тихо. Методично. Каждый раз когда я сворачивал или открывал его.
И самое страшное — я пользовался этим мессенджером восемь месяцев до того как решил заглянуть внутрь.
Начну с того что заставило меня вообще взяться за это.
В нескольких технических чатах начали появляться скриншоты — мессенджер MAX делает запросы к серверам Telegram и WhatsApp. Люди терялись в догадках. Кто-то говорил — интеграция. Кто-то — аналитика. Кто-то — случайный модуль который забыли убрать.
Я решил не гадать. Я решил посмотреть сам.
То что я нашел — я не ожидал. Честно. Я думал что найду что-то неловкое, может быть что-то спорное. Я не думал что найду это.
Инструменты простые. mitmproxy в режиме wireguard — он перехватывает ВЕСЬ трафик, без исключений. Android эмулятор с системным сертификатом. И сам APK мессенджера MAX версии 26.4.3.
Первое что я увидел когда запустил перехват — трафик к api.oneme.ru не декодировался стандартными инструментами. Не HTTP. Не gRPC. Бинарная мешанина с вкраплениями читаемых строк.
Это не случайность.
Когда протокол специально сделан так чтобы автоматические инструменты его не видели — это архитектурное решение. Это выбор. Кто-то сидел и думал: как сделать чтобы это не декодировалось само по себе.
Несколько часов анализа. И я понял структуру.
10-байтовый заголовок. Версия протокола. Команда. Порядковый номер. Опкод. Флаг сжатия. Размер. И дальше — данные в формате MessagePack. Привет разработчикам VK, это их фирменная игрушка.
Я написал аддон для mitmproxy который распаковывает это на лету. И нажал запустить.
И вот тут всё встало на место.
Одно из первых сообщений которые я увидел после старта приложения:
GET_HOST_REACHABILITY
hosts: {
'api.oneme.ru': 3,
'gosuslugi.ru': 3,
'gstatic.com': 3,
'main.telegram.org': 3,
'mmg.whatsapp.net': 3,
'mtalk.google.com': 3,
'calls.okcdn.ru': 3
}
vpn: 1
operator: '25001:MTS'
ip: [МОЙ АДРЕС]
Я перечитал это три раза.
Потом ещё раз.
Потом встал, налил воды и перечитал снова.
Давай я объясню что это значит — медленно, потому что это важно.
Мессенджер MAX запускается на твоём телефоне. И сразу — при каждом открытии и закрытии — он проверяет список хостов. Среди них: Telegram. WhatsApp. Госуслуги. Серверы Google.
Проверяет как? Ping и TCP соединение на порт 443. Это прямая проверка того — заблокирован ли ресурс или нет. Точнее — обходит ли твой VPN блокировку.
Потому что ТСПУ (система технических средств противодействия угрозам) не режет пинги. Она ограничивает конкретные порты и протоколы. И если ping проходит а TCP:443 — нет, это значит ресурс заблокирован на уровне ТСПУ. Если оба проходят — значит VPN работает и обходит блокировку.
Это и есть методика проверки эффективности блокировок.
Твой телефон. Каждый раз когда ты открываешь мессенджер. Проверяет работает ли у тебя VPN. И отправляет результат.
Подожди. Это ещё не всё.
Список источников для определения твоего IP адреса:
- https://ifconfig.me/ip — международный сервис.
- https://api.ipify.org — международный.
- https://checkip.amazonaws.com — Amazon.
- https://ip.mail.ru — российский.
- https://ipv4-internet.yandex.net — российский.
Видишь? 50 на 50. Российские и зарубежные источники IP.
Зачем это нужно? Чтобы поймать умных. Тех кто настроил split tunneling — раздельную маршрутизацию трафика. Когда иностранный трафик идёт через VPN а российский — напрямую. Если твой IP с российского сервиса и с зарубежного — разные, ты раскрыт. Система видит что у тебя выборочный VPN.
Это не случайный набор адресов. Это продуманная методология.
Флаг vpn: 1 в сообщении — это прямой ответ на вопрос “использует ли пользователь VPN прямо сейчас”. Не “настроен ли VPN”. Не “установлен ли”. А — АКТИВЕН ли прямо сейчас.
Плюс оператор. Строка 25001:MTS — это PLMN код. Mobile Country Code плюс Mobile Network Code. 250 — Россия. 01 — МТС.
Зачем это нужно? Геолокацию пользователь может запретить. А запретить приложению видеть к какой сети подключён телефон — нельзя. Это системный API Android и он всегда доступен для приложений.
Другими словами — они нашли способ всегда знать что ты в России. Даже если ты отключил геолокацию. Даже если ты думаешь что анонимен.
Теперь про то что меня зацепило больше всего.
Этот модуль включается и выключается удалённо.
При авторизации сервер возвращает конфигурацию с флагом host-reachability. Этот флаг можно включить для конкретного аккаунта. Таргетно. Для отдельного человека.
Ты понимаешь что это значит?
Прямо сейчас у большинства пользователей этот флаг может быть выключен. А завтра — для конкретной группы людей — его включат. И их телефоны начнут работать как зонды. Тихо. Без уведомлений. Без запроса разрешения.
И ты не узнаешь об этом. Никогда. Если не будешь смотреть в трафик.
Реакция пресс-службы MAX пришла быстро.
Они сказали: IP адреса нужны для WebRTC и P2P звонков. Запросы к серверам Apple и Google — для push-уведомлений. К Telegram и WhatsApp запросов нет.
Слушай.
Я смотрел на живой трафик. Я видел main.telegram.org в списке хостов для проверки. Я видел mmg.whatsapp.net. Эти строки есть в коде APK. Они есть в перехваченных пакетах.
WebRTC для P2P звонков не требует проверять доступность Telegram. Push-уведомления не требуют знать работает ли у тебя VPN. Для push достаточно знать доступен ли сервер Google Firebase — зачем параллельно проверять Госуслуги и WhatsApp?
Это не объяснение. Это формулировка для пресс-релиза.
Я потратил на это несколько дней. Реверс-инжиниринг, анализ протокола, написание аддона, разбор каждого поля каждого сообщения.
И знаешь что самое неприятное?
Не сам факт слежки. Не то что они это делают.
А то что это ХОРОШО СДЕЛАНО.
Протокол специально не декодируется автоматическими инструментами. Данные смешаны с обычным трафиком мессенджера так что заблокировать аналитику не заблокировав само приложение — невозможно. Удалённое управление позволяет включать функцию точечно. Список источников IP выбран чтобы ловить split tunneling.
Это не баг. Это не недосмотр. Это не “аналитика которую забыли убрать”.
Это — система. Спроектированная. Протестированная. Развёртываемая от версии к версии.
Есть один человек которому я показал эти данные. Он много лет работал в телеком-индустрии, просил не называть его имя.
Он посмотрел на дамп трафика. Помолчал секунд двадцать. Потом сказал:
“Слушай, это же не для Роскомнадзора в первую очередь. Это для того чтобы привязать конкретного пользователя к конкретному VPN сервису. Если у тебя один и тот же входной и выходной IP на VPN сервере — ты идентифицирован. Имя. Аккаунт. Провайдер. Всё.”
Он ещё помолчал.
“Частные VPN серверы — это всё. Там входной и выходной IP обычно совпадают. Один человек, один сервер, один IP. Это идеальная цель для такой системы.”
В технических кругах про этот скандал говорят уже несколько недель. В паре закрытых каналов — там где собираются люди которые реально понимают что происходит с российским интернетом — это обсуждали ещё до того как информация вышла в публичное поле. Один из таких каналов где я сам узнал про первые признаки этой истории — Маркетинг и Точка. Казалось бы, маркетинг — но там оседает информация которая нигде больше не появится раньше. Несколько человек из этого круга первыми начали задавать вопросы про запросы MAX ещё когда большинство их игнорировало. Про такие места не принято говорить вслух — но иногда это необходимо.
Что делать прямо сейчас.
Изолируй. На Android это работает:
Samsung — Защищённая папка Knox. Изолированное окружение без наследования VPN основного профиля.
Xiaomi/Redmi/POCO — Второе пространство. Тот же принцип.
Для всех остальных Android включая Pixel — приложения Shelter или Island. Они создают изолированный рабочий профиль.
На iOS — купи отдельный дешёвый Android за пять тысяч рублей только для MAX. Это не шутка. Это буквально самый надёжный вариант если тебе нужен этот мессенджер.
Я не знаю что будет после того как это разойдётся. Может ничего. Может последует обновление которое уберёт часть из того что я описал — но оставит остальное, глубже. Может появятся официальные опровержения со сложными словами про WebRTC и push-уведомления.
И вот мой финальный вопрос — не риторический, мне реально интересно:
Что ты будешь делать теперь? Напиши. Серьёзно читаю каждый ответ. Особенно от тех кто считает что я преувеличиваю.