Telegram Desktop переносит в файл экспорта текст кнопок под сообщениями, не проверяя его на опасные символы. Из-за этого посторонний код, спрятанный внутри такой кнопки, исполняется в браузере, как только человек открывает сохранённую переписку. Речь о хранимом межсайтовом скриптинге (XSS, то есть исполнении чужого кода в браузере жертвы). Уязвимость затрагивает сборки клиента, вышедшие до бета-версии 6.9.4 и до стабильной версии 7.0.1. Несут опасность не сами чаты, а выгруженные на диск файлы.
Детали уязвимости
Проблему нашли Денис Ростилов и Александр Ростилов из ExPatch Vulnerability Research. В июне 2026 года они передали в Telegram описание и работающий пример. Правку подготовили в конце того же месяца. Первая сборка с исправлением вышла 3 июля в бета-канале, а 14 июля оно дошло до стабильной версии 7.0.1. Идентификатор CVE проблеме так и не присвоили, публичного бюллетеня тоже нет.
Атака опирается на встроенные кнопки, которые боты добавляют под своими сообщениями. Текст кнопки принимает разметку HTML, языка описания веб-страниц. Клиент мессенджера показывает такую разметку как обычный текст, поэтому в переписке она себя не выдаёт. Иначе ведёт себя экспорт. При выгрузке в HTML приложение записывало содержимое кнопки в готовую страницу без экранирования. Достаточно открыть полученный файл в браузере с включённым JavaScript, чтобы встроенный код сработал. Авторы находки маскируют теги невидимыми служебными символами, поэтому кнопка выглядит пустой или показывает только ссылку.
Дальше работает пересылка. Боту не нужно состоять в целевой группе. Он отправляет сообщение с кнопкой-ссылкой любому пользователю или в публичный чат и ждёт, пока кто-то перешлёт его в нужное место. Telegram сохраняет кнопки такого типа при пересылке, поэтому полезная нагрузка лежит в истории месяцами. Запускает её рядовое действие: выгрузка переписки ради проверки, судебного запроса, внутреннего расследования или резервного копирования. Сработает только та выгрузка, в которую попало отравленное сообщение. Зато одна пересылка в сообщество с сотнями тысяч участников даёт такую возможность сразу многим.
Скрипт читает всё, что отрисовано на странице: тексты сообщений, имена отправителей, метки времени, название и тип чата, число участников. Попутно он забирает локальный путь к файлу, а вместе с ним имя пользователя операционной системы. Собранное уходит на сервер злоумышленника. Полный контроль над документом даёт и другие возможности. Можно подменить даты и имена, вставить или скрыть реплики, нарисовать поверх выгрузки форму проверки с символикой Telegram и получить введённые значения. В юридической работе, где экспорт переписки служит доказательством, такая подмена искажает материал.
Режим приватности ботов здесь не защищает. Бот с такой настройкой не получает обычные сообщения группы и не видит её историю, но его собственные сообщения попадают в выгрузку вместе с кнопкой. Через браузер жертвы он получает ровно то, к чему Telegram его не допускал.
Функции выгрузки редко попадают в поле зрения служб безопасности. Внутри приложения текст остаётся текстом, и проверять его на разметку незачем. При экспорте те же сведения проходят через разбор HTML, и правила меняются: символы, которые приложение считает обычными, браузер принимает как команды. На стыке двух представлений и возникает ошибка.
Прожила она в коде около двух лет и четырёх месяцев. Поддержку разметки в экспорте добавили в марте 2024 года. ExPatch оценила уязвимость в 8,2 балла из 10 по отраслевой шкале.
Общение с разработчиками вышло непростым. Исследователи отказались от вознаграждения в 500 долларов и попросили перевести деньги на благотворительность. Дату публикации они предложили согласовать и обещали молчать до выхода исправления. Компания отказалась одобрить раскрытие даже после того, как правка попала в релизы, объяснив это тем, что сведения об уже закрытых проблемах могут навредить пользователям. Отраслевая практика выглядит иначе: бюллетень после закрытия уязвимости объясняет администраторам, зачем обновляться, и подсказывает, какие архивы стоит пересмотреть. Здесь такого документа нет, поэтому повода лишний раз заглянуть в старые выгрузки у них не появилось.
Исправление применяет к тексту кнопок ту же очистку, что и к самим сообщениям. Заодно закрыт второй путь для внедрения: строка больше не подставляется в обработчик кнопки копирования без экранирования обратных слэшей и одинарных кавычек.
Пользователям нужно обновиться до 7.0.1 в стабильном канале или до 6.9.4 в бета-канале. Обновление клиента не переписывает файлы, которые уже лежат на диске. Выгрузки, сделанные до июля 2026 года, безопаснее создать заново, а старые открывать с отключённым JavaScript. Организациям разумно отнести свои архивы переписок к потенциально небезопасному содержимому и проверить, кто и когда их открывает.
Экспорт показывает, как текст, безобидный внутри приложения, превращается в исполняемый код на выходе. Пока у людей и компаний хранятся выгрузки, сделанные до июля 2026 года, уязвимость остаётся в силе, даже если сам клиент обновлён.
Ссылки