SYN cookie

SYN cookie - техника противодействия SYN-флуд атаке. Изобретатель техники J. Bernstein (недоступная ссылка) определил SYN cookie как "особый выбор начальной TCP-последовательности со стороны сервера". Использование SYN cookie позволяет серверу избегать сброса новых соединений, когда очередь TCP-соединений переполнена. Сервер отправляет обратно клиенту правильную последовательность SYN+ACK, но не сохраняет новое соединение в очереди. Если сервер затем получит ACK ответ от клиента, то он сможет восстановить своё значение SYN последовательности по принятому от клиента значению.

Реализация[ | код]

Для создания TCP-соединения клиент отправляет серверу TCP-пакет с флагом SYN и своим номером последовательности. В ответ сервер отправляет пакет с флагами SYN+ACK. номером последовательности клиента и своим собственным номером последовательности. По этим номерам собирается весь TCP-поток. Спецификация TCP определяет что начальные значение этих номеров последовательности определяются самими клиентом и сервером. SYN cookies - это как раз такой номер последовательности, который аккуратно собирается сервером по следующим правилам:

  • пусть t будет медленно увеличивающаяся метка времени (обычно результат функции time() логически сдвинутая на 6 позиций в право, что даёт новые значение каждые 64 секунды)
  • пусть m будет максимальным размером сегмента (MSS), которое сервер будет хранить в номере последовательности SYN
  • пусть s будет результатом криптографической хэш функции длиной 24 бита над адресами и портами сервера и клиента и значения t

Тогда SYN cookie вычисляется как:

  • старшие 5 бит: t mod 32
  • средние 3 бита: кодированное m (всего будет 8 типов всех возможных MSS)
  • младшие 24 бита: s

Когда клиент отправляет на сервер завершающий рукопожатие пакет с флагом ACK, то он отправляет первоначальный номер последовательности сервера увеличенный на единицу. Для проверки корректности SYN cookie, сервер отнимает от неё единицу и выполняет следующие проверки:

  • проверяет значение t, чтобы проверить, что сессия не просрочилась;
  • восстанавливает s для проверки действительности SYN cookie
  • раскодировать значение m для дальнейшего построения элементов очереди

С этого момента соединение работает как обычно.

Недостатки[ | код]

Использование SYN cookie не нарушает работу ТСP и других протоколов. Однако в данной технике есть два ограничения [1]:

  1. возможность использовать только 8 различных значений для MSS;
  2. серверу придётся игнорировать все TCP опции (увеличенный размер окна, метки времени и др.), т.к. они отправляются в первоначальном SYN-запросе.

В то время как эти ограничения ведут к не оптимальному использованию протокола TCP, негативные последствия редко отражаются на клиентах, т.к. SYN cookie должны использоваться только при атаках на сервер. Игнорирование некоторых возможностей протокола TCP в угоду доступности сервера является разумным компромиссом.

Однако проблема возрастает когда теряется финальный ACK-пакет от клиента, а протокол прикладного уровня требует, чтобы сервер был инициатором дальнейшего взаимодействия (например, протоколы SMTP и SSH). В этом случае клиент предполагает, что соединение установлено успешно и ждёт от сервера пригласительный баннер или повторную пересылку SYN+ACK пакета. Однако сервер не будет отправлять такой пакет, т.к. забракует сессию. В конечном итоге клиент тоже сбросит сессию, но для этого может потребоваться много времени.

В ядро Линукс 2.6.26 добавлена ограниченная поддержка некоторых опций TCP, которые кодируются в метку времени.

Более новый стандарт TCP Cookie Transactions (TCPCT) спроектирован для избежания подобных проблем и улучшает ещё некоторые аспекты. Но это надстройка над TCP и поэтому должна поддерживаться обеими сторонами.

Особенности со стороны безопасности[ | код]

Простые межсетевые экраны, которые разрешают любой исходящий трафик и разрешают входящий трафик только к определённым портам, будут блокировать SYN-запросы только к закрытым портам. Если SYN cookie включены, то необходимо обратить внимание, что злоумышленник не может обойти такие межсетевые экраны отправкой ACK-пакетов с произвольным номером последовательности пока не подберёт правильный. SYN cookies нужно включать только для публично доступных портов.

Ссылки[ | код]

  1. [1], cr.yp.to September 1996