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

Введение

Здравствуйте, уважаемые читатели Хабра! Сегодня я хочу поделиться с вами информацией о XSS-уязвимости, которую я обнаружил в Telegram около двух недель назад. Также статья коснется некоторых особенностей работы программы поиска уязвимостей от Telegram. Моя цель — не только продемонстрировать вам интересный и относительно простой пример XSS, но и обозначить причины, по которым, возможно, не стоит тратить свои усилия на участие в багбаунти программе Telegram.

Часть 1. XSS

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

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

<a href="javascript:alert()">Click Me!</a>

Разумеется, если мы отправим такую ссылку через Telegram, то не увидим ожидаемый результат:

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

export function ensureProtocol(url?: string) {
  if (!url) {
    return undefined;
  }
  return url.includes('://') ? url : `http://${url}`;
}

Этот код проверяет наличие протокола в ссылках, приходящих в сообщениях, и если протокол отсутствует, автоматически добавляет 'http' в начало ссылки.

Такой подход к проверке является некорректным и определенно не соответствует RFC стандарту. Пример обхода данной проверки тривиален:

slonser.ru/#://

При отправке сообщения с такой ссылкой можно заметить, что веб-клиент не добавил http:// в начало ссылки. Следовательно, при нажатии на неё, пользователь будет перенаправлен на http://web.telegram.org/slonser.ru/#://.

Однако, если бы мы попытались вставить ссылку в следующем формате:

javascript:alert()/#://

Мы бы обнаружили, что наша ссылка не была корректно обработана. В чем же причина? Возможно, у Telegram есть черный список для некоторых ссылок? Или, возможно, они все-таки проверяют протокол javascript отдельно на серверной стороне? Ответ, разумеется, отрицательный! Дело в том, что символы ":" и "()" не являются допустимыми для доменных имен, и поэтому регулярное выражение на сервере не распознает это как ссылку.

На момент я задумался, решив, что попытка не удалась, и, возможно, Stored XSS в Telegram так и останется недостижимой мечтой. Однако, мне удалось довольно быстро придумать изящное решение:

javascript:alert@github.com/#://

Что же происходит в этом примере? Данная ссылка использует HTTP Basic Authentication, и серверная часть Telegram интерпретирует это как ссылку на github.com с данными аутентификации: username равным "javascript" и password равным "alert" (и в некотором смысле это верно). Как приятный дополнительный эффект, мы получаем превью нашей ссылки, которое выглядит как валидная ссылка на GitHub:

Это существенно усиливает потенциальную угрозу от XSS-атаки, поскольку пользователи могут быть убеждены, что перед ними обычная ссылка на GitHub. Теперь осталось решить вопрос с символами, которые не допустимы в разделе username:password при парсинге. Решение заключается в использовании кодирования символов с помощью функции urlencode. Вот и финальный вариант :

javascript:alert%28%27Slonser%20was%20here%21%27%29%3B%2F%2F@github.com#;alert(10);://eow5kas78d0wlv0.m.pipedream.net%27

После нажатия на эту ссылку, мы увидим ожидаемый результат:

Часть 2. Impact

Рассмотрим, что же позволяет сделать данная уязвимость, например если отправить ссылку в крупный чат, то мы сможем от имени пострадавшего:

  1. Читать все сообщения пользователя, а также отправлять сообщения от его имени.

  2. Полностью захватить учетную запись пользователя, например, отправив запрос на установку нового пароля.

  3. Прочитать сообщения с кодами для входа в Telegram, которые приходят в приложение.

  4. Получить удаленное выполнение кода (RCE) в версии Telegram на платформе Electron! Да, вы не ослышались, посредством нажатия на специально сформированную ссылку, жертва может невольно предоставить злоумышленнику доступ к своему компьютеру.

Часть 3. Общение с Telegram Security

Хронология событий развивалась следующим образом:

  • 17 июня - отправил отчет о найденной уязвимости в Telegram, но не получил ответа.

  • 21 июня - обнаружил, что уязвимость была устранена, однако ответа от команды Telegram так и не последовало.

  • 24 июня - отправил запрос относительно статуса моего отчета о уязвимости. Ответа снова не последовало.

  • 26 июня - благодаря связям через знакомых, смог напрямую связаться с командой безопасности Telegram. Получил ответ:

    Hello,

    Thank you for your email. We will send you an update soon.

    All the best,Telegram Support

  • 27 июня - получил сообщение: Thank you for your report. We would like to award you a bounty of XXXX euro for your findings.

