SYN cookies

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

SYN cookie - техніка протидії атаці SYN-флуд. Винахідник техніки J. Bernshtein визначив SYN cookie як "особливий вибір початкової TCP-послідовності з боку сервера". Використання SYN cookie дозволяє серверу уникати скидання нових з'єднань, коли черга TCP-з'єднань переповнена. Сервер відправляє назад клієнтові правильну послідовність SYN+ACK, але не зберігає нове з'єднання в черзі. Якщо сервер потім отримає ACK відповідь від клієнта, то він зможе відновити своє значення SYN послідовності за прийнятим від клієнта значенням.

Реалізація[ред. | ред. код]

Для створення TCP-з'єднання клієнт відправляє серверу TCP-пакет з прапором SYN і своїм номером послідовності. У відповідь сервер відправляє пакет з прапорами SYN+ACK. номером послідовності клієнта і своїм власним номером послідовності. За цими номерами збирається весь TCP-stream. Специфікація 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 не порушує роботу ТСР і інших протоколів. Однак у цій техніці є два обмеження [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