Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
После я установил клиент, ввел номер телефона и больше всего меня удивило то, что мне не нужно вводить паролей, вместо этого на телефон приходит смс с одноразовым пятизначным ключом подтверждения номера. Я взял второй телефон, установил клиент, ввел тот же номер что и в первый раз, так же пришло пятизначное число, которое я ввел на телефоне №2 и успешно авторизовался. Т.е. вот и первая уязвимость. В Telegram накрутили множество алгоритмов, исключили возможность перехвата и подмены трафика, а про банальный пароль забыли. Злоумышленнику не нужно слушать трафик мессенджера, а всего лишь нужно перехватить смс и доступ получен без проблем.
xor nonceЭто прекрасно, просто прекрасно. Закладка на будущее совершенно очевидная. Требуйте $200k ;)
nonce – “случайная” полученная от сервера Telegram последовательность для вычисления ключа.
Если x7mz получит исходные коды сервера...
Если АНБ получит исходные коды сервераА вот если она разная то сервер Telegram может подобрать такую nonce, при которой ключи пользователей совпадут даже при MITM-атаке и никто не будет знать, что его слушают. И даже если nonce совпадает для 2х собеседников сегодня, нет никаких гарантий что nonce будет совпадать завтра, когда в офис Digital Fortress придет АНБ / ФСБ / другая не хорошая организация.
P.S. Экспертом в криптографии не являюсь, поправьте если я ошибся.
Зарегистрирован: 21 мая 2013 в 12:48 по приглашению НЛО
Проверяйте, ищите уязвимости…Прошу ответить на два вопроса:
Многие пользователи мессенджера требуют дать возможность обмениваться открытыми ключами через NFC и QR-коды, чтобы на 100% исключить возможность MITM-атак, в том числе и со стороны сервера Telegram.
Эта история заставляет в очередной раз восхититься российскими программистами. Целую неделю маститые американские криптографы на HackerNews безуспешно цеплялись к протоколу — в основном, с требованием заменить наше решение на алгоритмы, которые продвигает АНБ в своем Suite B. А российский программист, называющий себя «новичком», смог в рамках статьи на Хабре с ходу определить потенциально уязвимое место в секретных чатах.
На всякий случай, поясню для массовых пользователей: утечки данных не было, уязвимость закрыта, опасности нет.
Еще раз убедился в том, насколько правильным решением было полностью открывать протокол и исходный код. Это позволяет привлекать тысячи умных людей, которые могут помогать постоянно совершенствовать систему, находя потенциально уязвимые места.
Разработчик, нашедший слабое место в нашем алгоритме, заслужил награду в $100,000. Подобную награду заслуживает любой, кто найдет возможности схожей атаки (напоминаю, за расшифровку потока трафика мной была объявлена награда в $200,000). Продолжаем искать — вместе мы сделаем протокол нерушимым.

key = (pow(g_b, a) mod dh_prime)
Как нам рассказывал D. Boneh на курсах криптографии, это выражение выдает не равномерно распреленную величину, поэтому его следует пропустить через KDF, на основе какого-нибуть стойкого хэша
Client is expected to check whether p is a safe 2048-bit prime (meaning that both p and (p-1)/2 are prime, and that 2^2047 < p < 2^2048), and that g generates a cyclic subgroup of prime order (p-1)/2, i.e. is a quadratic residue mod p. Since g is always equal to 2, 3, 4, 5, 6 or 7, this is easily
Первой мыслью была возможность MITM-атаки (человек посередине) и я пошел читать api протокола. Где выяснилось, что тут защита достаточно надежная: в момент первого запуска клиента создается авторизационный ключ, создается он непосредственно на клиентском устройстве с помощью протокола обмена ключами Диффи-Хелмана, но с небольшим отличием — открытый ключ сервера Telegram уже прошит в коде клиента, что исключает его подмену третьими лицами.
new pqRequest {Nonce = Sugar.GetRandomBytes(16)}.Send(Channel);
var pqResponce = Channel.Receive().Of<pqResponce>();
var pq = pqResponce.PQ;
var p = PrimeUtils.findSmallMultiplier(pq);
var q = pq/p;
var pqInner = new pqInner // constructor 4 bytes
{
PQ = pqResponce.PQ, // 12 bytes
P = p, // 8 bytes
Q = q, // 8 bytes
Nonce = pqResponce.Nonce, // 16 bytes
ServerNonce = pqResponce.ServerNonce, // 16 bytes
NewNonce = Sugar.GetRandomBytes(32)
};
var pqInnerBytes = pqInner.ToBytes();
var data = new List<byte>();
data.AddRange(pqInnerBytes.Hash());
data.AddRange(pqInnerBytes);
data.AddRange(Sugar.GetRandomBytes(255 - data.Count));
var keySet = KeySet.PublicKeySets.First(s => s.Fingerprint == pqResponce.Fingrprints[0]);
var modulus = keySet.Modulus;
var exponent = keySet.Exponent;
var message = new BigInteger(data.ToArray());
var encriptedData = message.modPow(exponent, modulus);
new dhRequest
{
P = p,
Q = q,
Nonce = pqResponce.Nonce,
ServerNonce = pqResponce.ServerNonce,
FingerPrint = pqResponce.Fingrprints[0],
EncriptedData = encriptedData.getBytes(),
}.Send(Channel);
var dhResponce = Channel.Receive();
if (dhResponce is dhOkResponce) { ... }
Мы точно знаем значения и местоположение 64-х байт из 256 в массиве
data
Безопасен ли Telegram? Или как я искал закладку в MTProto