Telegram — мессенджер для смартфонов позиционирующий себя как безопасный, защищающий не только от злоумышленников, но и от гос. структур вроде АНБ. Для достижения этой безопасности Telegram использует собственную разработку — криптографический протокол MTProto, в надежности которого сомневаются многие, сомневаюсь и я.
После объявления награды за дешифрацию сообщений я попытался разобраться в MTProto. То, что дешифровать некий набор байтов невозможно (по крайней мере очень сложно) понятно сразу, но прослушка трафика мессенджера не единственный вид атаки.
Первой мыслью была возможность MITM-атаки (человек посередине) и я пошел читать api протокола. Где выяснилось, что тут защита достаточно надежная: в момент первого запуска клиента создается авторизационный ключ, создается он непосредственно на клиентском устройстве с помощью протокола обмена ключами Диффи-Хелмана, но с небольшим отличием — открытый ключ сервера Telegram уже прошит в коде клиента, что исключает его подмену третьими лицами.
После я установил клиент, ввел номер телефона и больше всего меня удивило то, что мне не нужно вводить паролей, вместо этого на телефон приходит смс с одноразовым пятизначным ключом подтверждения номера. Я взял второй телефон, установил клиент, ввел тот же номер что и в первый раз, так же пришло пятизначное число, которое я ввел на телефоне №2 и успешно авторизовался. Т.е. вот и первая уязвимость. В Telegram накрутили множество алгоритмов, исключили возможность перехвата и подмены трафика, а про банальный пароль забыли. Злоумышленнику не нужно слушать трафик мессенджера, а всего лишь нужно перехватить смс и доступ получен без проблем.
Идем дальше. В Telegram существуют чаты с end-to-end шифрованием, когда ключ известен только собеседникам, на нем и шифруются сообщения. Этот ключ получается все тем же алгоритмом Диффи-Хелмана. Многие пользователи мессенджера требуют дать возможность обмениваться открытыми ключами через NFC и QR-коды, чтобы на 100% исключить возможность MITM-атак, в том числе и со стороны сервера Telegram. Сотрудники Digital Fortress (компания разработавшая мессенджер) утверждают, что такой функционал излишен (что уже подозрительно), а убедиться в том, что никто не подменил публичные ключи сгенерированные собеседником можно сравнив визуализацию ключа (в виде картинки).
И тут есть парочка но:
После логаута одного из собеседников ключ для чата будет перегенерирован, а проверить то, что я имею тот же ключ что и собеседник я могу только посмотрев в его телефон глазами. Зачем мне шифрованный чат если собеседник в метре от меня?
Я заглянул в api защищенных чатов. И мой глаз зацепился вот за этот псевдокод:
Это код получения общего ключа по алгоритму DH, почти. Напомню что оригинальный алгоритм DH имеет вид
Переменные в выражениях:
Вопрос! Зачем такая модификация в алгоритме? Если nonce – одинаковая последовательность для обоих клиентов, то она просто вывернет ключ на изнанку не сделав его безопаснее. А вот если она разная то сервер Telegram может подобрать такую nonce, при которой ключи пользователей совпадут даже при MITM-атаке и никто не будет знать, что его слушают. И даже если nonce совпадает для 2х собеседников сегодня, нет никаких гарантий что nonce будет совпадать завтра, когда в офис Digital Fortress придет АНБ / ФСБ / другая не хорошая организация.
Для разъяснений обратимся к Алисе и Бобу. Атака может проходить так:
Так стоит ли пользоваться? Если Вам нужен простой быстрый чат, Telegram – отличное приложение. Если Вы параноик, то пользоваться не следует однозначно. Потому что даже если я ошибся и написал полную ересь Telegram знает о Вас все: номер телефона, контакты, смс сообщения, местоположение, с кем и когда вы общаетесь. Обратите внимание на список разрешений для приложения. Т.е. мое мнение Telegram – быстрый, удобный, но нисколько не приватный чат.
UPD: История закончилась хорошо. Уязвимость исправлена, документация и приложения обновлены, искателисокровищ багов мотивированы, что уже дало плоды (1, 2). Нужно отдать должное разработчикам Telegram-а, моментально отреагировавшим на статью.
После объявления награды за дешифрацию сообщений я попытался разобраться в 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 копит длинные логи без каких-либо препятствий.
Так стоит ли пользоваться? Если Вам нужен простой быстрый чат, Telegram – отличное приложение. Если Вы параноик, то пользоваться не следует однозначно. Потому что даже если я ошибся и написал полную ересь Telegram знает о Вас все: номер телефона, контакты, смс сообщения, местоположение, с кем и когда вы общаетесь. Обратите внимание на список разрешений для приложения. Т.е. мое мнение Telegram – быстрый, удобный, но нисколько не приватный чат.
UPD: История закончилась хорошо. Уязвимость исправлена, документация и приложения обновлены, искатели