Независимый исследователь провел реверс-инжиниринг мессенджера MAX (версия APK 26.12.1) и нашел внутри систему распознавания ключевых слов — KWS (Keyword Spotting).
Нейросеть работает в реальном времени во время звонков, обрабатывая аудио с микрофона. В политике конфиденциальности и пользовательском соглашении об этом ни слова.
Как это устроено технически
Нейросеть BC-ResNet загружается не из самого приложения, а с серверов VK по URL из конфигурации.
Сейчас модель обучена только на фразу «не слышу». Официально для определения плохой связи.
При срабатывании детектора, результат с уровнем уверенности автоматически отправляется на сервер VK через канал vchat.clientStats, привязанный к конкретному пользователю и звонку.
Полную цепочку от микрофона до сервера можно описать так:
Микрофон → WebRTC → BCResNetKWS → KeywordSpotterManagerImpl → ConversationKwsStat → api.ok.ru/api/log/externalLog
Главная проблема — не то, что есть сейчас
Сейчас KWS выключена на сервере ("use": false) и ищет только «не слышу». Но архитектура устроена так, что VK может в любой момент заменить модель на любую другую — без обновления приложения, без уведомления пользователя.
Достаточно изменить один URL в серверном конфиге. Приложение само скачает новую нейросеть и запустит ее. Никакой проверки того, что именно модель распознает, в коде нет.
Модель доступна публично прямо сейчас — без авторизации:
curl -O https://st.okcdn.ru/static/calls_android/1-0-1/kws_270525.zip
Дополнительные находки
Все звонки в MAX идут через TURN-серверы VK — P2P-соединений исследователь не обнаружил. Шифрование DTLS-SRTP работает только от пользователя до сервера VK, а не между собеседниками напрямую.
Кроме того, в коде найден серверный флаг calls-sdk-log-audio: если VK его включит, аудио звонка будет записываться в файл на устройстве. Управление тоже происходит с сервера и тоже без уведомления пользователя.
Что это означает
Разница между «детектором плохой связи» и «детектором произвольных слов» — один URL в JSON-конфиге.
Код, процесс отправки на сервер, архитектура — все одно и то же. Меняется только файл модели на CDN.
