Bezpečnostní aspekty používání protokolu TCP

Nantl, Jakub

Ing, Slezská Univerzita, Univerzitní nám. 76, Karviná, jakub.nantl@opf.slu.cz,  http://x.opf.slu.cz/~jakub/

Abstrakt

TCP/IP protocol suite is widely used for internetworking communication. But there is a lot of security problems inherent in protocols from TCP/IP familly. This is serious problem especially in Internet which is built on TCP/IP and is used more and more often for transmition of private data. This paper describes some basic problems of TCP protocol, methods and techniques related to its exploration and as well as methods for securing private networks and data transfers.

2. Protokoly TCP/IP

V transportní vrstvě protokolu TCP/IP jsou definovány dva protokoly. Prvním z nich je protokol TCP (transmission control protocol), který poskytuje aplikacím zabezpečený, spojovaný přenosový kanál. Aplikacím, které jej využívají, poskytuje tento protokol iluzi přenosové roury, do které jsou na jedné straně datové byty vkládány a na druhé straně z ní vystupují. Pro přenos využívá protokol TCP služby protokolu IP.

Druhým transportním protokolem je protokol UDP (User Datagram Protocol). Jde o jednoduché rozšíření protokolu IP a funkce umožňující adresaci jednotlivých aplikací na cílovém uzlu tj. implementace portů jako dalších determinantů spojení. S přenosového hlediska jde o službu totožnou s protokolem IP, neboť je opět nespojovaná a nezabezpečená. Protokolu UDP se využívá všude tam, kde je potřeba přenášet rychle malé objemy dat a kde by časové prodlevy spojené s režií TCP byly nežádoucími.

Jak již bylo řečeno protokol TCP je nadstavba protokolu IP, která poskytuje uživatelské vrstvě,co do spolehlivosti doručení přenášených dat, zabezpečený přenosový kanál. Této spolehlivosti je dosaženo pomocí mechanismu sekvenčních čísel, která jsou připojována ke každému přenášenému datagramu.

Aby mohlo dojít k přenosu dat pomocí TCP z uzlu A na uzel B je nejprve třeba vytvořit spojení, přenést data a následně spojení ukončit. Inicializace TCP spojení probíhá ve třech krocích. Klient A, iniciátor spojení, odešle cílovému uzlu B-serveru požadavek na otevření komunikačního kanálu, tento požadavek obsahuje inicializační sekvenční číslo (ISN) a nastavený příznak SYN. Server B odpoví na požadavek vlastním ISN a potvrzením klientova ISN tzv. ACK, což je klientovo ISN+1. Klient A zjistí z odpovědi, že server B obdržel jeho požadavek a zaregistroval jeho ISN a dále zaregistruje serverovo ISN a opět potvrdí jeho přijetí datagramem s ACK (serverovo ISN zvětšené o 1). Tento mechanismus se nazývá "three way handshaking”.

A
----- SYN(ISNA) ---->
B
A
<------ SYN(ISNB)/ACK(ISNA) ------
B
A
-------- ACK(ISNB) ------->
B

Po ustanovení spojení je možno začít přenášet data. Datové pakety jsou vždy označovány o jednotku zvětšujícím se sekvenčním číslem a jejich doručení je potvrzeno pomocí ACK. Po ukončení datového přenosu je spojení zrušeno pomocí datagramu s nastaveným parametrem RST.

3. TCP Spoofing

Inicializační Sekvenční Čísla (ISN) jsou 32bitové čítače, které jsou více méně náhodně generovány systémem tak, aby každé nové spojení obdrželo jedinečné ISN. Předpokládejme nyní, že je útočník X schopen predikce ISN nově otevřeného spojení.

X(A)
----- SYN(ISNX) ---->
B
A
<------ SYN(ISNB)/ACK(ISNX) ------
B
X(A)
----- ACK(ISNB) ---->
B
X(A)
------ ACK(ISNB)/DATA ------>
B

Útočník X vyšle k B požadavek na otevření TCP spojení vybavený vlastním ISN avšak s odesílatelem přepsaným na A. B tento požadavek obdrží a jelikož je přesvědčen že o spojení žádá A, odešle A potvrzení spolu s vlastním ISN. Jelikož je však X schopen předpovědět ISNB potvrdí, opět zamaskovaný jako A, serveru B přijetí jeho ISNB. Tím je ustanoveno TCP spojení a B očekává data od A. X nyní muže začít, stále zamaskován za A, posílat data na B. Má k tomu totiž vše potřebné, neboť zná ISN serveru B a může proto každý odeslaný datagram vybavit příslušným ACK.

