• [ Регистрация ]Открытая и бесплатная
  • Tg admin@ALPHV_Admin (обязательно подтверждение в ЛС форума)

Статья Как я написал эксплоит для бага в Telegram и что было дальше

stihl

Moderator
Регистрация
09.02.2012
Сообщения
1,181
Розыгрыши
0
Реакции
510
Deposit
0.228 BTC
stihl не предоставил(а) никакой дополнительной информации.
Недавно мне на глаза попался Для просмотра ссылки Войди или Зарегистрируйся примерно такого содержания: «В Telegram выявлена новая уязвимость, связанная с загрузкой видеороликов». К посту прилагалась демонстрация: пользователь получает видео, при тапе по которому Telegram пытается установить стороннее приложение. При этом проблема не привлекла особенного внимания. Я решил разобраться, работает ли способ, и написать к нему эксплоит.

Демонстрация уязвимости​

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

Вначале мы видим командную строку, где атакующий вводит параметры бота и отправки: токен бота, ID чата, путь до файла APK для загрузки и путь к картинке (preview). Также предлагается ввести сообщение и скрыть его как спойлер. Все ключи и ID на видео замазаны.


Для просмотра ссылки Войди или Зарегистрируйся
После ввода параметров атакующий видит подтверждение удачной отправки. Атакуемый же получает сообщение, которое выглядит как обычный видеофайл.

Для просмотра ссылки Войди или Зарегистрируйся

При нажатии на него появляется сообщение, что видеофайл не может быть воспроизведен и необходим дополнительный плеер. Если пользователь дает согласие, происходит инсталляция самого присланного файла при помощи стандартного инструмента для установки APK в Android.

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

Ну а в конце в видео показан «отстук» в панель управления трояном и возможность доступа к приватным данным и удаленного управления смартфоном. Также по видео мы можем косвенно подтвердить, что автор из Турции, так как в панели фигурирует эта страна, а IP рядом указан локальный.


One-tap exploit​

Итак, перед нами one-tap exploit (или one-click exploit) — эксплоит одним кликом или тапом. Это тип уязвимости, который позволяет злоумышленнику получить контроль над устройством или аккаунтом жертвы, если та сделает всего одно нажатие. Эти эксплоиты менее опасны, чем, скажем, RCE, поскольку требуют хоть и минимального, но все же действия со стороны пользователя: обычно достаточно просто кликнуть на вредоносную ссылку. Хороший общеизвестный пример такой уязвимости — XSS.

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


Как устроена уязвимость​

Я пересмотрел видео и попытался собрать максимум информации. Может быть, важны какие‑то детали или вдруг попадутся рабочие куски кода? Внимательно наблюдаем за процессом подготовки: указывается картинка для видео, указывается сам файл, который должен быть установлен, ID бота и TGID жертвы.

Из всего перечисленного следует, что достаточно передать любой файл, — главное, чтобы клиент Telegram признал, что это видео. «Значит, проблема кроется в отправке файлов!» — решил я и погрузился в изучение API Telegram, а точнее — той части, где мы отправляем файлы. Особое внимание, конечно, уделяем видео.

Для просмотра ссылки Войди или Зарегистрируйся

Вроде бы все в порядке: API как API. Но мой взгляд цепляется за неприметное поле thumbnail, в котором и передают картинку для видео. Как мы помним, на видео как раз прикрепляли картинку. Вряд ли это совпадение. Зачем‑то ведь еще передается и mime type... В функции отправки видео мы почему‑то должны сообщать, что отправляем видео. Подозрительно!

Что такое MIME​

MIME-тип (Multipurpose Internet Mail Extensions) — это стандарт, используемый для описания типа содержимого различных файлов, передаваемых по сети. Первоначально он разрабатывался для электронной почты, но теперь MIME-типы применяются в различных интернет‑протоколах, включая HTTP, чтобы указать тип передаваемого контента.
MIME-тип состоит из двух частей: основного типа и подтипа, разделенных косой чертой (например, type/subtype).
Примеры некоторых распространенных MIME-типов:
  • text/plain — обычный текстовый файл;
  • text/html — HTML-документ;
  • image/jpeg — изображение в формате JPEG;
  • application/json — данные в формате JSON;
  • application/pdf — документ в формате PDF.
MIME-типы указывают, как следует интерпретировать передаваемый контент, чем помогают программам корректно обрабатывать и отображать файлы.
Если мы сообщаем, что тип — «видео», значит, мы можем при этом отправить не видео? И если так, то мы, вероятно, получим поведение, которое видели в ролике с демонстрацией: Telegram попробует запустить наше «не видео», у него ничего не получится, и он захочет установить «видеоплеер» для этого типа файлов. Все складывается, кроме одного момента: непонятно, как передать этот самый подходящий видеоплеер для установки. Ну или, говоря языком безопасности, «нагрузку». Пока не все понятно, однако мы явно на верном пути.

