cat_mucius (
cat_mucius) wrote2014-10-11 12:58 pm
![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
(no subject)
Ответ на криптозагадочку, заданную здесь.
Сперва пара моментов:
1. Одно из сильных преимуществ ассиметричных ключей над паролями в том, что одну и ту же пару "публичный-секретный ключ" можно использовать для аутентификациии против массы разных серверов, не беспокоясь о том, что владелец сервера сможет злоупотребить знанием публичного ключа клиента, чтобы выдавать себя за него - поскольку из публичного восстановить секретный ключ нельзя, господа Ривест, Шамир и Адлеман гарантируют это.
2. При изучении SSL, SSH и прочих протоколов на ассиметричных ключах, люди обычно сосредотачиваются на классическом сценарии, когда пара хороших честных ребят - Алиса и Боб - хотят пообщаться по секрету, в то время как злая ревнивая Мэллори желает перехватить разговор, выдавая себя то за Алису, а то и за Боба.
Но что если сценарий слегка другой? Допустим, есть у нас пара серверов. Оба снабжены легитимными сертификатами, подлинность которых заверена Verisign. Оба вполне на совесть защищены от атак. И на обоих серверах есть юзер, использующий свой один и тот же юзерский сертификат, чтобы доказывать каждому из серверов, что он - это он. И допустим, что алгоритм проверки, вправду ли юзер владеет парным секретным ключом работает так, как я предположил ранее. Что будет, если один из серверов поведёт себя слегка нечестно?
Скажем, вот так:

Что здесь происходит? Юзер пытается зайти на сервер1. Получает от него сертификат, убеждается, что всё ок. Получает требование предъявить сертификат со своим публичных ключом, предъявляет. После чего, чтобы доказать, что он и вправду знает парный секретный ключ, для чего шифрует им какое-то присланное случайное число и отсылает результат.
Вроде бы всё хорошо. Да вот только число это сервер1 не сам выдумывает - он в это время выполняет ту же последовательность супротив сервера2, на этот раз в качестве клиента. И случайный этот "челлендж" получает от него. После чего выдаёт серверу2 полученный от настоящего юзера результат.
Что получилось? С точки зрения юзера - он залогинен на сервере1. С точки зрения сервера2 - на нём залогинен юзер. Только на самом деле это сервер1. Который получает доступ ко всем данным юзера на сервере2 и может от его имени творить что угодно.
Получается вариант man-in-the-middle, только с целью не перехватывать или подделывать сообщения, а с целью кражи юзерской identity. Да, это довольно ограниченная кража - секретный ключ этим не вызнаешь, всякий раз для такого логина нужно активное участие юзера. Но если, скажем, сервер2 - сайт банка, то и так нефигово получиться может.
Авторы настоящих протоколов - SSL, SSH, SLIC - эту возможность учли. Вот потому способ доказательства знания секрета для сервера и для клиента разный. Серверу достаточно зашифровать случайный челлендж. А от юзера требуется подписать или зашифровать некий хэш, "покрывающий" обязательно и случайное нечто, и какие-то поля, идентифицирующие сервер. Которые в свою очередь проверяются привычными средствами до того, как юзерский ключ идёт в ход.
Впрочем, и опытные криптографы, случается, лажают - создатели SSH-1 о такой возможности вроде бы подумали, но у них всё равно нашли уязвимость, позволяющую ровно такую атаку провести. Что и послужило одной из причин, по которой SSH-1 решили забросить в пользу SSH-2.
У этой басни есть мораль, и смысл её прост. Хороший криптопротокол должен учитывать деятельность не только злокозненных Мэллори и Ев, но и нечестное поведение любого из законных участников.
Сперва пара моментов:
1. Одно из сильных преимуществ ассиметричных ключей над паролями в том, что одну и ту же пару "публичный-секретный ключ" можно использовать для аутентификациии против массы разных серверов, не беспокоясь о том, что владелец сервера сможет злоупотребить знанием публичного ключа клиента, чтобы выдавать себя за него - поскольку из публичного восстановить секретный ключ нельзя, господа Ривест, Шамир и Адлеман гарантируют это.
2. При изучении SSL, SSH и прочих протоколов на ассиметричных ключах, люди обычно сосредотачиваются на классическом сценарии, когда пара хороших честных ребят - Алиса и Боб - хотят пообщаться по секрету, в то время как злая ревнивая Мэллори желает перехватить разговор, выдавая себя то за Алису, а то и за Боба.
Но что если сценарий слегка другой? Допустим, есть у нас пара серверов. Оба снабжены легитимными сертификатами, подлинность которых заверена Verisign. Оба вполне на совесть защищены от атак. И на обоих серверах есть юзер, использующий свой один и тот же юзерский сертификат, чтобы доказывать каждому из серверов, что он - это он. И допустим, что алгоритм проверки, вправду ли юзер владеет парным секретным ключом работает так, как я предположил ранее. Что будет, если один из серверов поведёт себя слегка нечестно?
Скажем, вот так:

Что здесь происходит? Юзер пытается зайти на сервер1. Получает от него сертификат, убеждается, что всё ок. Получает требование предъявить сертификат со своим публичных ключом, предъявляет. После чего, чтобы доказать, что он и вправду знает парный секретный ключ, для чего шифрует им какое-то присланное случайное число и отсылает результат.
Вроде бы всё хорошо. Да вот только число это сервер1 не сам выдумывает - он в это время выполняет ту же последовательность супротив сервера2, на этот раз в качестве клиента. И случайный этот "челлендж" получает от него. После чего выдаёт серверу2 полученный от настоящего юзера результат.
Что получилось? С точки зрения юзера - он залогинен на сервере1. С точки зрения сервера2 - на нём залогинен юзер. Только на самом деле это сервер1. Который получает доступ ко всем данным юзера на сервере2 и может от его имени творить что угодно.
Получается вариант man-in-the-middle, только с целью не перехватывать или подделывать сообщения, а с целью кражи юзерской identity. Да, это довольно ограниченная кража - секретный ключ этим не вызнаешь, всякий раз для такого логина нужно активное участие юзера. Но если, скажем, сервер2 - сайт банка, то и так нефигово получиться может.
Авторы настоящих протоколов - SSL, SSH, SLIC - эту возможность учли. Вот потому способ доказательства знания секрета для сервера и для клиента разный. Серверу достаточно зашифровать случайный челлендж. А от юзера требуется подписать или зашифровать некий хэш, "покрывающий" обязательно и случайное нечто, и какие-то поля, идентифицирующие сервер. Которые в свою очередь проверяются привычными средствами до того, как юзерский ключ идёт в ход.
Впрочем, и опытные криптографы, случается, лажают - создатели SSH-1 о такой возможности вроде бы подумали, но у них всё равно нашли уязвимость, позволяющую ровно такую атаку провести. Что и послужило одной из причин, по которой SSH-1 решили забросить в пользу SSH-2.
У этой басни есть мораль, и смысл её прост. Хороший криптопротокол должен учитывать деятельность не только злокозненных Мэллори и Ев, но и нечестное поведение любого из законных участников.