Анализ безопасности Telegram. Ч.2.

by @redterror
Анализ безопасности Telegram. Ч.2.

Шалом, бегущие в тенях. Хай, случайные подписчики. Как и обещал, препарируем немного родную Телегу. Продолжение. Первую часть смотрите ранее. Гоу, гоу:

3.2 Проблемы, связанные с технической безопасностью

  • Группа исследователей в 2015 году анонсировала схему атаки на Telegram типа «челове-посередине», которая может быть осуществлена властями конкретного государства. Атака связана с генерированием общих секретов по методу Диффи-Хеллмана для двух жертв, имеющих одинаковый 128-битный визуальный отпечаток, и пользователи, которые сравнивают отпечатки, не смогут обнаружить атаку. При реализации атаки «дней рождения» потребуется всего лишь 264 операции. С того момента количество битов, используемых в отпечатках, значительно увеличилось, однако в целом проблема остается актуальной. Чтобы проверить ключи и предотвратить MITM-атаки, пользователи должны визуально сравнить сетку квадратов с четырьмя оттенками синего. Здесь сразу же всплывает человеческий фактор. Во-первых, пользователь может не заметить едва различимых отличий между сетками. Во-вторых, у пользователя вообще может не быть желания возиться со сравнением сеток.
  • До 2014 года протокол MTProto использовал модифицированную версию схему обмена ключами по методу Диффи-Хеллмана [9]. Вместо генерации ключей при помощи стандартного протокола на базе алгоритма Диффи-Хеллмана, сервер отсылал пользователю ключ, обработанный операцией XOR вместе с произвольным числом (nonce). Сей факт позволяет фальшивому серверу использовать различные nonce-переменные для двух пользователей, в результате чего будет один и тот же ключ, но который будет известен серверу. Повторимся еще раз: пользователи должны доверять серверу Telegram. Несмотря на то, что этот вопрос был решен, одно только присутствие этой проблемы вызывает массу вопросов относительно компетенций разработчиков Telegram в области безопасности, поскольку проблема чрезвычайно проста.
  • В некоторых частях протокола при хешировании вместо SHA-256 используется алгоритм SHA-1, который, как известно, неустойчив к коллизиям [10]. Создатели Telegram утверждают, что SHA-1 используется в тех частях протокола, где устойчивость к коллизиям не принципиальна, однако все же более сильная хеш-функция была бы уместнее. История не раз доказывала, что бреши и неучтенные моменты – довольно распространенное явление.
  • Даже при использовании секретного чата, мобильная версия Telegram позволяет третьей стороне просматривать информацию о метаданных. Например, злоумышленник может узнать, когда пользователи выходят в онлайн и уходят в оффлайн вплоть до секунд. Telegram не требует соглашения от обоих сторон для установления коммуникации, и злоумышленник может подключиться и получить информацию о метаданных без ведома пользователя. Кроме того, у злоумышленника есть хороший шанс обнаружить, общаются ли два пользователя между собой посредством подключения и анализа метаданных на обоих концах провода. Мы назвали эту проблему «утечка доступности». Более подробно этот вопрос будет рассмотрен в разделах 4 и 5.

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

4. Эксплоит для обнаружения доступности пользователей

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


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

Проблема, связанная с утечкой, легко обнаруживается в командной строке Telegram, как показано на Рисунке 2.

Более того, на Рисунке 3 показано, что Ева может видеть, что Акакий и Хайк выходят в онлайн и уходят в оффлайн. Затем Ева может сопоставить временные интервалы и сделать вывод, что Акакий и Хайк общаются между собой. В следующих разделах будет рассказано, как можно использовать эксплоит для обнаружения того, что два пользователя разговаривают друг с другом.

4.1 Постановка эксперимента

Для отслеживания использования Telegram и коммуникаций мы выбрали 15 активных пользователей среди международных студентов Массачусетского технологического института. Таким образом, мы знали, что студенты общались между собой на ежедневной/еженедельной основе.

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

4.2 Алгоритм корреляции

Мы создали алгоритм корреляции, которые анализирует информацию об использовании Telegram двумя пользователя и выводит последовательность совпадений, где каждое совпадение представляет собой временной интервал с вероятностью того, что пользователи общаются между собой (вероятность всегда не менее 0.5).


Рисунок 3: Ева отслеживает активность Хайк и Акакия и может сказать, когда каждая персона появлялась в онлайне. Обратите внимание на проблему: разница между появлением в онлайне и уходом в оффлайн составляет примерно 5 минут

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


Рисунок 4: Диаграмма, иллюстрирующая основные концепции алгоритма корреляции

Утверждается, что два активных временных интервала Алисы и Боба соединены (см. фиолетовые стрелки на рисунке выше), если эти промежутки пересекаются в течение времени gap_time. То есть, два временных интервала пересекаются, если две точки пересечения находятся на расстоянии больше, чем gap_time. Этот допущение введено потому, что требуется время для открытия приложения после получения сообщения.

Теперь, рассматривая каждый активный временной интервал в качестве вершины и каждое соединение как ребро, мы получаем двухсторонний граф. В этом двухстороннем графе мы ищем связанные компоненты, которые имеют как минимум одно ребро. Если мы отсортируем активные временные интервалы в связанном компоненте, то увидим цепочку пересекающихся интервалов, в течение которых Алиса и Боб использовали Telegram. Каждая соединенная пара временных интервалов указывает на определенную вероятность того, что два пользователя общаются друг с другом. Цепочка соединенных интервалов значительно повышает шанс того, что Алиса и Боб общаются с друг с другом. 

Каждый связанный компонент представляет возможную коммуникацию (во время которой происходит обмен сообщениями за относительно короткое время) между пользователями. Поскольку пользователь может оставить Telegram открытым (когда метаданные передаваться не будут), мы не принимаем во внимание размер активного временного интервала. Мы полагаем, что количество активных временных интервалов – наиболее важный показатель, поскольку пользователь, часто выходящий в онлайн и уходящий в оффлайн, скорее всего, активно использует Telegram.

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

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


Рисунок 5: Формула расчета вероятности общения двух пользователей

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

5. Результаты использования эксплоита

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

Наиболее приемлемые значения: gap_time = 30 секунд, альфа-множитель = 1. При таких значения нам удалось отследить все коммуникации и не обрезать лишнего. Результаты показали, что количество ошибочных совпадений колеблется в районе 15%. Другими словами, иногда, когда два пользователя одновременно используют приложение, алгоритм работает некорректно.


Рисунок 6: Совпадения, найденные алгоритмом корреляции


Рисунок 7: Сообщения, соответствующие найденным совпадениям. Предпоследнее совпадение соответствует сообщениям, написанным в интервале от 23:31 до 23:35

6. Заключение

В этом проекте мы провели исследование мессенджера Telegram. Когда Telegram оформился как самостоятельная компания, то приобрел популярность, благодаря заявлениям создателей, доверием и удачным временем выхода (в то же время произошли утечки с подачи Сноудена). Если верить заявлениям создателей Telegram, можно подумать, что этот мессенджер обладает высоким уровнем безопасности. Однако наше исследование показывает, что у Telegram были серьезные и в тоже время простые проблемы в протоколе (например, модифицированный и уязвимый алгоритм обмена ключами по методу Диффи-Хеллмана), которые может обнаружить любой знающий эксперт по безопасности.

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

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

July 20, 2018
by @redterror