Сообщение с inline-кнопкой могло содержать вредоносный код, который срабатывал при открытии HTML-архива переписки в браузере. ExPatch обнаружила, что Telegram Desktop сохранял текст кнопки без экранирования опасных символов.

Ошибка была в обработке данных кнопки перед записью в HTML. Telegram Desktop преобразовывал button.text в UTF-8, но это меняло кодировку, а не обезвреживало теги. Строка с <script> сохраняла смысл HTML-тега. Обычный текст сообщений и имена отправителей проходили через функцию замены опасных символов безопасными последовательностями, а для текста кнопки разработчики этот вызов пропустили.

Доставить вредоносную строку можно было через Bot API. Бот создавал сообщение с клавиатурой и помещал код в поле text URL-кнопки. Такая клавиатура сохранялась при пересылке сообщения, поэтому бот не обязательно должен был состоять в целевом чате. Достаточно, чтобы участник переслал подготовленное сообщение туда, где нужно. В демонстрации исследователи добавляли перед тегом невидимые символы, из-за чего подозрительный код практически не был заметен в интерфейсе.

Сам Telegram Desktop JavaScript не выполнял. Для срабатывания нужны были три условия: сообщение с вредоносной кнопкой должно было попасть в историю на экспорт, файл создавался уязвимой версией клиента, и пользователь затем открывал полученную страницу в браузере с включённым JavaScript. После загрузки нажатие на кнопку уже не требовалось.

Скрипт получал доступ к DOM открытой страницы и мог прочитать отображаемые сообщения, имена отправителей, временные метки и сведения о чате. Демонстрационный код также извлекал локальный путь из location.href, способный раскрыть структуру каталогов на компьютере. Собранные данные можно было отправить на внешний сервер, а содержимое страницы полностью переписать — показать фальшивую форму авторизации или изменить отображаемые сообщения и даты.

Есть важное ограничение. Telegram Desktop разбивает длинный HTML-экспорт на страницы по 1000 сообщений. Подтверждённый сценарий даёт доступ к содержимому конкретного открытого HTML-документа, а не ко всему архиву переписки. ExPatch не подтвердила чтение соседних страниц экспорта или произвольных файлов на диске. Изменения DOM не затрагивают переписку на серверах Telegram и не переписывают исходный файл.

Уязвимая обработка появилась вместе с поддержкой кнопок в HTML-экспорте в Telegram Desktop 4.15.1 (март 2024 года) и оставалась в коде примерно два года и четыре месяца.

Разработчики исправили ошибку, пропустив button.text через функцию замены опасных символов перед записью в HTML. Тот же коммит закрыл отдельную инъекцию в JavaScript-строку обработчика onclick: Telegram Desktop начал экранировать обратную косую черту и одинарную кавычку перед подстановкой содержимого. Разные контексты требуют разного экранирования, поэтому одной HTML-обработки для JavaScript-строки недостаточно.

Патч вошёл в Telegram Desktop 7.0.1. Пользователям достаточно установить эту версию или более новую.

Обновление программы не обезвреживает HTML-файлы, созданные раньше. Вредоносный тег уже записан внутрь старого экспорта и останется активным. Безопаснее заново экспортировать нужные чаты после обновления. Старые HTML-архивы при необходимости следует открывать без выполнения JavaScript.

ExPatch обнаружила проблему 1 июня 2026 года и отправила отчёт 3 июня. Telegram предложил вознаграждение в размере $500, но исследователь отказался и попросил направить деньги на благотворительность. Позже он предложил согласовать публикацию технических подробностей после выхода патча. Telegram ответил отказом, указав, что публикация сведений об уязвимостях может побудить злоумышленников к эксплуатации.