PDA

Просмотр полной версии : Telegram: безопасно или нет?


S3RiouS
11-12-2016, 16:24
Telegram — мессенджер для смартфонов позиционирующий себя как безопасный, защищающий не только от злоумышленников, но и от гос. структур вроде АНБ. Для достижения этой безопасности Telegram использует собственную разработку — криптографический протокол MTProto, в надежности которого сомневаются многие, сомневаюсь и я.

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

Первой мыслью была возможность MITM-атаки (человек посередине) и я пошел читать api протокола. Где выяснилось, что тут защита достаточно надежная: в момент первого запуска клиента создается авторизационный ключ, создается он непосредственно на клиентском устройстве с помощью протокола обмена ключами Диффи-Хелмана, но с небольшим отличием — открытый ключ сервера Telegram уже прошит в коде клиента, что исключает его подмену третьими лицами.

После я установил клиент, ввел номер телефона и больше всего меня удивило то, что мне не нужно вводить паролей, вместо этого на телефон приходит смс с одноразовым пятизначным ключом подтверждения номера. Я взял второй телефон, установил клиент, ввел тот же номер что и в первый раз, так же пришло пятизначное число, которое я ввел на телефоне №2 и успешно авторизовался. Т.е. вот и первая уязвимость. В Telegram накрутили множество алгоритмов, исключили возможность перехвата и подмены трафика, а про банальный пароль забыли. Злоумышленнику не нужно слушать трафик мессенджера, а всего лишь нужно перехватить смс и доступ получен без проблем.

Идем дальше. В Telegram существуют чаты с end-to-end шифрованием, когда ключ известен только собеседникам, на нем и шифруются сообщения. Этот ключ получается все тем же алгоритмом Диффи-Хелмана. Многие пользователи мессенджера требуют дать возможность обмениваться открытыми ключами через NFC и QR-коды, чтобы на 100% исключить возможность MITM-атак, в том числе и со стороны сервера Telegram. Сотрудники Digital Fortress (компания разработавшая мессенджер) утверждают, что такой функционал излишен (что уже подозрительно), а убедиться в том, что никто не подменил публичные ключи сгенерированные собеседником можно сравнив визуализацию ключа (в виде картинки).

И тут есть парочка но:

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

Я заглянул в api защищенных чатов. И мой глаз зацепился вот за этот псевдокод:
key = (pow(g_b, a) mod dh_prime) xor nonce
Это код получения общего ключа по алгоритму DH, почти. Напомню что оригинальный алгоритм DH имеет вид
key = pow(g_b, a) mod dh_prime

Переменные в выражениях:
key – секретный ключ используемый для шифрования трафика,
g_b – открытый ключ собеседника,
a – Ваш закрытый ключ,
dh_prime – открытое простое число,
nonce – “случайная”, полученная от сервера Telegram, последовательность для вычисления ключа.

Вопрос! Зачем такая модификация в алгоритме? Если nonce – одинаковая последовательность для обоих клиентов, то она просто вывернет ключ на изнанку не сделав его безопаснее. А вот если она разная то сервер Telegram может подобрать такую nonce, при которой ключи пользователей совпадут даже при MITM-атаке и никто не будет знать, что его слушают. И даже если nonce совпадает для 2х собеседников сегодня, нет никаких гарантий что nonce будет совпадать завтра, когда в офис Digital Fortress придет АНБ / ФСБ / другая не хорошая организация.

Для разъяснений обратимся к Алисе и Бобу. Атака может проходить так:

Алиса начинает секретный чат с Бобом и об этом сообщает серверу Telegram. Сервер выдает Алисе открытое простое число (p) и первообразный корень по модулю р (g). Алиса генерирует свой закрытый ключ (a) и на его основе открытый ключ (A) который передает серверу.
Сервер генерирует собственные ключи (t и T) и передает T Бобу под видом открытого ключа Алисы. Вместе с T он передает g, p и случайную последовательность (b_nonce).
Боб аналогично генерирует ключи (b, B) и вычисляет секретный ключ (s). Серверу он возвращает свой открытый ключ (B).
Сервер вычисляет s и на его основе совсем не случайную последовательность (a_nonce), передает T под видом открытого ключа Боба и a_nonce под видом случайной последовательности.
Алиса вычисляет секретный ключ который равен и ключу у Боба и ключу у сервера
Боб смотрит на визуализацию ключа в телефоне Алисы и увидев тот же ключ что и у себя без подозрений пользуется сервисом. А Telegram копит длинные логи без каких-либо препятствий.

image

Так стоит ли пользоваться? Если Вам нужен простой быстрый чат, Telegram – отличное приложение. Если Вы параноик, то пользоваться не следует однозначно. Потому что даже если я ошибся и написал полную ересь Telegram знает о Вас все: номер телефона, контакты, смс сообщения, местоположение, с кем и когда вы общаетесь. Обратите внимание на список разрешений для приложения. Т.е. мое мнение Telegram – быстрый, удобный, но нисколько не приватный чат.

UPD: История закончилась хорошо. Уязвимость исправлена, документация и приложения обновлены, искатели сокровищ багов мотивированы, что уже дало плоды (1, 2). Нужно отдать должное разработчикам Telegram-а, моментально отреагировавшим на статью.

S3RiouS
11-12-2016, 16:25
*image

http://s020.radikal.ru/i716/1612/f9/49e1454ba586.png

S3RiouS
11-12-2016, 16:27
@funnyim - юмор

Махровый мир
11-12-2016, 20:18
Сигнал и флекс нынче в тренде

Амалька
11-12-2016, 20:48
че??
а первый телефон послал клиент на*** и выслал другой ключ:D
****ец уязвимаяуязвимость

Кот
11-12-2016, 21:16
Копипаста трехлетней давности.