Telegram замаскировался под HTTPS
Telegram Desktop экспериментирует с новым способом подключения через прокси. Клиент по-прежнему использует MTProxy, но передаёт готовый зашифрованный поток через встроенный веб-компонент. Разработчики уже собрали рабочий прототип и опубликовали сервер tproxy-server, который пока имеет статус экспериментальной проверки концепции.
Новая схема не заменяет MTProxy и не вмешивается в его шифрование. Telegram сначала устанавливает соединение по обычным правилам MTProxy, затем передаёт сформированный поток через WebView. Веб-компонент отвечает только за доставку данных между клиентом и промежуточным сервером.
Для работы нескольких соединений внутри одной веб-сессии разработчики добавили компактный протокол мультиплексирования. Каждый логический поток получает собственное состояние, а обмен управляется несколькими типами кадров. OPEN открывает соединение, DATA переносит данные, WINDOW сообщает, какой объём информации ещё можно передать, CLOSE завершает поток. PING и PONG позволяют проверить, что соединение остаётся активным, а HELLO и WELCOME используются при установке сессии.
На сервере общий поток принимает tproxy-server. Ретранслятор разделяет данные на отдельные соединения и передаёт каждое локально запущенному официальному MTProxy. Содержимое кадров DATA остаётся для tproxy-server непрозрачным набором байтов: сервер не расшифровывает MTProxy-трафик. Клиент также не может использовать ретранслятор для произвольного подключения к любому адресу.
Разработчики предусмотрели четыре варианта передачи данных. В первом режиме клиент отправляет последовательные HTTPS-запросы. Во втором разные логические соединения получают отдельные HTTPS-каналы. Ещё два варианта используют WebSocket: все потоки проходят через одно соединение либо каждому потоку выделяется отдельное. Режим выбирает сервер, поэтому пользователю не нужно настраивать конкретный способ транспорта вручную.
Для подключения клиенту достаточно доменного имени и секрета MTProxy. Используются HTTPS и порт 443. Telegram на устройстве вычисляет из домена и секрета специальное значение, необходимое для открытия служебной bridge-страницы. Исходный секрет JavaScript-коду не передаётся. После загрузки bridge-страницы служебный параметр удаляется из отображаемого адреса, а сервер выдаёт временный 256-битный токен. Дальнейшая сессия использует уже этот токен.
Домен при этом может продолжать работать как обычный HTTPS-сайт. Если посетитель открывает главную страницу без правильного служебного параметра, сервер показывает стандартную домашнюю страницу. Такой же ответ получает запрос с ошибочным, повреждённым или лишним параметром. Владелец сервера может разместить на домене статический сайт или полноценное веб-приложение со своими страницами, API и учётными записями. Служебная bridge-страница загружается только после проверки параметров прокси, поэтому веб-сайт и транспорт Telegram могут работать на одном домене.
Возможности bridge-страницы внутри WebView сильно ограничены. Страница не использует cookies, локальное хранилище браузера, IndexedDB и Service Workers. Также запрещены внешние ресурсы, формы, всплывающие окна, загрузка файлов и доступ к буферу обмена, камере, микрофону и другим разрешениям устройства.
Для передачи трафика остаются только необходимые функции: встроенный в страницу скрипт, HTTPS- или WebSocket-соединение с тем же доменом и специальный интерфейс связи с Telegram Desktop. Такой набор сокращает число браузерных возможностей, доступных коду служебной страницы.
В Telegram Desktop уже появился скрытый встроенный транспорт на базе WebView, работающий на уровне всего процесса. Разработчики также предусмотрели резервный вариант через системный браузер.
Эксперименты затрагивают и мобильные платформы. В репозитории есть реализация для Android на базе Android System WebView, а для iOS запланирован вариант с WKWebView. Все клиенты должны использовать один серверный протокол и одинаковый формат кадров, независимо от платформы.
Для нового прокси уже предусмотрены ссылки t.me/webproxy и схема tg://webproxy. Однако сайт t.me пока не обрабатывает маршрут webproxy, поэтому ссылки ещё не работают как готовый способ настройки для обычных пользователей. tproxy-server по-прежнему обозначен как proof-of-concept, то есть экспериментальный прототип для проверки самой архитектуры. Даты появления WEB proxy в стабильной версии Telegram Desktop пока нет.