Útočník X musí před započetím útoku vyřešit dva problémy. Musí dokázat předpovědět ISN serveru B a dále musí zajistit aby A nemohl odpovědět (RST) na SYN/ACK paket od serveru B v druhém kroku handshakingu. Druhý problém se dá vyřešit buď tak, že X vyčká na okamžik, kdy je A mimo provoz a nebo elegantněji použitím DoS útoku, kterým A na potřebný čas "umlčí”.

Větší problém představuje predikce ISN serveru B v okamžiku započetí útoku. Pokud jsou ovšem sekvenční čísla generována podle nějakého, předem známého algoritmu, je možno pomocí určitého počtu navázaných spojení mezi X a B určit ISN, jež bude použito při následném spojení.

Obranou proti tomuto druhu útoku je nepredikovatelný algoritmus generovaní sekvenčních čísel tak aby nemohla být útočníkem odhadnuta a využita. Generování sekvenčních čísel nesmí být pouze funkcí času a počtu spojení, ale také funkcí nějaké náhodné veličiny.

4. Odposlech

Další úskalí užívání protokolů TCP/IP vyplývá z absence, jakéhokoliv kódování přenášených dat. Proto je možno kdekoliv na trase mezi komunikujícími počítači A a B odposlechnout přenášená data, aniž by se to jedna či druhá s komunikujících stran dozvěděla.

Uvažujme např. síť s přenosovou technologií ethernet. Technologie ethernet využívá pro připojené stanice jeden přenosový kanál, o který se tyto stanice dělí. Hlavička ethernet rámce obsahuje mimo jiné údaje o příjemci. Při běžné komunikaci čtou stanice z přenosového kanálu pouze data určená pro sebe. Síťové rozhraní je však možno nakonfigurovat tak, aby přijímalo veškerá data přenášená v daném ethernet segmentu; tento stav se nazývá promiskuitní mód.

V praxi je tedy možné uvedením síťového rozhraní do promiskuitního modu monitorovat veškeré datové toky, které ovšem u neanonymních služeb obsahují i příslušné autorizační údaje jako jsou přístupová jména a hesla.

Proti použití takto odposlechnutého hesla, se můžeme bránit použitím jiných autentifikačních metod, jakými mohou být např. hesla na jedno použití tzv. one time passwords. Avšak ani tato metoda není 100% účinná, neboť existují metody i pro její obejití.

5. Převzetí spojení -TCP hijacking

Pomocí tohoto druhu útoku je možno obejít problémy spojené s predikcí sekvenčních čísel spojení při IP spoofingu. Tato metoda využívá obou předcházejících metod. Útočník má možnost aktivně odposlouchávat přenosový kanál mezi komunikujícími uzly A a B. Zaregistruje ustanovení spojení, nechá proběhnout autentifikaci a začne monitorovat spojení. Při tomto odposlechu lehce zjistí používaná sekvenční čísla determinující jednotlivé datagramy. V tomto okamžiku má již všechny potřebné údaje pro započetí útoku.

Nejprve pomocí DoS útoku umlčí klienta A tak aby nemohl dále zasahovat do komunikace, kterou nyní přebírá. Z informací načerpaných během monitorování spojení, může nyní X velmi lehce odesílat směrem k B datagramy se správnými sekvenčními čísly a ACK s adresou odesílatele nastavenou na A, takže server B vůbec nezaregistruje, že data nepochází od A, ale od X.

Takto lze velmi lehce obelstít jakoukoliv authentifikaci, neboť je spojení převzato až ve chvíli, kdy je autentifikace ukončena. Jedinou, skutečně spolehlivou, obranou proti TCP hijackingu a TCP spoofingu je používání kryptovaného přenosového kanálu, jakým je např. secure shell (ssh), který veškerou komunikaci kóduje pomocí silných kryptovacích algoritmů a jako authentifikaci využívá kombinaci hesla a RSA klíče.

6. TCP Port Scanning

6.1 TCP connect()

Tato základní technika používá systémového volání connect(), které je dostupné každému uživateli operačního systému a umožňuje navázání spojení s libovolným portem na cílovém uzlu. Mezi hlavní výhody tohoto druhu scanování patří právě ona široká dostupnost (dostupné každému uživateli). Na druhou stranu je tento způsob lehce detekovatelný a filtrovatelný paketovými filtry a firewally.

6.2 TCP SYN scanning

