Эта статья была написана ещё вчера, но не была опубликована из этических соображений (раскрытие 1-day уязвимости). Однако буквально пару минут назад была опубликована новость от редактора Хабра, а в источнике, на который он ссылается, был приведен POC, поэтому я больше не вижу смысла ждать и решил опубликовать статью сейчас.

Недавно некоторые СМИ писали о "новой уязвимости" в приложении Telegram Desktop для Windows, которая позволяет злоумышленнику исполнять произвольный код при открытии чата с ним, если у вас включена автозагрузка файлов (она включена по умолчанию).

Была ли действительно эта уязвимость?

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

Дисклеймер

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

Как видно, при открытии чата загружается изображение, а сразу же после этого выполняется код (в данном случае - открывается калькулятор).

Чем была вызвана уязвимость

Уязвимость вызвана опечаткой в списке расширений исполняемых файлов, захардкоженном в коде Telegram Desktop. Так, вместо pyzw (файл типа Python Zip Application) в строке с запрещенными расширениями было pywz. Эта ошибка была исправлена в этом PR: https://github.com/telegramdesktop/tdesktop/pull/27737

Коммит с исправлением проблемы
Коммит с исправлением проблемы

Однако почему Python-файл со специфическим расширением был воспринят Telegram как картинка (если точнее, как GIF-анимация), из-за чего автоматически загружался и исполнялся? Дело в том, что Telegram, скорее всего, проверяет тип файла с помощью его Mime-type. Mime-type этого файла - image/gif:

Это происходит из-за magic number файла - GIF89A.

Переходим к самому интересному - к тому, как же выглядел этот файл.

При загрузке этого файла через файл-пикер Telegram Desktop он определяется как картинка.

А вот так выглядит после отправки.

Отдельно хочется сказать пару слов про источник BleepingComputer.

В нем указывается, что "хакеры использовали бота, чтобы изменить mime-type файла под видео" (в оригинале To masquerade the file, researchers devised using a Telegram bot to send the file with a mime type of 'video/mp4,' causing Telegram to display the file as a shared video). Это, конечно, неправда.

Mime-type файла определяется по специальному паттерну в самом файле или в крайнем случае по его расширению. Никакой Telegram-бот не может изменить mime-type файла, не внося изменения в сам файл. Также в этом источнике сказано, что проблема возникала с видео (video/mp4). Возможно, данный эксплойт можно было также замаскировать под видео, но оригинальное воспроизведение уязвимости было именно с GIF-файлом. Причем из-за того, что так называемый GIF-файл на самом деле им не являлся (был невалидным), Telegram отображал его как черный прямоугольник, что хорошо видно на видео выше, которое было широко распространено в СМИ. Из-за этого утверждение BleepingComputer про то, что хакеры якобы могли сделать файл со встроенной миниатюрой тоже довольно сомнительно.

Как защитить себя от подобных уязвимостей?

Будьте внимательны при открытии любых файлов, особенно от незнакомых вам людей. В идеале - вообще отключить автозагрузку файлов.