Я специально скрыл сумму вознаграждения, чтобы проверить детективные навыки читателей этой статьи. В качестве подсказки: программа багбаунти Reddit, которая имеет схожие условия (с максимальной выплатой в приложении 10 тыс. долларов, как и у Telegram), предоставила 5 тыс. долларов за аналогичную проблему.

Итак, сколько же мне выплатили?

Ответ

500 евро.

Считаю ли я эту сумму справедливой? – Нет.

Вправе ли Telegram так поступать? – Да, безусловно. У них нет четкой градации уязвимостей и соответствующих выплат на их платформе багбаунти.

Каковы мои впечатления? – Негативные. Создается впечатление, что Telegram не особо заинтересован в обеспечении своей безопасности. Я не уверен, что стоит заниматься поиском уязвимостей ради такого опыта.

Part Final. Выводы

Мои выводы следующие:

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

  2. К сожалению, программа багбаунти от Telegram оставляет желать лучшего. Отсутствует четкая градация уязвимостей, поддержка не всегда отвечает на обращения, а справедливость выплат вызывает сомнения.

Надеюсь, эта статья была полезной для вас. Жду ваших комментариев!

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


  1. anonymous
    27.06.2023 17:30

    НЛО прилетело и опубликовало эту надпись здесь


  1. v1000
    27.06.2023 17:30
    +7

    Получить удаленное выполнение кода (RCE) в версии Telegram на платформе Electron!

    то есть самый безопасный мессенджер лучше запускать в виртуальной машине?


    1. dartraiden
      27.06.2023 17:30
      +13

      Electron-клиенты лучше вообще не запускать при наличии альтернативы. В случае с Telegram нативных клиентов полно.


      1. Slonser Автор
        27.06.2023 17:30
        +2

        Полностью с вами согласен, к сожалению достаточное количество людей его использует. Так как он от официальной команды Telegram A.


        1. sumbooody
          27.06.2023 17:30

          Вроде Telegram Desktop не на electron сделан, не?


          1. Slonser Автор
            27.06.2023 17:30
            +2

            Telegram Desktop написан на C++, вы правы. Но Telegram имеет несколько официальных клиентов. Один из них используют как раз Electron


  1. olegtsss
    27.06.2023 17:30

    Можно пожалуйста пояснить, что здесь:

    javascript:alert%28%27Slonser%20was%20here%21%27%29%3B%2F%2F@github.com#;alert(10);://eow5kas78d0wlv0.m.pipedream.net%27 


    1. Zzzz9
      27.06.2023 17:30
      +2

      Предположительно "('Slonser was here!');// "


  1. tania_012
    27.06.2023 17:30
    +6

    Спасибо за статью! От себя хочу добавить, подтвердить слова автора: по какой-то причине даже самые крутые конторы допускают простейшие ляпы. Я вот ни разу не хакерка, но не раз натыкалась на такое. К примеру, не так давно крутейшая международная букмекерская контора ввела длинный такой токен (от ботов), я случайно обнаружила, что если вставить пробел, то система пропускает любой набор символов! А сколько раз натыкалась, что начальные, концевые пробелы при вводе (почты) не обрезаются — тоже ведь ляп. Для меня такое (простейшие ляпы в крутейших конторах) всегда было загадкой (и остается).


    1. Boilerplate
      27.06.2023 17:30
      +16

      Причина очень простая - в сложных системах есть куча мест, где такие ляпы можно совершить. И чем сложнее система, тем больше в ней потенциальных дыр и багов. И даже закрыв 95% таких ляпов, пытливые умы найдут оставшиеся 3% и будут их использовать / продавать / сообщать о них. Причем, если человек занимается таким поиском хотя бы в виде хобби, со временем такие места начинаешь замечать значительно быстрее.


      1. Harwest
        27.06.2023 17:30
        +5

        закрыв 95% таких ляпов, пытливые умы найдут оставшиеся 3%

        Наверное оставшиеся 15%


        1. dopusteam
          27.06.2023 17:30

          Наверное, оставшиеся 5%?


          1. tania_012
            27.06.2023 17:30
            +1

            универсальное правило 80 на 20 — так что я ставлю на 20%


        1. IDDQDesnik
          27.06.2023 17:30
          +5

          3%. А 2% вообще никто не найдет за время жизни системы.


          1. Boilerplate
            27.06.2023 17:30

            Вот, все именно так, 2% специально оставил на то, что не найдут)


    1. IPopovkin
      27.06.2023 17:30
      +1

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


    1. karabas_b
      27.06.2023 17:30
      +14

      Это частный случай survivorship bias. Крутейшие конторы обычно делают очень известные продукты, в которых интересно, а часто и прибыльно искать уязвимости. В малоизвестном софте от малоизвестных контор может быть дичайшее количество дыр, но их никому не интересно искать, а если кто-то и нашел, то никому не интересно об этом читать. Если человек столкнулся с дырой в каком-нибудь "счетчике коров" фирмы "рога-и-копыта-софт", ему просто в голову не придет писать статью на хабр.


    1. event1
      27.06.2023 17:30
      +1

      Для меня такое (простейшие ляпы в крутейших конторах) всегда было загадкой (и остается).

      Задача разработчика — реализовывать возможности и чинить ошибки. Продумывать возможные сценарии взлома вне задач и (очень часто) умений большинства разработчиков. Именно по-этому создаются специальные отделы безопасности и программы поощрения пользователей. Но все эти практики довольно новые (10-15 лет), по-этому многие конторы ещё не разобрались как организовать такую штуку и сколько надо закладывать в бюджет на это дело.


  1. karavan_750
    27.06.2023 17:30
    +2

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

    А можете оказать содействие в такой связи? Обнаружил багу связанную с платными подписками на частные каналы.
    22-го апреля 2023 г. мной был отправлен Bug Report на адрес security[at]telegram.org. В ответ тишина.


    1. lovermann
      27.06.2023 17:30
      +13

      Судя по статье, вы потратите очень много часов на переписки, чтобы получить свои 300-500 долларов...


    1. iroln
      27.06.2023 17:30
      +2

      Им некогда, они сторисы делают.


      мной был отправлен Bug Report

      "Я отправил Bug Report" — так лучше. :)


      1. karavan_750
        27.06.2023 17:30
        +5

        "Я отправил Bug Report" — так лучше.

        Не спора ради, а красивого изложения мыслей для. Почему? :)


        1. iroln
          27.06.2023 17:30
          +3

          Страдательный залог в русском языке - это канцелярит. Лучше избавить свою речь и письмо от канцелярского стиля.

          https://shkolakontenta.ru/chto-takoe-kanczelyarit-v-russkom-yazyke


          1. tommyangelo27
            27.06.2023 17:30
            +7

            Он и в других языках так звучит, но зачастую, именно так проще описывать свою работу — задачи решаются, отчёты генерируются, баги закрываются, спринты деплоятся.
            Вроде и рассказал, но без имён/паролей/явок ????


  1. BugM
    27.06.2023 17:30
    +2

    Печально. И то что мало дали печально. И то что нет на официальном сайте фразы "Если дорожите своими переписками не используйте веб клиент" печально.

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


  1. chervital
    27.06.2023 17:30

    Я правильно понимаю, что если не жать бездумно на любую ссылку, коротко мне присылают, то уязвимость становится не такой уж критичной?


    1. Format-X22
      27.06.2023 17:30

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


    1. karabas_b
      27.06.2023 17:30

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


  1. kubk
    27.06.2023 17:30
    +1

    Вы нашли серьёзную уязвимость. Однако эта уязвимость в веб-клиенте, который разрабатывает 1 человек: https://github.com/Ajaxy/telegram-tt/commit/a8d025395bc0032d964c2afc8c4fb5d2fa631a44

    Думаю поэтому вознаграждение оказалось ниже ожидаемого. Надеюсь эта ситуация подтолкнёт команду Телеграм тщательнее проверять их код на уязвимости.


    1. Slonser Автор
      27.06.2023 17:30
      +1

      Уязвимость работала и в версии Telegram A и в версии Telegram K. Для версии K, её сразу же пофиксили на стороне бекенда


    1. DerRotBaron
      27.06.2023 17:30
      +4

      У телеги это обычная история, в tdesktop коммиты публикуются от 2 человек, в Android-клиент вообще от одного, но там один коммит соответствует одному релизу, так что открытость процесса разработки околонулевая


  1. cathome_official
    27.06.2023 17:30
    +7

    Помню у vk был XSS, за который они решили не платить т.к. "пользователь сам активирует уязвимость нажимая на ссылку"
    потом этой XSS была заполнена половина VK


  1. Houl
    27.06.2023 17:30
    +8

    500 Евро... Пфф... Мне после нахождения уязвимости в ViPNet вообще звонили и говорили, что "ай яй яй так больше не делай!" :)


  1. neowisard
    27.06.2023 17:30

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

    Вы бы поняли почем печенька с тёмной стороны, ))

    p.s. скорее всего выставив простой багаж типа xss в телеге его найдут за пару дней и опубликуют весь POC.


    1. Slonser Автор
      27.06.2023 17:30
      +7

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


  1. tania_012
    27.06.2023 17:30

    С одной стороны, поиск ляпов приносит удовольствия и деньги) С другой — весьма неприятно осознавать, что возможно ты уже под колпаком. Почему бы тогда мировому сообществу не написать и не использовать 100% надежные блоки кода, для начала блоки ввода? Чтобы адрес был адрес, почта была почта, число было число… Или это в принципе невозможно, так как неоднозначность сидит в языках программирования, типа 0='' в php?


    1. greenTransistor
      27.06.2023 17:30
      +2

      Наверное, потому, что "мировое сообщество" - не монолит, а много конкурирующих субъектов, и пока одни будут тратить дополнительные усилия и время на то, чтобы использовать только на 100% надежные блоки кода (и то при условии доверия к надежности CPU, OS, libc и кучи зависимостей), другие в пару кликов состяпают поделие на Wordpress не самой свежей версии, и даже если 95% таковых загнутся от атак, оставшихся 5% хватит, чтобы занять рынок и выиграть конкуренцию благодаря меньшим издержкам и большей скорости внедрения изменений.


      1. tania_012
        27.06.2023 17:30

        Да, точно))


        Но тогда мы приходим к интересным размышлениям о нашем будущем — если "тяп-ляп лишь бы быстро" будет нарастать, то не завалится ли в конце концов наша Башня Прогресса?


        А может так и должно быть, типа такой цикл любой разумной цивилизации — вон сколько видов обезьян, сколько разумов было перед нами?


    1. iBljad
      27.06.2023 17:30

      Потому что всё обычно заканчивается этим


  1. fearzzzz
    27.06.2023 17:30

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

    А чем была вызвана такая спешка? С момента отправки отчёта прошло 9 дней, а временные рамки для ответа со стороны Телеграма вообще не указаны. В любом случае, для компании, которая пяткой в грудь себя бьёт и заявляет, что почти 10 лет уже держит багбаунти-программу, такой уровень - это прямо очень плохо.

    Находка клёвая, ты молодец, и спасибо что поделился информацией.


    1. Slonser Автор
      27.06.2023 17:30

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


      1. fearzzzz
        27.06.2023 17:30

        Понимаю, всегда неприятно с таким сталкиваться.


  1. greabock
    27.06.2023 17:30

    XXXX - 500. Чотанисходица --_--


    1. Slonser Автор
      27.06.2023 17:30

      Вы попались на уловку :)


      1. kachora
        27.06.2023 17:30

        Т.е. даже двухфакторная аути-ция не поможет если пользоваться веб-клиентом? Как вообще можно себя обезопасить в таких случаях помимо открытия ссылок?


        1. Cherezzabo
          27.06.2023 17:30

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


  1. Cherezzabo
    27.06.2023 17:30

    Статья интересная, спасибо за подробное описание "раскопок" )


  1. 13werwolf13
    27.06.2023 17:30
    -3

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


  1. Phvntxm
    27.06.2023 17:30
    +1

    Зарегал акк чтоб поделиться опытом. Мне такую же сумму заплатили, но баг был с приватным чатом и доступом к его контенту. Сейчас сравниваю уязвимость, действительно, как-то маловато заплатили. А отвечали они всегда по истечению трёх дней. Странно что кому-то вообще не отвечают.


    1. Slonser Автор
      27.06.2023 17:30

      Спасибо за информацию! Мне написало несколько человек уже, опыт у всех прям разный. Один человек ждал 2 месяца)