Předchozí technika používá pro detekci otevřených portů plnohodnotné navázání TCP spojení. Její modifikace označovaná jako TCP SYN scanning používá pro detekci otevřeného portu pouze prvního, SYN paketu, z three-way handshakingu, kterým se navazuje TCP spojení. Pokud je port otevřen, odpoví paketem SYN/ACK v opačném případě obdržíme RST, které ukončuje spojení. Použití SYN paketu bude detekováno menším počtem počítačů než v předchozí metodě, na druhou stranu je však pro vytvoření potřebných SYN paketů třeba privilegovaného přístupu a muže být blokováno paketovými filtry a firewally.

6.3 TCP FIN Scanning

Tato metoda řeší problémy předchozích. Místo SYN paketu vyšleme na testovaný počítač paket FIN, oznamuje dokončení datového přenosu. Zavřený port odpoví na tento paket paketem RST avšak otevřený port by jej měl ignorovat. Pomocí tohoto způsobu můžeme obejít paketové filtry a také se vyhneme snadné detekci. Metoda TCP FIN využívá chyby v TCP implementaci a není 100% spolehlivá.

7. DoS

DoS - Denial of Service útoky nejsou používány s cílem odposlechnout či modifikovat přenášená data. Jejich smyslem je, jak již z názvu vyplývá, přivézt cílový systém do takového stavu, ve kterém není schopen zpracovávat požadavky, za které je zodpovědný. Při úspěšném DoS útoku se proto napadený systém jeví klientovi jako nefunkční.

TCP SYN Flooding

Mechanismu inicializace TCP spojení je možno velmi efektivně využít pro DoS útok. Při inicializaci spojení odesílá iniciátor (povětšinou klient) serveru žádost o otevření TCP spojení paketem s nastaveným příznakem SYN. Server po přijetí žádosti alokuje v systémových prostředcích patřičné místo pro nadcházející spojení a odpoví na klientovu žádost paketem s příznakem SYN-ACK. Klient na SYN-ACK odpoví paketem s ACK a spojení je ustanoveno.

TCP SYN Flooding útok staví právě na této úvodní "domluvě” mezi klientem a serverem. Útočník zahltí napadený server požadavky na otevření spojení (SYN) od neexistujícího klienta pomocí techniky IP Spoofing. Server se na ně snaží odpovědět (SYN-ACK), ale jelikož je v požadavcích uveden neexistující klient, nemá tyto odpovědi kdo potvrdit (ACK). V normálním případě existuje samozřejmě timeout pro inicializaci TCP, takže pokud dojde k chybě, po určitém čase je operace stornována. Tento ochranný mechanismus však může útočník jednoduše obejít tak, že posílá požadavky rychleji, něž je cílový systém schopen stornovat.

Jak již bylo řečeno, je pro každé toto "polo otevřené” spojení na serveru alokována část systémových prostředků (socket), a tudíž je možno buď zaplnit tabulku otevřených spojení, tak že nebude možno se serverem navázat nové spojení. A nebo, v horším případě, dojde k vyčerpání všech systémových prostředků serveru a k jeho zhroucení.

Ochrana proti tomuto druhu útoku spočívá v používání tzv. SYN cookies, což jsou vlastně identifikátory jednotlivých spojení, které jsou odesílány jako ISN v SYN/ACK, veškeré údaje o iniciátorovy jsou okamžitě zahozeny, takže nezatěžují systémové prostředky. Spojení je ustanoveno až po obdržení finálního ACK od inciátora spojení, přičemž jsou všechny údaje potřebné pro ustanovení spojení, které jsou v normálním případě dohodnuty během tří kroků, rekonstruovány z ISN serveru obsaženého v ACK klienta.

8. Závěr

Jak je vidět, přenosový protokol TCP je v současné implementaci naprosto nevhodný pro přenos jakýchkoliv privátních dat, po veřejných datových sítích. Při zvažování jeho použití v situacích, pro které patří bezpečnost mezi klíčové aspekty, je třeba brát v úvahu především problémy spojené s inicializací TCP spojení a hlavně s absencí jakéhokoliv kryptování přenosového kanálu, který je proto čitelný pro každého "poslouchajícího” na spojnici mezi komunikujícími uzly.

9. Literatura

BELLOVIN, S. M. 1989 Security Problems in the TCP/IP Protocol Suite, Computer Communication Review, Vol 19. No.2, AT&T Bell Laboratories, Murray Hill, New Jersey.

COMER, D. Internetworking with TCP/IP: Principles, protocols and Architecture. Prentice Hall, 1988.

MORRIS, R. T. 1985. A Weaknes in the 4,2BSD Unix TCP/IP Software. Computing science TEchnical REport No. 117, AT&T Bell Laboratories, Murray Hill, New Jersey.

The Art of Port Scanning [online]. Phrack Magazine, Volume 7, Issue 51, article 11. Dostupný z www: <URL: http://www.phrack.com/>