РАЗБОР Статья

Разбор критической уязвимости CVE-2026-107181 в Telegram Desktop

Михаил Гудилин
Михаил Гудилин Script Kiddie · 18 сообщений
Подписаться
35
[ обложка статьи ]
Режим чтения
Обложка: кража ключа сессии Telegram через вредоносную ссылку


Что вас ждёт в статье:
Суть уязвимости
1. Как ОС решает, кому отдать ссылку
2. Где была ошибка
3. Чем это грозило пользователю
4. Как такое ловит Blue Team
5. Фикс и руководство для пользователя
Заключение
Таймлайн и источники


Суть уязвимости​

​

Допустим, в Telegram тебя добавили в какую-то группу, ты туда даже не
просился. В чате висит ссылка — мол, ознакомься с правилами. Ты кликаешь. На
экране будто ничего и не произошло. А за эту секунду с твоего компьютера уже
ушёл файл, по которому чужой человек спокойно заходит в твой аккаунт. Без
пароля и без кода из SMS.

Это CVE-2026-107181. Один клик по tg://-ссылке приводил к тому, что уязвимый
клиент читал локальный файл и отправлял его наружу без подтверждения. Среди
читаемых файлов — ключи сессии, по которым аккаунт восстанавливается на
чужом устройстве. Отсюда и формулировка «one-click account takeover» в
заголовках.

Нашёл баг исследователь под псевдонимом BeakSec — настоящее имя он не
раскрывает. О проблеме он сообщил через ZDI ещё летом, и Telegram тихо
закрыл дыру в версии 7.2.9. Дальше разберём по-человечески: что за ошибки тут
сработали.

​
ИдентификаторCVE-2026-107181
Класс (CWE)CWE-143 (инъекция через разделитель) и отсутствие авторизации у схемы interpret:
ПродуктTelegram Desktop (проверено на Windows; о macOS/Linux автор не сообщает)
Уязвимые версиидо 7.2.9
Исправлено в7.2.9 (17 сентября 2026); актуальная ветка — 7.3
CVSS8.6 по 4.0 (UI: P) и 8.1 по 3.1 (UI:R) — High
СтатусОпубликован рабочий PoC; атак «в полях» не зафиксировано, EPSS (система оценки прогнозов эксплойтов) ≈ 0.3 %
ИсследовательBeakSec (псевдоним; настоящее имя не раскрыто)

​

1. Как ОС решает, кому отдать ссылку​

​

Начнём с механизма, который сам по себе не баг, а штатная функция.
Приложение регистрирует в системе свою URI-схему, чтобы ОС знала, чем
открывать ссылки определённого вида. Браузер открывает http и https. Почтовик
— mailto. Telegram Desktop регистрирует схему tg.
С этого момента цепочка простая. Пользователь кликает по tg://… — хоть в
браузере, хоть в другом мессенджере, хоть в документе. ОС смотрит в свой
реестр схем, находит там Telegram и запускает его, передавая всю ссылку
аргументом командной строки. Клиент получает строку и разбирает её сам.

Схема: путь tg://-ссылки от клика до разбора внутри процесса Telegram

Жизненный цикл tg://-ссылки: внешний ввод попадает в процесс одним кликом
​
Важно понимать, что содержимое ссылки — это ввод, пришедший снаружи. Его
мог сформировать кто угодно. А дальше этот ввод живёт внутри доверенного
процесса. Любой разбор недоверенной строки — это место, где нужно быть
параноиком. Telegram тут параноиком не был.

​

2. Где была ошибка​

​

Сначала, давайте разберемся, как ссылка вообще попадает внутрь. Telegram
старается держать на систему один экземпляр. Кликаешь по tg://-ссылке — ОС
всё равно запускает ещё один процесс Telegram. Но второго окна не будет. Этот
процесс подключается к локальному сокету уже работающего клиента, передаёт
ему ссылку и тут же завершается. То есть ссылка путешествует между двумя
процессами. Это и есть IPC — межпроцессное взаимодействие.

