Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор не несет ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону
Введение
Здравствуйте, уважаемые читатели Хабра! Сегодня я хочу поделиться с вами информацией о 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
Рассмотрим, что же позволяет сделать данная уязвимость, например если отправить ссылку в крупный чат, то мы сможем от имени пострадавшего:
Читать все сообщения пользователя, а также отправлять сообщения от его имени.
Полностью захватить учетную запись пользователя, например, отправив запрос на установку нового пароля.
Прочитать сообщения с кодами для входа в Telegram, которые приходят в приложение.
Получить удаленное выполнение кода (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. Выводы
Мои выводы следующие:
Даже в таком продвинутом приложении как Telegram можно обнаружить базовые и, казалось бы, начального уровня ошибки. Поэтому всегда решайтесь на анализ даже самых сложных приложений, так как вероятно вы сможете обнаружить что-то интересное.
К сожалению, программа багбаунти от Telegram оставляет желать лучшего. Отсутствует четкая градация уязвимостей, поддержка не всегда отвечает на обращения, а справедливость выплат вызывает сомнения.
Надеюсь, эта статья была полезной для вас. Жду ваших комментариев!
Комментарии (50)
v1000
27.06.2023 17:30+7Получить удаленное выполнение кода (RCE) в версии Telegram на платформе Electron!
то есть самый безопасный мессенджер лучше запускать в виртуальной машине?
dartraiden
27.06.2023 17:30+13Electron-клиенты лучше вообще не запускать при наличии альтернативы. В случае с Telegram нативных клиентов полно.
Slonser Автор
27.06.2023 17:30+2Полностью с вами согласен, к сожалению достаточное количество людей его использует. Так как он от официальной команды Telegram A.
tania_012
27.06.2023 17:30+6Спасибо за статью! От себя хочу добавить, подтвердить слова автора: по какой-то причине даже самые крутые конторы допускают простейшие ляпы. Я вот ни разу не хакерка, но не раз натыкалась на такое. К примеру, не так давно крутейшая международная букмекерская контора ввела длинный такой токен (от ботов), я случайно обнаружила, что если вставить пробел, то система пропускает любой набор символов! А сколько раз натыкалась, что начальные, концевые пробелы при вводе (почты) не обрезаются — тоже ведь ляп. Для меня такое (простейшие ляпы в крутейших конторах) всегда было загадкой (и остается).
Boilerplate
27.06.2023 17:30+16Причина очень простая - в сложных системах есть куча мест, где такие ляпы можно совершить. И чем сложнее система, тем больше в ней потенциальных дыр и багов. И даже закрыв 95% таких ляпов, пытливые умы найдут оставшиеся 3% и будут их использовать / продавать / сообщать о них. Причем, если человек занимается таким поиском хотя бы в виде хобби, со временем такие места начинаешь замечать значительно быстрее.
Harwest
27.06.2023 17:30+5закрыв 95% таких ляпов, пытливые умы найдут оставшиеся 3%
Наверное оставшиеся 15%
IPopovkin
27.06.2023 17:30+1«Причина очень простая» - крупные компании сильно режут косты на тестировании и проверках на безопасность плюс проджектам срочна нужна эта фича на проде, что приводит к плохо проверенному коду в проде.
karabas_b
27.06.2023 17:30+14Это частный случай survivorship bias. Крутейшие конторы обычно делают очень известные продукты, в которых интересно, а часто и прибыльно искать уязвимости. В малоизвестном софте от малоизвестных контор может быть дичайшее количество дыр, но их никому не интересно искать, а если кто-то и нашел, то никому не интересно об этом читать. Если человек столкнулся с дырой в каком-нибудь "счетчике коров" фирмы "рога-и-копыта-софт", ему просто в голову не придет писать статью на хабр.
event1
27.06.2023 17:30+1Для меня такое (простейшие ляпы в крутейших конторах) всегда было загадкой (и остается).
Задача разработчика — реализовывать возможности и чинить ошибки. Продумывать возможные сценарии взлома вне задач и (очень часто) умений большинства разработчиков. Именно по-этому создаются специальные отделы безопасности и программы поощрения пользователей. Но все эти практики довольно новые (10-15 лет), по-этому многие конторы ещё не разобрались как организовать такую штуку и сколько надо закладывать в бюджет на это дело.
karavan_750
27.06.2023 17:30+2благодаря связям через знакомых, смог напрямую связаться с командой безопасности Telegram
А можете оказать содействие в такой связи? Обнаружил багу связанную с платными подписками на частные каналы.
22-го апреля 2023 г. мной был отправлен Bug Report на адрес security[at]telegram.org. В ответ тишина.lovermann
27.06.2023 17:30+13Судя по статье, вы потратите очень много часов на переписки, чтобы получить свои 300-500 долларов...
iroln
27.06.2023 17:30+2Им некогда, они сторисы делают.
мной был отправлен Bug Report
"Я отправил Bug Report" — так лучше. :)
karavan_750
27.06.2023 17:30+5"Я отправил Bug Report" — так лучше.
Не спора ради, а красивого изложения мыслей для. Почему? :)
iroln
27.06.2023 17:30+3Страдательный залог в русском языке - это канцелярит. Лучше избавить свою речь и письмо от канцелярского стиля.
https://shkolakontenta.ru/chto-takoe-kanczelyarit-v-russkom-yazyke
tommyangelo27
27.06.2023 17:30+7Он и в других языках так звучит, но зачастую, именно так проще описывать свою работу — задачи решаются, отчёты генерируются, баги закрываются, спринты деплоятся.
Вроде и рассказал, но без имён/паролей/явок ????
BugM
27.06.2023 17:30+2Печально. И то что мало дали печально. И то что нет на официальном сайте фразы "Если дорожите своими переписками не используйте веб клиент" печально.
Вроде небольшая уязвимость, но для веб клиента мессенджера является критической на самом деле. Чет с ним с угоном клиента, там другие методы защиты есть. Но вот полный доступ к переписке это ужас.
chervital
27.06.2023 17:30Я правильно понимаю, что если не жать бездумно на любую ссылку, коротко мне присылают, то уязвимость становится не такой уж критичной?
Format-X22
27.06.2023 17:30В данном случае да, если, конечно, кто-нибудь не найдёт хранимую дырку, которая вызывает код при просмотре.
karabas_b
27.06.2023 17:30Проблема еще и в том, что в веб-клиенте очень неудачно реализован просмотр ссылок - нужно наехать стрелочкой на ссылку и подождать несколько секунд, тогда возле стрелочки всплывает форма с адресом ссылки. Большинство людей просто не знает о такой фиче, никто ниче не ждет, просто кликают и все. Почему нельзя сделать, чтобы адрес ссылки при hover всплывал моментально? Если кажется, что оно будет мешать и отвлекать, можно же эту форму лепить не возле стрелочки мышки, а в левом нижнем углу, например, как это делают почти все браузеры.
kubk
27.06.2023 17:30+1Вы нашли серьёзную уязвимость. Однако эта уязвимость в веб-клиенте, который разрабатывает 1 человек: https://github.com/Ajaxy/telegram-tt/commit/a8d025395bc0032d964c2afc8c4fb5d2fa631a44
Думаю поэтому вознаграждение оказалось ниже ожидаемого. Надеюсь эта ситуация подтолкнёт команду Телеграм тщательнее проверять их код на уязвимости.Slonser Автор
27.06.2023 17:30+1Уязвимость работала и в версии Telegram A и в версии Telegram K. Для версии K, её сразу же пофиксили на стороне бекенда
DerRotBaron
27.06.2023 17:30+4У телеги это обычная история, в tdesktop коммиты публикуются от 2 человек, в Android-клиент вообще от одного, но там один коммит соответствует одному релизу, так что открытость процесса разработки околонулевая
cathome_official
27.06.2023 17:30+7Помню у vk был XSS, за который они решили не платить т.к. "пользователь сам активирует уязвимость нажимая на ссылку"
потом этой XSS была заполнена половина VK
Houl
27.06.2023 17:30+8500 Евро... Пфф... Мне после нахождения уязвимости в ViPNet вообще звонили и говорили, что "ай яй яй так больше не делай!" :)
neowisard
27.06.2023 17:30Я понимаю что whitehat более , мм, идеологичны что ли, но почему бы хотя бы для интереса не выставлять баг на других форумах что бы узнать сколько стоит такой бак в dark zone. да и вообще ценный ли это баг.
Вы бы поняли почем печенька с тёмной стороны, ))
p.s. скорее всего выставив простой багаж типа xss в телеге его найдут за пару дней и опубликуют весь POC.
Slonser Автор
27.06.2023 17:30+7Даже простое выставление бага на такие платформы может нести риск для пользователей. (Так как заставить активно ресерчить на этот тип уязвимости приложение). Лично мои морально-этические устои такого делать не позволяют.
tania_012
27.06.2023 17:30С одной стороны, поиск ляпов приносит удовольствия и деньги) С другой — весьма неприятно осознавать, что возможно ты уже под колпаком. Почему бы тогда мировому сообществу не написать и не использовать 100% надежные блоки кода, для начала блоки ввода? Чтобы адрес был адрес, почта была почта, число было число… Или это в принципе невозможно, так как неоднозначность сидит в языках программирования, типа 0='' в php?
greenTransistor
27.06.2023 17:30+2Наверное, потому, что "мировое сообщество" - не монолит, а много конкурирующих субъектов, и пока одни будут тратить дополнительные усилия и время на то, чтобы использовать только на 100% надежные блоки кода (и то при условии доверия к надежности CPU, OS, libc и кучи зависимостей), другие в пару кликов состяпают поделие на Wordpress не самой свежей версии, и даже если 95% таковых загнутся от атак, оставшихся 5% хватит, чтобы занять рынок и выиграть конкуренцию благодаря меньшим издержкам и большей скорости внедрения изменений.
tania_012
27.06.2023 17:30Да, точно))
Но тогда мы приходим к интересным размышлениям о нашем будущем — если "тяп-ляп лишь бы быстро" будет нарастать, то не завалится ли в конце концов наша Башня Прогресса?
А может так и должно быть, типа такой цикл любой разумной цивилизации — вон сколько видов обезьян, сколько разумов было перед нами?
fearzzzz
27.06.2023 17:3026 июня - благодаря связям через знакомых, смог напрямую связаться с командой безопасности Telegram.
А чем была вызвана такая спешка? С момента отправки отчёта прошло 9 дней, а временные рамки для ответа со стороны Телеграма вообще не указаны. В любом случае, для компании, которая пяткой в грудь себя бьёт и заявляет, что почти 10 лет уже держит багбаунти-программу, такой уровень - это прямо очень плохо.
Находка клёвая, ты молодец, и спасибо что поделился информацией.
greabock
27.06.2023 17:30XXXX - 500. Чотанисходица --_--
Slonser Автор
27.06.2023 17:30Вы попались на уловку :)
kachora
27.06.2023 17:30Т.е. даже двухфакторная аути-ция не поможет если пользоваться веб-клиентом? Как вообще можно себя обезопасить в таких случаях помимо открытия ссылок?
Cherezzabo
27.06.2023 17:30По-умолчанию не доверять никакой ссылке, копировать ее сначала в буфер обмена, вставлять в текстовый редактор, изучать ее на предмет подозрительных элементов и, только убедившись, что в ней нет ничего подозрительного, открывать ссылку вручную в браузере.
13werwolf13
27.06.2023 17:30-3мб я не прав.. но
возможно маленькая сумма означает что проблема уже была известна и исправление уже было на подходе, а это просто подачка из разряда "ну он старался, давайте ему хоть сколько нибудь заплатим"
Phvntxm
27.06.2023 17:30+1Зарегал акк чтоб поделиться опытом. Мне такую же сумму заплатили, но баг был с приватным чатом и доступом к его контенту. Сейчас сравниваю уязвимость, действительно, как-то маловато заплатили. А отвечали они всегда по истечению трёх дней. Странно что кому-то вообще не отвечают.
Slonser Автор
27.06.2023 17:30Спасибо за информацию! Мне написало несколько человек уже, опыт у всех прям разный. Один человек ждал 2 месяца)
anonymous
НЛО прилетело и опубликовало эту надпись здесь