Обычная кнопка под сообщением Telegram могла превратить сохранённую переписку в страницу с вредоносным JavaScript. Исследователи ExPatch обнаружили уязвимость в HTML-экспорте Telegram Desktop: специально подготовленный текст inline-кнопки попадал в файл без экранирования и превращался в исполняемый код после открытия архива в браузере.
Проблема относится к хранимому XSS. Telegram Desktop добавлял button.text в HTML через toUtf8(), но преобразование в UTF-8 меняет кодировку, а не обезвреживает HTML. Поэтому строка с <script> сохраняла смысл тега. Обычный текст сообщений, имена отправителей и другие поля проходили через SerializeString(), которая заменяет опасные для HTML символы безопасными последовательностями. Для текста кнопки разработчики такой вызов пропустили.
Доставить вредоносную строку можно было через штатный Bot API. Бот создавал сообщение с inline-клавиатурой и помещал код в поле text URL-кнопки. Такая клавиатура сохранялась при пересылке, поэтому бот не обязательно должен был состоять в целевой группе. Достаточно, чтобы участник переслал подготовленное сообщение в нужный чат. В демонстрации исследователи добавляли перед тегом невидимые символы U+3164, из-за чего подозрительный фрагмент практически не был заметен в интерфейсе.
Сам Telegram Desktop JavaScript не выполнял. Для срабатывания требовались три условия: сообщение с вредоносной кнопкой должно было попасть в экспортируемую историю, HTML-файл создавался уязвимой версией клиента, а пользователь затем открывал полученную страницу в браузере с включённым JavaScript. После загрузки дополнительное нажатие на кнопку уже не требовалось.
Скрипт получал доступ к DOM открытой страницы и мог прочитать отображаемые сообщения, имена отправителей, временные метки и сведения о чате. Демонстрационный код также извлекал локальный путь из location.href, способный раскрыть часть структуры каталогов на компьютере. Собранные данные можно было отправить на внешний сервер, а содержимое страницы полностью переписать, например показать фальшивую форму авторизации или изменить отображаемые сообщения и даты.
Важное ограничение снижает масштаб одного срабатывания. Telegram Desktop разбивает длинный HTML-экспорт на страницы по 1000 сообщений, поэтому подтверждённый сценарий даёт доступ к содержимому конкретного открытого HTML-документа, а не автоматически ко всему архиву переписки. ExPatch также не подтвердила чтение соседних страниц экспорта или произвольных файлов на компьютере. Изменения DOM не затрагивают переписку на серверах Telegram и не переписывают исходный HTML-файл на диске.
Уязвимая обработка появилась вместе с поддержкой кнопок в HTML-экспорте и попала в стабильный Telegram Desktop 4.15.1 в марте 2024 года. Проблема оставалась в коде примерно два года и четыре месяца.
Разработчики исправили ошибку, пропустив button.text через SerializeString() перед записью в HTML. Тот же коммит закрыл отдельную инъекцию в JavaScript-строку обработчика onclick: перед подстановкой содержимого Telegram Desktop начал экранировать обратную косую черту и одинарную кавычку. Разные контексты требуют разного экранирования, поэтому одной HTML-обработки для JavaScript-строки недостаточно.
Патч вошёл в Beta 6.9.4 и стабильный Telegram Desktop 7.0.1. В официальном журнале изменений версия 7.0.1 датирована 14 июля 2026 года, но исправление XSS отдельно в описании релиза не указано. Пользователям достаточно установить 7.0.1 или более новую официальную версию.
Обновление программы не обезвреживает HTML-файлы, созданные раньше. Вредоносный тег уже записан внутрь старого экспорта и останется активным после установки свежего Telegram Desktop. Безопаснее заново экспортировать нужные чаты после обновления. Старые HTML-архивы при необходимости следует открывать без выполнения JavaScript.
ExPatch обнаружила проблему 1 июня 2026 года и отправила отчёт Telegram 3 июня. По опубликованной переписке, 1 июля Telegram предложил исследователю Денису Ростилову вознаграждение в размере $500. Ростилов отказался от выплаты и попросил направить деньги на благотворительность, после чего предложил согласовать публикацию технических подробностей уже после выхода патча. Telegram ответил, что не может одобрить публичное раскрытие даже исправленных проблем, поскольку публикация сведений об уязвимостях может подтолкнуть злоумышленников к эксплуатации. На момент публикации исследования отдельный CVE для проблемы не был присвоен.