В этом канале данные идут записями, разделёнными служебным символом.
Уязвимый код жил в Core::Sandbox (файл sandbox.cpp). Разбирая ссылку, он
складывал её данные в сообщение и не экранировал разделитель — а роль
разделителя играла точка с запятой, пришедшая прямо из ссылки.

Что это даёт?

Атакующий кладёт в ссылку разделитель — и одна запись
расщепляется на две. Приёмник видит вторую половину как самостоятельную
команду (в коде это записи вида OPEN: ). Для парсера она неотличима от
легитимной — её туда никто не добавлял осознанно. Классически это CWE-143,
некорректная нейтрализация разделителей записей.


Схема CWE-143: неэкранированный разделитель расщепляет запись IPC на две команды

Неэкранированный разделитель превращает одну запись в две

Здесь вылезает второй дефект, не менее важный. Через расщеплённую запись​
можно было дотянуться до внутренней схемы interpret. Это служебный
инструмент, которым Telegram публикует свои релизы, и он умел работать с
локальными файлами. Беда в том, что interpret вообще не проверял, кто его
вызвал. Авторизации не было никакой. Поэтому команда, прилетевшая из чужой
ссылки, исполнялась так же охотно, как команда от самого клиента.

Данные бывают недоверенные и внутренние команды доверенные.
В данном случае, баг позволил первым прикинуться вторыми, недоверенный
ввод доехал до механизма, который никто не сторожил.


3. Чем это грозило пользователю​


Возможным итогом является произвольное чтение файла с диска жертвы и его
отправка без подтверждения. При том, файл загружается в канал или
супергруппу атакующего прямо внутри Telegram.
Этот нюанс ещё всплывёт, когда дойдём до детекта.

Для Telegram это критично, поскольку клиент хранит данные сессии в каталоге
tdata. По сути это ключи, которыми устройство доказывает серверу, что оно —
это ты. Утёк такой файл — и пароль с кодом из SMS атакующему не нужны, он
поднимает сессию у себя и заходит в аккаунт как легитимный пользователь.

Пара уточнений, чтобы не плодить мифы:

Автоскачивание файлов в группах — это настройка по умолчанию: файлы до 8
МиБ оседают на диске сами, без участия пользователя. Вектору это нужно, чтобы
заранее положить служебный файл по предсказуемому пути. И про tdata часто
пишут, что “без код-пароля он лежит в открытом виде”, так вот это не совсем
так. Данные зашифрованы, но ключ выведен из пустого пароля, а соль лежит
рядом в открытую, так что расшифровываются они без усилий. Сам код-пароль
кражу файлов не останавливает, а лишь делает украденную сессию бесполезной
для входа.

По шкалам это 8.6 по CVSS 4.0 и 8.1 по 3.1 — высокий ущерб
конфиденциальности и целостности, но нужен клик пользователя.


4. Как такое ловит Blue Team​

​

Переходим к более практической части.
Можно повесить правило «Telegram полез на незнакомый адрес — значит,
утечка», но это не сработает, поскольку файл уходит не на внешний хост, а
публикуется в канал атакующего внутри самого Telegram. По сети это обычный
трафик мессенджера на его же серверы.
Сетевой детект тут слеп, и это важно понимать заранее.


Схема детекта: аномалии запуска и доступ к tdata вместо слепого сетевого правила

Следовательно, смотрим не на сеть, а на хост.
Два сигнала работают, и ни один не требует знать конкретный payload.
Telegram, запущенный с tg://-аргументом, в котором сидит служебный
разделитель или вложенная схема interpret, — уже аномалия. Нормальные
ссылки так не выглядят. Следовательно, возможная уязвимость ловится на
телеметрии запуска процессов.
К каталогу сессии в штатном режиме обращается сам клиент по своей логике.
Чтение этих файлов в момент обработки входящей ссылки — сигнал.
Файловый аудит на tdata стоит включить.
В общем, нет смысла здесь искать конкретную сигнатуру, аномалию стоит
ловить в цепочке «разбор ссылки → доступ к tdata». Инструмент класса EDR
здесь полезнее сетевого сниффера именно потому, что эксфильтрация не
выходит за пределы легитимного трафика Telegram.
Коротко, на что писать правила и алерты:
• запуск Telegram с tg://-аргументом, содержащим разделитель записи или
вложенную схему interpret;
• доступ к файлам из каталога tdata вне штатной логики клиента;
• версия Telegram Desktop ниже 7.2.9 на хостах — это предусловие, повод
закрыть проактивно;
• а вот сетевое правило «egress на не-телеграмовский адрес» для этой атаки
бесполезно — помните, почему.