Личный совет - используйте веб-версию Telegram (https://web.telegram.org) вместо десктопной. Уязвимости веб-версии приложения (например, XSS - и их уже находили, тык статья на Хабре) гораздо сложнее эксплуатировать из-за сложностей работы с MTProto из веба, плюсом вы защититесь от RCE на вашем устройстве, потому что браузер не предоставляет API для работы с системными командами.

Также Telegram Desktop хранит ваши сессии как файлы в папке "tdata", что позволяет любому стилеру или пиратскому приложению на вашем компьютере использовать этот файл и угнать аккаунт Telegram (вы не получите даже уведомления).

Если вы используете Telegram Desktop, обязательно обновитесь.

Комментарии (43)


  1. wataru
    14.04.2024 10:13
    +3

    Все еще непонятно. Из-за первых байт файла телеграм считет его картинкой и скачивает. Потом пытается отобразить? В какой момент выполняется питоновый скрипт? Нужно ли для этого отдельно устанавливать питон и чтобы он был ассоциированс pyzw файлами?


    1. difhel Автор
      14.04.2024 10:13
      +11

      Скрипт выполняется при проигрывании гифки. Да, для того чтобы скрипт был выполнен и pyzw-файлы ассоциировались с Python, он должен быть установлен. Несмотря на заверения Telegram, что Python установлен о 0.01% пользователей Telegram Desktop, 0.01% от 800 миллионов это все еще большое количество пользователей. Предполагаю, что у большинства пользователей Хабра Python установлен, поэтому мы как раз "целевая аудитория" тех, кто может эксплуатировать этот баг.


      1. onepumpum
        14.04.2024 10:13
        +5

        у большинства пользователей Хабра Python установлен, поэтому мы как раз "целевая аудитория"

        Ну всё же затрагивает только windows клиент + python, думаю тут количество чуть поменьше.

        Но всё ещё не очень понятно как и зачем телеграмм вообще открывает подобные файлы, ещё и блэк лист расширений, какой-то бред


        1. dartraiden
          14.04.2024 10:13
          +3

          Но всё ещё не очень понятно как и зачем телеграмм вообще открывает подобные файлы, ещё и блэк лист расширений, какой-то бред

          Если файл является медиафайлом, то телеграм автоматически пытается сделать его превьюшку или даже начать его воспроизводить (пример). При этом, похоже, используются системные возможности (возможно, если клиент не может сделать превьюшку сам?).

          Скрипт на Python определяется клиентом как медиафайл из-за первой строчки. Дальше расширение файла проверяется по захардкоженному списку исполняемых файлов ("тихое" открытие которых по умолчанию запрещено и попытка открыть файл (даже руками по двойному клику) выдаёт окно "это исполняемый файл, открываем?") и файл передаётся в ОС на открытие.

          Без обхода чёрного списка расширений исполняемых файлов этот эксплоит срабатывал бы ещё у меньшего числа пользователей - лишь у тех, кто ранее пытался открыть исполняемые файлы и поставил галочку "не спрашивать больше". Но, благодаря тому, что в чёрном списке была опечатка, удалось найти такое расширение, которое не воспринимается как исполняемый файл, являясь им.

          Дальше всё складывается: скрипт на питоне воспринимается как медиафайл, клиент не может сделать превью и, поскольку не воспринимает файл как исполняемый, передаёт его на исполнение операционной системе без вопросов.



        1. me21
          14.04.2024 10:13

          Сейчас проверил - у меня windows + python, но это расширение не связано с ним. Ставил Python из Microsoft Store, может быть, поэтому.

          На видео, кстати, выполняется клик по файлу. Если включено автовоспроизведение gif, но по файлу не кликать, калькулятор запустится?


      1. KovalevArtem
        14.04.2024 10:13
        +5

        заверения Telegram, что Python установлен о 0.01% пользователей

        Telegram

        Возникает вопросик откуда у них эта информация? Зачем они собирают информацию об установленных приложения?


  1. d2d8
    14.04.2024 10:13
    +3

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

    В методе sendvideo можно добавить thumbnail, вероятно можно обойти и mime-type video/mp4 схожим с gif методом.
    https://core.telegram.org/bots/api#sendvideo


    1. difhel Автор
      14.04.2024 10:13

      Интересное предположение, кстати. Но я сомневаюсь, что BC имели в виду это. Если посмотреть на их POC, то он даже близко не похож на настоящий эксплойт - там даже нет magic number. В любом случае, к качеству их новости большие вопросы.


  1. Lagovi
    14.04.2024 10:13

    любому стилеру или пиратскому приложению на вашем компьютере использовать этот файл и угнать аккаунт Telegram

    Двухфакторная авторизация же защищает?


    1. kmeaw
      14.04.2024 10:13
      +3

      Нет, ведь можно угнать сессионные идентификаторы вместе с ключами - для серверов Telegram это будет выглядеть, как если бы пользователь просто сменил свой IP, что вполне может произойти при переключении между мобильной сетью и wi-fi.


    1. Sulerad
      14.04.2024 10:13

      Нет, потому что двухфакторка обменивается на файл сесии, а вот его уже можно угнать.

      Но у телеграма есть некоторая защита в том, что если одна сессия используется одновременно с двух разных ip, то телеграм её мгновенно банит и нужно будет проходить флоу авторизации по новой, а это уже будет очень заметно для пользователя. Поэтому украв сессию, нужно её сначала удалить с компьютера пользователя и тем самым разлогинить его оттуда =)

      Единственный вариант защититься — при каждой попытке логина (даже своими руками) проверять список активных сессий в настройках приложения на наличие дублей и всякой подозрительной активности.


      1. nuclight
        14.04.2024 10:13

        Шта? Последний абзац противоречит предыдущему. Да и не было такой защиты, по крайней мере раньше, потому что это любые переключения срубит.


        1. Sulerad
          14.04.2024 10:13
          +1

          Банит только если сессия одновременно используется с двух разных IP. При переключении IP меняется и со старого запросы естественным образом перестают ходить.


    1. DarkByte
      14.04.2024 10:13
      +2

      С веб-версией есть фича-баг: в десктопном\мобильном клиенте отправляете самому себе ссылку web.telegram.org, переходите по ней, клиент добавляет к ссылке токен, и по этому токену веб-версия создаёт новую сессию без запроса второго фактора. Но при этом в мобильный клиент прилетает уведомление о новой сессии, поэтому совсем незаметно сделать не получится, если нет доступа к устройству


    1. FkaOmajsK
      14.04.2024 10:13

      Двухфакторка – нет. Локальный пароль (пасскод) – да


  1. 0gur4ik
    14.04.2024 10:13

    Спасибо, годная статья


  1. DarkByte
    14.04.2024 10:13
    +7

    Блеклист вместо вайтлиста для исполнения файлов это конечно капец какое смелое решение; но что интересно, в оригинальном видео консоль открывается ещё до наведения мышки (и теоретически клика) на загруженный файл. То есть это либо другой баг, либо видео фейк


    1. Rubilnik
      14.04.2024 10:13
      +1

      Телеграм гифки вроде как автоматически воспроизводит, может в этом все дело.


      1. DarkByte
        14.04.2024 10:13
        +1

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

        Что интересно, в клиенте последней версии (4.16.6) баг воспроизводится. Но работает только для того, кто отправил файл, требует клика по файлу, ну и естественно установленного питона. Для остальных файл загружается с расширением .untrusted, и соответственно код не исполняется.


        1. difhel Автор
          14.04.2024 10:13

          .untrusted - это временный серверсайдный костыль, до недавнего времени его не было.


          1. DarkByte
            14.04.2024 10:13

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


            1. vikarti
              14.04.2024 10:13
              +1

              Вот только в видеокодеках тоже...бывают проблемы https://wrv.github.io/h26forge.pdf


  1. seepeeyou
    14.04.2024 10:13

    В оригинале никак не указано, что бот меняет mime-type файла, вы просто не поняли английский.


  1. muxa_ru
    14.04.2024 10:13
    +1

    Красиво, но не ново, php-бэкдоры издревле прячут в exif'ах jpg-файлов. :)

    Тут гораздо интереснее то, что у них список не разрешённых разрешений, а запрещённых.

    То есть, можно подобрать комбинацию технологий под какие-то конкретные решения и редко используемые расширения и атаковать кого-то конкретного.


    1. d2d8
      14.04.2024 10:13
      +1

      php очень толерантен к мусору в файле, в отличии от python, который падает от лишнего пробела.


      1. muxa_ru
        14.04.2024 10:13

        Вопрос в том, на чём ещё это сработает.

        Какой софт может стоять у конкретного человека, к которому так можно обратиться?


        1. d2d8
          14.04.2024 10:13

          Не вопрос. 1-3% пробив считается успешным.


          1. nuclight
            14.04.2024 10:13

            Может, таки не "пробив", а "отстук"?


  1. TastaBlud
    14.04.2024 10:13
    +2

    Причем из-за того, что так называемый GIF-файл на самом деле им не являлся (был невалидным), Telegram отображал его как черный прямоугольник, что хорошо видно на видео выше, которое было широко распространено в СМИ. Из-за этого утверждение BleepingComputer про то, что хакеры якобы могли сделать файл со встроенной миниатюрой тоже довольно сомнительно.

    Из-за того, что gif является контейнером, то возможно сделать файл, который будет и валидной картинкой, и, например, исполняемым файлом одновременно. И то, что отображался прямоугольник, означает, что не очень заморачивались, и только.

    Но вот сама возможность исполнять "картинку" вместо того, чтобы просто отобразить (или не отобразить) выглядит как уязвимость именно в компоненте отображения. И блеклист расширений файлов - скорее костыль, чем правильное решение.


  1. Kenya-West
    14.04.2024 10:13

    Личный совет - используйте веб-версию Telegram (https://web.telegram.org) вместо десктопной

    Мне кажется, ещё Unigram подойдёт как альтернатива - у него ограничения песочницы UWP служат как дополнительный барьер. Много из-под сильно огораниченного юзера с урезанной средой уж точно не поделаешь.


    1. Rubilnik
      14.04.2024 10:13

      А официальный клиент Telegram из Microsoft store не работает в песочнице?


      1. Kenya-West
        14.04.2024 10:13
        +1

        100% нет. Последние годы MS разрешила публиковать в Microsoft Store любые "классические" Win32-приложения практически без ограничений и дополнительных модификаций. Более того, даже с теми же кастомными инсталляторами, то есть скачивается инсталлятор, 100% идентичный такому же напрямую с сайта. По этой причине там можно найти Python, PowerShell и т. д.

        А именно модель UWP с соответствующими ограничениями утилизируют всё меньше и меньше приложений, так как M$ это фактически депрекейтнули и написали план по миграции. А жаль, такая модель много где могла выстрелить!


  1. Hint
    14.04.2024 10:13
    +2

    Не знаю кому верить. В Telegram уверяют, что информация про zero-click - ложь. И в целом логично. Потому что я не представляю, с чего вдруг файл должен запускаться автоматически. А с кликом всё понятно, кликнул - открыл в ассоциированной программе (как текстовый или любой другой файл). И список плохих расширений тогда тоже логичен. И всё вот это про mime-тип, про превью к видео - тоже становится логичным. Потому что какая разница превью или нет, если бы скрипт запускался без действия пользователя.


    1. difhel Автор
      14.04.2024 10:13

      Можете прочитать https://habr.com/ru/articles/807535/comments/#comment_26724291


  1. Rubilnik
    14.04.2024 10:13

    Я так понимаю без интерпретатора python ничего не сработало бы все равно?


    1. difhel Автор
      14.04.2024 10:13
      +1

      Да. Но из-за того, что Telegram блокирует исполняемые файлы по черному списку расширений, таких багов может быть больше.


  1. nuclight
    14.04.2024 10:13
    +1

    Мало того, что это чушь, так это еще и перепост из канала "НеКасперский" без отсылок? Сижу в обоих чатах с разработчиком Telegram Desktop, тема обсуждается уже сколько дней, так вот, коммит НЕ связан с видео - это результат обсуждений "а какую бы еще защиту от дурака впихнуть", поскольку клика оно таки требует. Процитирую комментарий оттуда:

    Sominemo, [14 Apr 2024 20:39:42]
    Эта опечатка не связана, ее просто между прочим поправили. "Уязвимость" на разлетевшемся видео показывает картинку, которая при самом отображении, без каких либо кликов, исполняет код.

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

    В Telegram Desktop уже была другая похожая уязвимость, когда можно было залить exe-файл под видом сломанного видео, но:

    1. для исполнения всё равно нужно было кликнуть по видео

    2. desktop показывал предупреждение о попытке запустить исполняемый файл

    3. чтобы запустить pywz всё равно нужно, чтобы на ПК была установлена среда для разработчиков Python.

    Ещё раз повторюсь: это исправление не связано с разлетевшемся видео, так как на нём отправлялась картинка и не требовала кликов. Уязвимость, которую показывали на видео, никому так и не удалось подтвердить.


    1. difhel Автор
      14.04.2024 10:13
      +4

      Здравствуйте! Хочу прояснить пару вещей.

      1. Эта статья написана лично мной от начала и до конца. Про существование указанного канала я ничего не слышал. Ваши претензии о воровстве ошибочны.

      2. Действительно, эта уязвимость требует клика для воспроизведения видео. Это не zero-click уязвимость, о чем было написано в официальном Twitter Telegram.

      3. При клике на файл не появляется никакое окно с подтверждением, как с exe файлами, о которых вы упомянули. Сразу же вызывается код. Сейчас это поведение прикрыто костылем в виде того, что ко всем скачиваемые файлам с расширением .pyzw на серверной стороне добавляется ".untrusted".

      4. Похоже, видео в статье действительно фейк, и именно это ввело вас в заблуждение. Я могу предоставить видео с воспроизведением one click уязвимости - она действительно есть (была), и я честно рассказал о ней все, что мне удалось выяснить.


      1. nuclight
        14.04.2024 10:13
        +2

        Насчет каналов, сейчас этого хайпа и кликбейта постят, не разобравшись, все подряд, может и наоборот украли, но в общем пофиг. По сути из Telegram Info передают вот что:

        Sominemo, [15 Apr 2024 00:51:38]
        Для pwn'а надо было или иметь на ПК жертвы Python SDK, или использовать неэкзотический формат исполняемого файла — но в последнем случае жертва увидела бы предупреждение об исполняемом файле. Ну и заставить жертву кликнуть по сломанному видео. Поэтому зона покрытия и серьёзность уменьшается.

        Да и описываемый случай не подпадает под понятие RCE в общем понимании — а в заголовке именно крики про RCE, сразу надумывается возможность запуска кода от одного лишь прочтения сообщения.

        Тут именно неправильное отображение типа файла и скрытие расширения, что в комбинации с опечаткой в расширении экзотического вида исполняемых файлов и немного минимальной социальной инженерии (нужно заставить юзера кликнуть на непонятное сломанное видео) позволяет запускать код на некоторых системах по одному клику без подтверждения пользователя.

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

        Перепишите, повесьте сверху UPD или удалите статью.

        Насчет предоставления видео - можете предоставить, но простой вопрос: свежеустановленный Telegram спрашивает подтверждение на этот клик?


        1. difhel Автор
          14.04.2024 10:13
          +1

          Нет, не спрашивает. Он просто скачивает и предлагает открыть файл с расширением ".untrusted". Такой вот серверсайдный костыль


    1. muxa_ru
      14.04.2024 10:13

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

      Так файл запускался или нет?


      1. Hint
        14.04.2024 10:13
        +6

        При клике на любой прикреплённый файл телеграм клиент открывает этот файл ассоциированной в конкретной системе с его расширением программой (просмотрщик картинок для jpg, word для docx и так далее). Если расширение из чёрного списка (exe и прочие), то есть дополнительный запрос (хочет ли пользователь открыть).

        У тех, у кого установлен python, при клике на pywz запускался python. Без дополнительного запроса, потому что расширение не было в чёрном списке.