Такие были мои размышления в тот момент. И конечно, руки горели воспроизвести уязвимость самостоятельно.


Пишем PoC​

Proof of Concept (PoC) — это, если мы говорим про безопасность, демонстрация возможности проэксплуатировать уязвимость. PoC показывает, что баг реален и злоумышленник может его использовать в своих целях.

У нас уже достаточно вводных данных, чтобы проверить гипотезу, поэтому приступим к кодингу.

Первым шагом нужно сделать бота при помощи BotFather и получить токен. Сделать это элементарно:

  • стучимся к Для просмотра ссылки Войди или Зарегистрируйся;
  • выполняем по очереди команды /start и /newbot;
  • вводим данные, которые у нас запрашивает бот‑отец (имя нового бота и прочее);
  • пройдя «квиз», получаем botTokenTG нового бота.
Для просмотра ссылки Войди или Зарегистрируйся

Далее набрасываем на Node.js простейший код, который будет отправлять видео. И конечно, применяем обнаруженные нами странные параметры. Попробуем отправить файл APK, но с MIME-типом MP4. В третьей строчке вставляем токен, полученный от BotFather.

Код:
const fs = require("fs");
const TelegramBot = require("node-telegram-bot-api");
const token = "botTokenTG";
const bot = new TelegramBot(token, { polling: true });

bot.onText(/\/video/, (msg) => {
  const chatId = msg.chat.id;
  bot.sendVideo(
    chatId,
    fs.readFileSync("/путь/к/файлу.apk"),
    {
      width: 300,
      height: 300,
      duration: 30,
    }, {
      filename: "VIDEO.apk",
      contentType: "video/mp4"
    }
  );
});

Здесь /video — это команда, которую наш бот будет ждать, чтобы ответить «эксплоитом».

Выбираем APK (я тупо сделал touch VIDEO.apk, чтобы создать его) и указываем путь к файлу, который хотим отправить или запустить.

Запускаем демон бота и передаем ему команду /video. В ответ он нам возвращает сообщение с нашим APK под личиной video.

Результат — на скриншотах ниже. Пустой файл отображается как белый квадрат, на который можно нажать.

Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся

Тапаем, чтобы посмотреть, что же случится.

Для просмотра ссылки Войди или Зарегистрируйся
Офигеть! Нам предлагают установить приложение! И что же будет, если нажать «Открыть»? В таком случае Telegram зачем‑то пытается установить присланный ему файл. Нагрузка и есть тот файл, который мы прислали. Фантастика!

Как? Зачем? Почему? Скажу сразу, это для меня так и осталось загадкой: Telegram зачем‑то пытается устанавливать файл плеером для самого себя. То есть прислали файл «ромашка.avi» и для просмотра Telegram может попытаться открыть его в «ромашка.avi». К автору такого кода множество вопросов (в том числе, где он берет наркотики), но для нас важно, что эксплоит работает.


Общение с Telegram​

Я, как белый ресечер (и даже более того — автор книги по цифровой безопасности, филантроп и, даст бог, миллионер), конечно же, посчитал своим долгом известить команду безопасности телеги. Благо с этим у них все в порядке и первый же заход в Google привел меня к адресу security@telegram.org.

Для просмотра ссылки Войди или Зарегистрируйся
Отличная новость! Мы на этом сможем еще и заработать пару десятков вечнозеленых, ведь эта проблема по масштабам вторая после недавней связанной с опечаткой в расширении файла. «Вдруг на какую‑нибудь подержанную видеокарту хватит, это ж можно будет с ИИ играться!» — подумал я ненароком.

С воодушевлением пишу письмо в Telegram, прилагаю черновик этой статьи и эксплоит, который мы сделали выше. Отправляю и жду... Через пару дней вижу, что поведение клиента изменили: теперь файл прилетает просто как APK без картинки. Еще через пару дней получаю ответ, он ниже на скрине.

Для просмотра ссылки Войди или Зарегистрируйся

Облом: представители Telegram ответили, что баг пофиксили еще до моего репорта и приняли какие‑то меры на бэкенде. И всё. Никаких благодарностей и почетных грамот, не говоря уже про кружку сока. «Мы всё пофиксили еще 9 июля, будьте здоровы!» Ну только без пожелания здоровья.

Что ж, говорите что хотите, а я наблюдал баг после 9 июля. С другой стороны, авторство я присвоить себе действительно не могу, хоть видеокарта бы и не помешала. Так что остается только вспомнить Для просмотра ссылки Войди или Зарегистрируйся про мужика, которому всё пофиг.

