Неэкранированный разделитель команд в IPC Telegram Desktop позволяет похитить файлы сессии одним кликом

telegram

Одного клика по ссылке достаточно, чтобы настольный клиент Telegram отправил чужие файлы в канал злоумышленника. Уязвимость CVE-2026-107181 затрагивает Telegram Desktop до версии 7.2.9, оценка по шкале CVSS 3.1 составляет 8.1, по CVSS 4.0 - 8.6, уровень High. Подтверждена работа цепочки на Windows, в остальных системах клиент использует тот же механизм обработки ссылок. В финале атаки злоумышленник получает доступ к чужой учётной записи, а не отдельные документы. Механику описал исследователь Эмилиано Версини.

Уязвимость CVE-2026-107181

Схема опирается на то, как клиент обрабатывает собственные ссылки. Операционная система знает, что адреса вида tg:// принадлежат Telegram, и запускает приложение, передавая ему строку целиком. Если копия уже работает, новый процесс не открывает второе окно: он находит локальный сокет, отдаёт по нему ссылку и завершается. Сокет переносит байты, а не объекты, поэтому ссылку приходится превращать в строку. Формат простой: ключевое слово, аргумент и точка с запятой в роли разделителя между командами. Первая ошибка касается именно этой точки. Содержимое ссылки перед записью в сокет не экранируется, поэтому точка с запятой внутри параметров становится границей между командами. Адрес вида tg://x?a=1;OPEN:interpret:... приходит на принимающую сторону не одной инструкцией, а двумя.

Вторая ошибка - внутренняя схема interpret:. Она появилась для публикации релизов Telegram. Сценарий сборки писал текстовый файл, где указаны канал, отправляемый файл и подпись, после чего запускал клиент с путём к этому файлу. Обработчик читал инструкцию и отправлял файл в заданный канал. Проверки прав не было, запроса на подтверждение тоже. Из командной строки это не создавало проблемы: чтобы добраться до неё, злоумышленнику уже нужен доступ к машине. Но как только та же операция стала достижимой через сокет, действие с повышенными правами оказалось доступно из клика по ссылке.

Путь к файлу-инструкции не очищался от переходов на уровень выше, поэтому относительный адрес вроде ../../../Downloads/Telegram%20Desktop/instructions.txt выводил за пределы служебного каталога. Имя пользователя знать не требуется: относительные пути отсчитываются от рабочего каталога клиента, а папка загрузок лежит рядом с ним, на три уровня выше.

Практическая атака выглядит так. Злоумышленник создаёт супергруппу и добавляет туда жертву: при настройках по умолчанию согласие приглашённого не нужно. В группу заранее загружаются текстовые файлы-инструкции, по одному на каждую цель. Настольный клиент в стандартной конфигурации сам скачивает из групп файлы размером до 8 МиБ, поэтому инструкции оказываются на диске без единого действия со стороны человека, в папке Downloads/Telegram Desktop и под предсказуемыми именами. Затем в чат уходит обычная ссылка на https, а сервер злоумышленника отвечает перенаправлением на адрес tg://x?a=1;OPEN:interpret:... Каждая точка с запятой открывает новую команду, и вся цепочка вытаскивает по файлу за шаг. Подтверждений и уведомлений при этом не появляется. Ссылку нужно открывать вне Telegram: адреса tg://, нажатые в самом чате, обрабатываются внутри процесса и до сокета не доходят.

Дальше начинается работа с украденным. Telegram Desktop не хранит локальные данные в открытом виде, включая авторизацию сессии. Ключ шифрования данных сам защищён вторым ключом, который получают из пароля пользователя и соли. Локальный пароль по умолчанию не задан, поэтому в вычисление уходит пустая строка, а соль лежит открыто рядом с зашифрованным ключом в файле tdata/key_datas. Одного этого файла хватает, чтобы восстановить второй ключ, распаковать ключ шифрования данных и прочитать файл авторизации протокола MTProto (собственный протокол Telegram для связи клиента с серверами). Трёх файлов из служебного каталога достаточно, чтобы собрать копию сессии и открыть чужой аккаунт на своём устройстве. Локальный пароль здесь работает иначе, чем кажется: он не мешает вынести файлы, зато делает украденную сессию бесполезной.

Об устранении почти не сообщали. Правку внесли 16 сентября 2026 года, выпуск 7.2.9 опубликовали на следующее утро; в списке изменений упоминалась только правка отрисовки. Саму уязвимость закрыли, убрав схему interpret:// и функцию, которая её обслуживала, и добавив экранирование разделителя при передаче данных через сокет: точка с запятой внутри значения больше не превращается в границу команды. Заодно клиент перестаёт выполнять служебные записи, если то же соединение несёт открытие ссылки, и отбрасывает локальные пути, когда в соединении уже встречался внешний адрес. Идентификатор CVE-2026-107181 присвоили 7 октября, изначальный отчёт ушёл в программу раскрытия уязвимостей ZDI (ZDI, Zero Day Initiative, площадка по скупке и публикации сведений о уязвимостях) ещё 25 июня.

Что делать пользователям настольного клиента. Обновление до 7.2.9 устраняет причину, остальное снижает риск. Включите опцию "спрашивать, куда сохранять каждый файл": тогда автоматическая загрузка из групп не сработает и файл-инструкция не окажется на диске. Ограничьте круг тех, кто может добавлять вас в группы, только контактами. Отправлять украденное можно лишь в канал или супергруппу, так что это отнимает у атаки место доставки. Локальный пароль выбирайте как настоящий, а не четыре цифры.

История показывает слабое место настольных клиентов. Служебные механизмы, рассчитанные на локальный запуск и доверенное окружение, становятся доступны снаружи, как только до них дотягивается обработчик внешних ссылок. Ошибка в разделителе превратила внутренний инструмент сборки в канал утечки, а тихое исправление означает, что часть пользователей до сих пор не знает, почему им стоит обновиться.

Ссылки

Комментарии: 0