​

5. Фикс и руководство для пользователя​

​

Вендор не ограничился экранированием. Исправление в 7.2.9 сделало сразу
убрало саму схему interpret вместе с её обработчиком, добавило проверки,
которые отбрасывают служебные команды и локальные пути, если рядом
пришла внешняя ссылка, а также и закрыло расщепление записей.

По сути закрыли обе ошибки разом — и инъекцию разделителя, и безнадзорный
interpret.

Любопытно, что в changelog 7.2.9 написано только «Fix some tlottie incorrect
renderings». Про уязвимость — ни слова, отдельного адвизори не было. Фикс
выехал тихо 17 сентября, а шум поднялся лишь в октябре, когда вышел
публичный разбор.

Делаем вывод, что ориентироваться на changelog как на индикатор
защищённости — плохая идея.

Автор находки же рекомендует следующие меры:
1. Обновить Telegram Desktop до 7.2.9 или новее. Это закрывает саму дыру,
остальное — снижение риска.
2. Ограничить, кто может добавлять вас в группы. Меньше неожиданных чатов
— меньше площадь для доставки ссылки.
3. Поставить локальный код-пароль на клиент. Кражу файлов он не остановит,
но украденная сессия станет бесполезной для входа.
4. Включить «спрашивать, куда сохранять файлы». Отключает тихое
автоскачивание, на которое опирался вектор.

Тянуть же с обновлением нельзя, поскольку рабочий PoC уже опубликован. Атак
в реальных условиях пока не видели, EPSS около 0.3 %, но после публикации
порог входа резко падает.
Тем же, кто сидит на неофициальных клиентах на кодовой базе Telegram Desktop,
стоит принять во внимание, что угроза актуальна до тех пор, пока авторы
кастомной сборки не обновлят её.

​

Заключение​

​

Telegram — всё ещё отличный мессенджер, баг такого рода мог вылезти в любой
программе, которая открывает ссылки.

Запомнить стоит, что ссылка — это данные, которые кто-то написал и которые
потом разбирает программа пользователя. Если программа ленится их
проверять, одна строка превращается в команду.

Для тех, кто эти атаки ловит рекомендацие же следующая:
Не ведись на очевидное. Здесь легко было поставить сетевое правило на «утечку
наружу» и спать спокойно, а файл всё это время уходит внутри обычного
трафика Telegram.

Баги в обработке ссылок никуда не денутся. Будут новые CVE, другие номера,
те же грабли. В данной же статье мы разобрали возможный вектор атаки, а значит
готовы к подобным уязвимостям в будущем!
​

​

Таймлайн и источники​

​

Таймлайн CVE-2026-107181: отчёт ZDI, фикс, разбор BeakSec, присвоение номера

Хронология: исправление, адвизори, огласка

Нашёл уязвимость исследователь под псевдонимом BeakSec. Сообщил о баге через
ZDI; оригинальный разбор с PoC — на его странице, проверено на Windows.

Первоисточник и материалы:
● Разбор автора: beaksec.github.io/posts/telegram-desktop-one-click-account-
takeover/
● NVD: nvd.nist.gov/vuln/detail/CVE-2026-107181
● VulDB: vuldb.com/vuln/414997
● Трекеры: security-tracker.debian.org и трекер Ubuntu по CVE-2026-107181
● Огласка в СМИ: cybernews.com — one-click Telegram Desktop exploit

Дисклеймер:
материал носит учебный характер и описывает класс уязвимости и методы защиты.
Операционные детали эксплуатации намеренно опущены. Обновляйте ПО и не кликайте по ссылкам из непрошеных чатов)
Полезно

Комментарии

0