Думаю, заявления о том, что всё исправили в тот же день, делаются просто для поддержания репутации. Ну а проблема «кто‑то сдал баг раньше» бывает даже на проектах, в которых ты действительно нашел уязвимость сам, а тут я только заприметил ее в публичном блоге.

Как выяснилось позже, в продаже эксплоит появился месяцем раньше, 6 июня, на площадке с открытой регистрацией. Так что вряд ли и этот день можно считать днем открытия эксплоита, ведь кто‑то к этому времени не только сделал PoC, но и собрал продукт на продажу.

Для просмотра ссылки Войди или Зарегистрируйся

От редакции: переписка с Telegram​

В тех случаях, когда автор говорит одно, а представители компании — другое, дело редакции — направить официальный запрос и привести доводы другой стороны. Нам повезло: представитель Telegram сам обратился к нам, отреагировав на недавнюю публикацию. О том же баге, что описан в этой статье, сообщила компания ESET, и новость об этом Для просмотра ссылки Войди или Зарегистрируйся на «Хакере» 23 июля.
Нам написал Реми Вон и представился сотрудником Telegram. Дальше перевод его писем и моего ответа с английского:
Хочу обратиться к вам по поводу вашей статьи, прошу включить в нее следующее заявление.
Этот эксплоит не является уязвимостью в Telegram. Он требует, чтобы пользователь открыл видео, поменял настройки безопасности Android и вручную установил подозрительное «медиаприложение».
Мы получили отчет об этом эксплоите 5 июля и сделали изменения на стороне сервера 9 июля, чтобы защитить пользователей всех версий Telegram.
Чем я и воспользовался, чтобы задать вопрос про нестыковки по времени.
Не вижу никаких проблем с нашей новостью, поскольку эксплоиты одним кликом опасны и эффективны, а также задокументированы как Для просмотра ссылки Войди или Зарегистрируйся по MITRE. Клиентское приложение Telegram проявляло неожиданное для пользователя поведение, что представляло угрозу. Допустимость такого поведения и называется уязвимостью. Это подтверждает отчет ESET, а также сам факт того, что ваши инженеры опознали и быстро устранили проблему.
Более интересен другой вопрос: у нас есть свидетель того, что атака была по‑прежнему возможна и 11 июля, и позже — вплоть до 15 июля. Не могли бы вы помочь прояснить эту ситуацию?
На что получил следующий ответ.
Это никогда не было уязвимостью типа one-click. Пользователь должен был предпринять несколько шагов, прежде чем стать жертвой атаки. Telegram, может быть, и скачивал файлы автоматически, но пользователям тем не менее нужно было разрешить установку APK-пакетов, открыть файл и подтвердить установку.
Копии файла, отправленные до серверного апдейта 9 июля, продолжали отображаться как видео. Это было исправлено в появившемся вскоре апдейте приложения.
Нам здесь остается только пожать плечами:
  • Настойчивые заявления о том, что уязвимость пофиксили 9 июля, по‑прежнему звучат сомнительно. Автор статьи настаивает, что узнал об уязвимости 10 июля, и приводит скриншоты, где эксплуатация происходит 11 июля — с совершенно новым файлом. Какой‑то серверный фикс, может быть, и имел место, но его эффективность под вопросом. В таком случае, рассуждая о копиях файла, господин Вон здесь выдает желаемое за действительное.
  • Уязвимости часто подразумевают условия для эксплуатации и от этого не перестают быть уязвимостями. Да и разрешение на установку APK — никакая не редкость. Так что, несмотря на протесты со стороны Telegram, это, на наш взгляд, вполне можно считать багом one-click.
Для просмотра ссылки Войди или Зарегистрируйся

Выводы​

На мой взгляд, соблазн торговать такими багами в даркнете как раз таки должен пропадать благодаря программам багбаунти, а если они работают кое‑как и с неохотой, то и сдавать баги будут так же. Пользуясь случаем, рекомендую использовать для безопасной переписки Для просмотра ссылки Войди или Зарегистрируйся и Для просмотра ссылки Войди или Зарегистрируйся. Что до Telegram, то я рад, если получилось сделать и его (а следовательно, и мир) чуточку безопаснее.

Впрочем, сильно ли? Присланные APK после фикса больше нельзя маскировать под видео, но присылать по‑прежнему можно. При клике на них Android по‑прежнему будет предлагать установку (если она разрешена в настройках) или советовать включить возможность установки APK. Если сделать файл маленьким, то клиент еще и автоматически скачает его, что сократит лишний шаг атаки. Поиграв с именем файла, оттеняющим расширение, злоумышленник сможет еще больше повысить свои шанс на успех. Так что полностью хоронить этот вектор атаки пока что рановато.
 
Activity
So far there's no one here
Сверху Снизу