Рубрики
На повестке дня

Что скрывает MAX #3: Переписка в MAX — открытая книга

Третья часть цикла

Сегодня затронем все те вопросы которые всплывают в комментариях: есть ли вообще в MAX шифрование? Как он смотрится в сравнении с Telegram, WhatsApp и Signal? Что там с безопасностью личных файлов?


TL;DR

Как сказал один «великий» человек: добавить шифрование можно, а зачем ?

  • В MAX нет сквозного e2e шифрования (от пользователя к пользователю) ни для одного типа общения — личные чаты, группы, звонки, голосовые, файлы

  • Все сообщения идут открытым текстом через внутри обычного TLS — сервер VK видит каждое слово

  • Для сравнения: в Telegram есть Secret Chats и E2E-звонки, в WhatsApp заявлен и проверен исследователями E2E для всего, в Signal — E2E + open source

  • На телефоне всё хранится в открытой SQLite базе данных

  • Фотографии из чатов доступны по прямой ссылке без авторизации и не истекают годами

  • MAX — единственный из четвёрки, где владелец видит 100% сообщений и файлов


Часть 1: Шифрование в MAX — его просто нет

Сначала объясню простыми словами

Когда вы отправляете сообщение в мессенджере, оно проходит через сервер. Вопрос: может ли сервер его прочитать?

Два варианта:

  • TLS (транспортное шифрование) — сообщение зашифровано по дороге от вас до сервера и от сервера до собеседника. Но на сервере оно лежит в открытом виде. Сервер видит всё. Это как если бы вы отправили письмо в конверте через почту, а на сортировочном пункте его открыли, прочитали, положили в новый конверт и только потом отправили получателю.

  • E2E (сквозное шифрование от пользователя к пользователю) — сообщение зашифровано ключом, который есть только у вас и собеседника. Сервер передаёт зашифрованный blob и не может его прочитать. Это как отправить запертый сейф — почта передаёт, но ключ только у получателя.

В MAX — только TLS. E2E нет.


Проверил все типы общения

Декомпилировал 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 написано про шифрование?

Я проверил все официальные документы:

  • legal.max.ru/pp (политика конфиденциальности) — слово «шифрование» не встречается ни разу.

  • legal.max.ru/ps (пользовательское соглашение) — ноль информации

  • help.max.ru/help/security (раздел безопасности) — пароли, сессии, онлайн-статус, родительский контроль. Шифрование не упоминается.

  • «Безопасный режим» — скрытие из поиска, звонки только от контактов, фильтр контента 16+/18+.

Для сравнения: у Telegram есть отдельная страница про MTProto и шифрование . У WhatsApp — Security Whitepaper. У Signal — полная документация протокола и исходный код. У 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. Токен — подписанная строка, которую генерирует сервер.

  • Авторизация не нужна. Открываете ссылку в любом браузере, без логина — фото загружается

  • Ссылка не истекает.

  • CORS открыт: Access-Control-Allow-Origin: * — любой сайт может подгрузить картинку

  • Удалил сообщение, а фото осталось. Проверено: отправил фото, удалил, открыл по ссылке и увидел свое «удаленное» изображение

Токен уникальный и изменённый токен возвращает 400. Но сами токены раздаются всем участникам чата открытым текстом через wire-протокол. Переслали кому-то фото и этот кто-то навсегда имеет рабочую ссылку. Отозвать ссылку нельзя у пользователя механизма отзыва нет, только у сервера.

Вот пример отправленного фото в чат и позже удаленное из него ссылка :

https://i.oneme.ru/i?r=BTExG6MjcZqk1JkYftXzTuS6B5wJnWe_slW64…

Вы это можете так же легко проверить загрузите большое изображение, удалите его и попробуйте загрузить его еще раз и оно загрузится мгновенно так как файл уже есть…

Аудиосообщения — без авторизации, 24 часа

Голосовые сообщения хранятся на maxvd*.okcdn.ru. Тут чуть лучше — URL подписан и живёт 24 часа. Но:

  • Авторизация не нужна. Так же как с фотографиями

  • Удалил сообщение, а аудио осталось. Проверено: отправил фото, удалил, открыл по ссылке и услышал свое «удаленное» аудио. Вы так же можете это легко проверить

  • Срок жизни — 24 часа (поле expires в URL). В пределах суток аудио доступно кому угодно

  • Все параметры URL подписаны подменить srcIp, id, sig нельзя (400). Но имея полную ссылку — скачать может любой

