Люди, которые ищут баги, иногда оказываются в неловком положении. Ты нашёл дыру, вендор её тихо закрыл, а на просьбу разрешить публикацию отвечает: «не надо». Что делать? Если ты из ExPatch Vulnerability Research — публикуешь всё равно. Именно так они и поступили с хранимой XSS в Telegram Desktop.
Механика простая и потому неприятная. Бот, которого нет в вашем чате, шлёт сообщение с невидимой inline-кнопкой. Внутри кнопки — HTML-тег script. Кто-то пересылает это сообщение в рабочую группу. Telegram сохраняет кнопку, потому что она URL-типа. Скрипт лежит и ждёт.
Ждёт он до того момента, пока кто-нибудь не нажмёт «Экспорт истории чата» в HTML. Telegram Desktop экранирует текст сообщений, имена, поля — но не текст кнопок. Одна строка в export_output_html.cpp просто записывала button.text.toUtf8() на страницу. Так любой HTML в поле text становился живой разметкой. Строка уехала в стабильный релиз ещё в марте 2024-го и прожила там два года и четыре месяца.
Что забирает скрипт, когда файл открывают в браузере? Сообщения из DOM, данные чата из шапки, document.body.innerText. Плюс location.href — а это имя пользователя ОС и структура папок. Никакого второго клика. Никаких предупреждений. Просто 400 миллисекунд, пока страница отрисовывается.
Самое интересное — privacy mode для ботов. Группы спокойно добавляют служебных ботов: погода, опросы, напоминания. Они помечены «не имеет доступа к сообщениям». API им ничего не отдаёт. Но HTML-экспорт ломает эту границу: бот пишет свои сообщения в файл, и оттуда скрипт читает всё, что видит страница.
Фикс вышел в Beta v6.9.4 и Stable v7.0.1. CVE не присвоен, advisory от Telegram нет. Исследователи отказались от вознаграждения и попросили отдать деньги на благотворительность. Публикацию вендор не одобрил, но проблема уже исправлена — так что это раскрытие после патча, без кода эксплойта.
Для себя решите одно: если вы регулярно экспортируете рабочие чаты в HTML и открываете их в браузере — возможно, стоит делать это иначе. Не потому что инструкция, а потому что теперь вы знаете, что там может лежать.
#XSS #Telegram #инфобезопасность #утечки



