Ниже приведена реальная проблема.
В стандартном протоколе клиенты могут подключаться к серверу, используя взаимную 4-проходную аутентификацию по незащищенному каналу TCP:
- pass-1: Клиент отправляет случайный вызов C на сервер
- pass-2: сервер отвечает, отправляя случайный вызов S клиенту
- pass-3: Клиент готовит res(S, K) и отправляет его S
- pass-4: Сервер отвечает клиенту с помощью res(C, K)
res(.) — это тег GCM-GMAC, который зависит от симметричного ключа K (фактически AES128, но здесь это может быть неуместно)
После успешной взаимной аутентификации клиент и сервер могут продолжать общаться в рамках так называемой «ассоциации», например. клиент может запросить некоторые данные с сервера.
Однако что произойдет, если злоумышленник (не имеющий ключа) прослушивает сеть и запустит посредника, а также вредоносного клиента (красный).
Когда настоящий клиент запускает pass-1 и отправляет C1 на сервер, в то же время плохой клиент отправляет C2. Сервер отвечает на оба запроса, но MitM удается внедрить S2 для отправки хорошему клиенту, который подготавливает res(S2) и отправляет его на сервер. Но MitM захватывает res(S2) и вводит его как pass-3 для отправки на сервер. Теперь сервер аутентифицирует плохого клиента и отправляет обратно res(C2), который просто игнорируется плохим клиентом. Таким образом, между плохим клиентом и сервером было установлено, казалось бы, взаимно аутентифицированное соединение.
Интересно, действительно ли такая взаимная аутентификация эффективна?