SYN cookies

SYN cookie — техника противодействия SYN-флуд-атаке. Изобретатель техники Daniel 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 не нарушает работу TCP и других протоколов. Однако в данной технике есть два ограничения[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. Архивная копия от 22 июля 2009 на Wayback Machine, cr.yp.to September 1996

Ссылки