SYN cookies

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

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

Ссылки[править | править код]