V sobotu 2. listopadu proběhla mohutná oslava naší plnoletosti !!
Multimediaexpo.cz je již 18 let na českém internetu !!

SYN-cookies

Z Multimediaexpo.cz

Verze z 16. 5. 2024, 12:23; Sysop (diskuse | příspěvky)
(rozdíl) ← Starší verze | zobrazit aktuální verzi (rozdíl) | Novější verze → (rozdíl)

SYN cookies je klíčový prvek obrany proti útoku záplavou paketů protokolu TCP s příznakem SYN, pro který se používá anglické označení SYN flood. Útok spočívá v zaslání velkého množství žádostí o navázání spojení, které je nutno jistou dobu uchovávat (ve frontě). Tyto žádosti však nebudou dovedeny do konce, čímž dojde k zaplnění oné fronty a odmítání dalších, i korektních žádostí.

Hlavním tvůrcem technologie SYN-cookies je Daniel J. Bernstein, který ji definoval jako „částečný výběr počátečního čísla sekvence paketu TCP“.

V případě použití SYN-cookies server po obdržení žádosti o navázání spojení (paketu s příznakem SYN) pošle klientovi odpověď a onu žádost ihned odstraní z fronty. Do odpovědi přitom nevložil sekvenční číslo zcela náhodné, ale vygenerované podle daných pravidel. Obdrží-li server od klienta potvrzení odpovědi (paket s příznaky SYN a ACK), je podle čísla sekvence schopen zpětně odvodit, zda se jedná o korektní paket, a pokud ano, je spojení navázáno.

Obsah

Implementace

Při navazování TCP-spojení klient pošle serveru TCP-paket s příznakem SYN. Jako odpověď server pošle klientovi TCP-paket s příznaky SYN a ACK. Jak je možné se dočíst u TCP protokolu, jedna z částí paketu se nazývá sekvenční číslo (sequence number), kterého se v protokolu TCP užívá k seřazení paketů po průchodu sítí. Podle specifikace TCP může jedna ze stran určit číslo první sekvence, což druhá strana musí respektovat. Takže SYN-cookies jsou počáteční čísla sekvencí n, která jsou pečlivě vybírána podle následujících pravidel:

  • Nechť t je čítač zvyšující se každých 64 sekund.
  • Nechť m je maximální velikost segmentu, kterou by měl server uchovávat v jednom záznamu fronty SYN.
  • Nechť s je čtyřiadvacetibitový výsledek tajné, kryptografické funkce počítaný přes IP adresu serveru i klienta, číslo portu a hodnotu čítače t.

Takže počáteční TCP sekvence neboli SYN-cookie se počítá například takto:

  • Prvních 5 bitů: t mod 32.
  • Další 3 bity: zakódovaná hodnota reprezentující číslo m.
  • Zbývajících 24 bitů: s.

(Poznámka: Protože m se kóduje na tři bity, server může použít jen 8 jedinečných hodnot m.)

Server zvolil počáteční číslo TCP-sekvence a klient je povinen podle specifikace protokolu TCP toto respektovat. Paket s příznaky SYN a ACK přijde od klienta s číslem sekvence n+1. Server tedy odečte jedničku a má číslo sušenky, kterou poslal klientovi. Pak provede tyto operace:

  • Zkontroluje hodnotu t, aby zjistil, zda již nevypršel časový limit.
  • Přepočítá s, aby zjistil, zda je SYN-cookie platná.
  • Zjistí hodnotu m z tříbitového kódu v SYN-cookie, což mu pomůže rekonstruovat záznam ve frontě SYN.

Pokud je vše v pořádku, pokračuje se v navazování podle obvyklého scénáře: pošle klientovi TCP paket s příznakem ACK.

Výhody

Využití metody SYN-cookies neporušuje specifikace a je kompatibilní se všemi implementacemi TCP protokolu.

Nevýhody

Při používání SYN-cookies je třeba mít na paměti tyto dvě věci:

  • Číslo m je jen tříbitové, tedy jde o celé číslo 0 ÷ 7 (takže se skýtá jen osm možností)
  • Paket SYN specifikuje též nastavení spojení (například větší datová okna), ale tato nastavení jsou zapomenuta, neboť pakety se neukládají

Tato omezení je třeba brát jako jistou míru sub-optimality. Jejich efekt je klienty postřehnut jen vzácně. Ale je-li server bez technologie SYN-cookies vystaven útoku, další pokusy o spojení jsou zamítnuty a to je dosti protivné. Zachování dosažitelnosti služby za cenu ztráty pár tajemných vychytávek je tedy rozumný kompromis.

Historie

Techniku vytvořil Daniel J. Bernstein a Eric Schenk v září roku 1996. První implementaci provedl o měsíc později Jeff Weisberg na operačním systém SunOS.

Eric Schenk uvolnil implementaci pro jádro Linuxu v únoru 1997 (současná implementace je řízena pomocí net.ipv4.tcp_syncookies).