Исследователи ExPatch обнаружили уязвимость типа Stored XSS в Telegram Desktop, которая позволяла внедрить JavaScript в HTML-экспорт переписки.
Особенность атаки в том, что вредоносное сообщение не обязательно должно находиться в группе вместе с ботом. Достаточно, чтобы сообщение с заражённой inline-кнопкой оказалось в истории чата, а пользователь позднее экспортировал переписку в HTML и открыл полученный файл.
❓ Где находилась проблема
Причина оказалась довольно простой. При формировании HTML Telegram Desktop обрабатывал текст сообщений через функцию SerializeString(), которая экранирует HTML-символы.
Но текст inline-кнопок записывался напрямую:
button.text.toUtf8()То есть содержимое кнопки не проходило необходимую санитизацию. В результате HTML, находящийся внутри text, мог интерпретироваться браузером как настоящий markup, включая JavaScript.
При обычном использовании Telegram это было незаметно: клиент отображал содержимое кнопки как обычный текст. Проблема возникала именно на этапе формирования HTML-файла, который затем открывался уже в браузере.
🕵♂️ Как выглядел сценарий атаки
Злоумышленник создаёт сообщение с вредоносной inline-кнопкой. Такое сообщение может попасть в целевой чат через пересылку.
Далее пользователь спустя месяцы экспортирует историю переписки в HTML и открывает файл. В этот момент внедрённый код выполняется в контексте страницы.
Таким образом, между размещением payload и его выполнением может пройти очень много времени — сообщение фактически превращается в своеобразную «бомбу замедленного действия».
💻 Что мог получить атакующий
Согласно PoC исследователей, JavaScript получил доступ к данным, отображённым в экспортированной странице:
⏺️ текст сообщений, отправителей и временные метки;
⏺️ название и метаданные чата;
⏺️ содержимое всей HTML-страницы;
⏺️ локальный путь к открытому файлу.
Кроме того, XSS позволяла изменять DOM страницы. Например, содержимое экспорта можно было заменить поддельной формой авторизации или визуально изменить отображаемую историю сообщений. При этом серверная история Telegram не изменялась — речь шла именно о содержимом открытой HTML-страницы.
🧠 Как исправили
Telegram исправил проблему в коммите 8457d13a, применив SerializeString() к тексту inline-кнопок.
Уязвимость была исправлена в Beta v6.9.4 и Stable v7.0.1. На момент публикации исследования публичного CVE для этой проблемы ещё не было.
Если у вас сохранились старые HTML-экспорты, созданные уязвимой версией Telegram Desktop, само обновление клиента не переписывает эти файлы. Поэтому с ними также стоит обращаться осторожно.
#Telegram #XSS #StoredXSS #WebSecurity #AppSec #CVE #Cybersecurity #InfoSec #BugBounty
🔗 Все наши каналы 🔁 Все наши чаты 🪧 Для связи с менеджером