URL аудио содержит IP (srcIp=146.70.231.14) и ID пользователя (userId=125915255) открытым текстом. Ссылка

https://maxvd177.okcdn.ru/?expires=1776129938878&srcIp=1…


Часть 4: FAQ из комментариев

«TLS — это тоже шифрование. В чём проблема?»

TLS шифрует канал между вами и сервером. Никто посередине (провайдер, сосед с Wi-Fi) не прочитает. Но сервер — прочитает. А сервер MAX — это сервер VK. VK зарегистрирован как «организатор распространения информации» и по закону обязан хранить переписку и отдавать по запросу.

E2E шифрование решает эту проблему — даже владелец сервера не может прочитать сообщения. В MAX его нет.

«Мне скрывать нечего»

Не про то, есть ли что скрывать. Про то, кто контролирует ваши данные.

Без E2E:

  • Взлом сервера = все сообщения утекли.

  • Запрос по закону = все сообщения отдали.

  • Инсайдер в компании = все сообщения / контакты / файлы доступны (а учитывая сколько сейчас стоит пробив по номеру телефона и другие «сервисы». то скоро появится новая услуга).

С E2E: даже если сервер взломан — данные зашифрованы ключами, которые есть только у вас.

«Может, VK добавит шифрование позже?»

Добавить E2E в существующий мессенджер — это не флаг на сервере переключить. Нужно:

  • Реализовать протокол обмена ключами (DH / X3DH)

  • Добавить double ratchet или аналог для каждого чата

  • Переписать хранение сообщений (сервер больше не может их читать)

  • Переделать поиск, превью, пуши (всё это сейчас работает потому что сервер видит текст)

В коде MAX нет ни одного класса связанного с E2E — ни DH, ни pre-keys, ни session keys. Архитектура строилась без расчёта на это.

«В Telegram обычные чаты тоже не E2E — значит то же самое?»

Не совсем. У Telegram есть альтернатива:

  • Есть Secret Chats — настоящий E2E (правда только 1-на-1 и только мобильные)

  • Звонки — E2E с emoji-верификацией

  • CDN-файлы требуют авторизацию и зашифрованы AES-256-CTR

  • Есть certificate pinning

У MAX ничего из этого нет. Ни одной альтернативы для пользователя, который хочет приватность.

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 фреймов. Из них:

  • Опкод 0x80 (INCOMING_MESSAGE_PUSH) — входящие сообщения, plaintext, видно текст и sender

  • Опкод 0x40 (SEND_MESSAGE_NEW) — исходящие сообщения, plaintext

  • Опкод 0x23 (SUBSCRIBE_PRESENCE) — кто онлайн

    MAX:

    — Формат: точный timestamp + status (1=online, 2=offline)
    — Максимальная точность: секунда. Unix timestamp seen: 1776043570 = 2026-04-13 01:26:10 UTC

    Telegram:

    — Точность плавает: был недавна, был на этой неделе….

  • Опкод 0x84 (REPORT_READ_RECEIPT) — кто прочитал

  • 22 телефонных номера в открытом виде

Всё это идёт внутри TLS. Сервер VK видит тот же plaintext.

5.2 Protos.java — нет полей шифрования

Файл: ru/ok/tamtam/nano/Protos.java

Класс Audio (голосовые сообщения):

  • url, token, audioId, duration, transcription

  • Полей IV, key, cipher, encrypted — нет

Класс Video (видеосообщения):

  • url, token, videoId, duration, thumbnail, transcription

  • Полей IV, key, cipher, encrypted — нет

Для сравнения: в Signal Protocol каждое сообщение содержит ratchet key, counter, cipher header. В MAX — просто текст.

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 без шифрования:

  • Нет SQLCipher — база открывается любым SQLite-просмотрщиком

  • Нет EncryptedSharedPreferences — токены авторизации в plaintext

  • AndroidKeyStore используется только для биометрической авторизации, не для сообщений


Выводы

MAX — мессенджер который не шифрует ничего. Ни сообщения, ни звонки, ни файлы, ни фотографии. Сервер VK видит всё. На устройстве всё так же хранится в открытом виде. Фотографии доступны по ссылке навсегда без входа и проверки прав дотсупа.

VK нигде не обещает шифрование — ни на сайте, ни в документах. Потому что его нет.

В следующей части — практическая защита: что реально можно сделать если MAX приходится использовать. Split VPN, Knox, Frida, Virtual Device…