Bezpieczeństwo TCP
Ochrona przed SYN flood, wstrzyknięciem RST, przewidywaniem sekwencji; SYN cookies i dobre praktyki.
Fundament Zaufania: Wrodzone Podatności TCP
Protokół Kontroli Transmisji (TCP) to arcydzieło inżynierii, zaprojektowane w celu zapewnienia niezawodnego transportu danych przez zawodne sieci. Jest jak niezwykle skrupulatna i formalna firma kurierska, która dba o to, by każda paczka była ponumerowana, potwierdzona po odbiorze i dostarczona we właściwej kolejności. Jednakże TCP został zaprojektowany w latach 70. i 80. XX wieku, w erze, gdy internet był małą, akademicką społecznością zbudowaną na fundamencie wzajemnego zaufania.
To wrodzone zaufanie jest źródłem wielu jego słabości bezpieczeństwa. Projektanci protokołu skupili się głównie na rozwiązywaniu problemów utraty pakietów i przeciążenia sieci, a nie na obronie przed złośliwymi aktorami aktywnie próbującymi zakłócać, przechwytywać lub manipulować komunikacją. Formalne, stanowe procesy TCP, takie jak trójetapowe uzgadnianie, są eleganckie dla niezawodności, ale mogą być wykorzystywane przez atakujących, którzy nie przestrzegają zasad kulturalnej rozmowy.
Zrozumienie bezpieczeństwa TCP polega na przyjrzeniu się jego starannie skonstruowanym mechanizmom i zobaczeniu, jak można je naginać i nadużywać. W tej sekcji zbadamy niektóre z najbardziej klasycznych i dotkliwych ataków na TCP oraz środki zaradcze, które zostały opracowane na przestrzeni lat, aby chronić ten kamień węgielny internetu.
Atak SYN Flood: Atak na Przeciążoną Recepcję
SYN flood to klasyczny , który bezpośrednio wykorzystuje mechanikę trójetapowego uzgadniania TCP.
Analiza Podatności w Procesie Uzgadniania
Aby zrozumieć atak, przypomnijmy sobie zachowanie serwera w normalnym procesie uzgadniania.
- Klient wysyła pakiet SYN do serwera.
- Serwer odbiera SYN. W tym momencie, co kluczowe, serwer musi przydzielić zasoby. Tworzy w swojej pamięci strukturę danych (zwaną Blokiem Kontrolnym Transmisji, TCB), aby przechowywać informacje o tym oczekującym połączeniu, takie jak adres IP klienta i numer portu. Następnie umieszcza to połączenie w stanie 'SYN_RCVD' w swojej tabeli połączeń, często nazywanej kolejką zaległych połączeń (backlog queue).
- Serwer odsyła pakiet SYN-ACK do klienta.
- Serwer czeka na ostatnie potwierdzenie ACK od klienta, aby zakończyć uzgadnianie i przenieść połączenie do stanu 'ESTABLISHED'.
Podatność leży w Kroku 2. Serwer angażuje pamięć i stan przed zweryfikowaniem, czy klient jest legalny i zdolny do ukończenia uzgadniania. Działa w dobrej wierze.
Przeprowadzenie Ataku SYN Flood
Atakujący wykorzystuje to zachowanie oparte na dobrej wierze za pomocą prostej, ale skutecznej strategii.
- Atakujący używa jednej lub więcej maszyn do wysłania masowej liczby pakietów SYN do docelowego serwera.
- Kluczem ataku jest to, że te pakiety SYN zawierają sfałszowany (fałszywy) źródłowy adres IP. Atakujący nie ma kontroli nad tymi fałszywymi adresami i nie ma zamiaru kiedykolwiek otrzymać odpowiedzi.
- Serwer docelowy otrzymuje tę powódź pakietów SYN. Dla każdego z nich sumiennie przydziela pamięć, tworzy półotwarte połączenie w swojej kolejce zaległych połączeń i wysyła pakiet SYN-ACK na sfałszowany adres IP.
- Te pakiety SYN-ACK podróżują przez internet do nieistniejących lub niereagujących maszyn. Ostateczny pakiet ACK nigdy nie wraca do serwera.
Rezultat: Wyczerpanie Zasobów. Serwer pozostaje z tysiącami półotwartych połączeń w stanie 'SYN_RCVD'. Każde z tych połączeń zużywa pamięć i, co ważniejsze, miejsce w skończonej kolejce zaległych połączeń. W końcu ta kolejka całkowicie się zapełnia. Gdy legalni użytkownicy próbują się połączyć, ich prawidłowe pakiety SYN docierają do serwera, który nie ma już miejsca na przetwarzanie nowych połączeń. Serwer jest zmuszony odrzucić ich żądania. Usługa, czy to strona internetowa, poczta e-mail, czy serwer gier, staje się całkowicie niedostępna dla prawdziwych użytkowników.
Obrona: Ciasteczka SYN (SYN Cookies)
Jak serwer może bronić się przed atakiem SYN flood, nie naruszając fundamentalnie procesu uzgadniania TCP? Rozwiązaniem jest genialny mechanizm zwany ciasteczkami SYN. Główną ideą jest obsługa początkowego żądania SYN bez alokowania jakiegokolwiek stanu. Serwer zmusza klienta do udowodnienia swojej legalności, zanim jakiekolwiek zasoby zostaną zaangażowane.
Jak Działają Ciasteczka SYN
- Otrzymanie SYN: Kiedy serwer z włączonymi ciasteczkami SYN otrzymuje pakiet SYN, nie tworzy natychmiast TCB ani nie alokuje pamięci. Zachowuje się, jakby nie pamiętał o tym żądaniu.
- Tworzenie Ciasteczka: Zamiast generować prawdziwie losowy Początkowy Numer Sekwencyjny (ISN), serwer tworzy specjalny, obliczony numer sekwencyjny. To ciasteczko to kryptograficzny skrót (hash) kilku informacji:
- Źródłowy adres IP i numer portu klienta.
- Docelowy adres IP i numer portu serwera.
- Znacznik czasu i tajna, wolno zmieniająca się wartość znana tylko serwerowi.
- Wysłanie SYN-ACK: Serwer odsyła standardowy pakiet SYN-ACK do klienta, używając tego stworzonego ciasteczka jako swojego Początkowego Numeru Sekwencyjnego. Następnie całkowicie odrzuca wszelkie informacje o żądaniu. Nie zużywa żadnej pamięci.
Dwa Możliwe Scenariusze
- Jeśli nadawca był atakującym (sfałszowany IP): SYN-ACK jest wysyłany na fałszywy, nieosiągalny adres. Ostateczne ACK nigdy nie wraca. Serwer się tym nie przejmuje, ponieważ nigdy nie alokował żadnych zasobów. Pakiet SYN flood miał zerowy wpływ na stan serwera.
- Jeśli nadawca był legalnym klientem: Klient otrzymuje SYN-ACK. Jako normalna część protokołu TCP, skonstruuje ostatni pakiet ACK. Numer Potwierdzenia w tym pakiecie będzie równy numerowi sekwencyjnemu serwera (ciasteczku) plus jeden. Klient odsyła to ostatnie ACK do serwera.
Weryfikacja i Nawiązanie Połączenia
Gdy serwer otrzyma ostatnie ACK od legalnego klienta, przeprowadza weryfikację. Bierze numer potwierdzenia z pakietu, odejmuje jeden, aby odzyskać oryginalne ciasteczko, a następnie ponownie oblicza skrót, używając adresu IP/portu klienta i własnego tajnego klucza. Jeśli ponownie obliczony skrót pasuje do ciasteczka otrzymanego od klienta, serwer wie, że klient jest legalny (musiał otrzymać SYN-ACK, aby móc wysłać prawidłowe potwierdzenie). Dopiero teraz, po pomyślnej weryfikacji, serwer alokuje pamięć i w pełni nawiązuje połączenie.
Ciasteczka SYN są bardzo skuteczną obroną, czyniąc serwer bezstanowym podczas początkowej fazy uzgadniania i tym samym odpornym na wyczerpanie zasobów w wyniku ataków SYN flood.
Przewidywanie Numerów Sekwencyjnych i Przejęcie Sesji TCP
Inna poważna klasa ataków na TCP polega na przewidywaniu numerów sekwencyjnych, których TCP używa do porządkowania i potwierdzania danych. Jeśli atakujący zdoła odgadnąć następny numer sekwencyjny w połączeniu, może wstrzyknąć złośliwe dane do konwersacji. Jest to znane jako Przejęcie Sesji TCP (ang. TCP Session Hijacking).
Podatność: Przewidywalne ISN
Bezpieczeństwo TCP opiera się na założeniu, że zewnętrzny atakujący nie zna bieżących numerów sekwencyjnych dla ustanowionego połączenia. Samo połączenie jest identyfikowane tylko przez adresów i portów. Numery sekwencyjne działają jako słaba forma uwierzytelniania dla każdego segmentu.
We wczesnych implementacjach TCP Początkowe Numery Sekwencyjne (ISN) były często wybierane w prosty, przewidywalny sposób (np. przez inkrementację globalnego licznika). Atakujący mógł zaobserwować kilka połączeń i łatwo przewidzieć ISN dla następnego.
Atak Przejęcia Sesji w Praktyce
- Legalny użytkownik ustanawia uwierzytelnione połączenie z serwerem (np. sesję Telnet po zalogowaniu).
- Atakujący, który chce przejąć tę sesję, najpierw obserwuje ruch, aby poznać adresy IP i numery portów.
- Następnie atakujący przeprowadza krótki atak DoS na legalnego klienta, aby go tymczasowo uciszyć. Jest to ważne, aby uniemożliwić prawdziwemu klientowi wysyłanie pakietów RST, które zabiłyby przejętą sesję.
- Atakujący musi teraz wstrzyknąć dane. Przewiduje następny numer sekwencyjny, którego serwer oczekuje od klienta.
- Atakujący tworzy złośliwy pakiet. Pakiet ten ma sfałszowany źródłowy adres IP klienta, prawidłowe porty oraz przewidziany numer sekwencyjny. Ładunek tego pakietu zawiera złośliwe polecenie (np. polecenie usunięcia plików).
- Jeśli przewidywanie jest poprawne, serwer otrzymuje sfałszowany pakiet. Ponieważ wszystkie informacje identyfikujące (4-krotka i numer sekwencyjny) wydają się prawidłowe, serwer akceptuje złośliwy ładunek i wykonuje polecenie. Sesja została przejęta.
Obrona: Losowe ISN
Podstawową obroną przed przewidywaniem numerów sekwencyjnych jest uczynienie ISN nieprzewidywalnym. Nowoczesne systemy operacyjne nie używają już prostych liczników. Zamiast tego używają kryptograficznie bezpiecznych generatorów liczb pseudolosowych do tworzenia ISN. To sprawia, że odgadnięcie prawidłowego numeru sekwencyjnego przez atakującego spoza ścieżki jest obliczeniowo niemożliwe, skutecznie udaremniając całą tę klasę ataków.
Wstrzyknięcie RST: Gwałtowne Zakończenie Połączeń
Atak Reset (RST) to metoda używana do gwałtownego zakończenia połączenia TCP między dwiema ofiarami. W przeciwieństwie do eleganckiego zamknięcia FIN, pakiet RST natychmiast zrywa połączenie, powodując odrzucenie wszystkich zbuforowanych danych.
Podatność: Okno Akceptacji
Aby segment TCP został uznany za prawidłowy przez odbiorcę, musi mieć numer sekwencyjny, który mieści się w bieżącym oknie odbiorczym odbiorcy. Jest to zakres logiczny, a nie pojedyncza liczba. W przypadku pakietu RST ta zasada oznacza, że atakujący nie musi odgadnąć dokładnego następnego numeru sekwencyjnego. Wystarczy, że odgadnie liczbę, która jest prawdopodobna – czyli taką, która ląduje gdziekolwiek w bieżącym oknie.
Przeprowadzenie Ataku Wstrzyknięcia RST
- Atakujący identyfikuje docelowe połączenie na podstawie jego źródłowych i docelowych adresów IP i portów.
- Atakujący zaczyna bombardować jeden lub oba punkty końcowe połączenia falą sfałszowanych pakietów RST.
- Każdy sfałszowany pakiet ma źródłowy adres IP drugiej strony.
- Co kluczowe, każdy pakiet jest wysyłany z innym, odgadywanym numerem sekwencyjnym.
- Atakujący rozsyła te próby w prawdopodobnym zakresie. Ponieważ okno odbiorcze TCP może być duże (dziesiątki tysięcy bajtów), istnieje duża szansa, że jedna z tych prób w końcu trafi w prawidłowe okno.
- Gdy maszyna ofiary otrzyma pakiet RST z prawidłową 4-krotką i numerem sekwencyjnym w swoim bieżącym oknie, zaakceptuje pakiet jako legalny i natychmiast zakończy połączenie.
Atak ten może być użyty do zakłócania długotrwałych połączeń, takich jak transfery baz danych, duże pobieranie plików czy trwałe połączenia używane przez protokoły routingu, takie jak BGP.
Obrona przed Wstrzyknięciem RST
Łagodzenie skutków wstrzyknięcia RST jest trudniejsze niż zapobieganie przewidywaniu sekwencji. Obrona jest często implementowana na poziomie sieci. Zapory sieciowe (firewalle) i Systemy Wykrywania Włamań (IDS) mogą być skonfigurowane do monitorowania nietypowych wzorców, takich jak duża liczba pakietów RST dla jednego połączenia, i blokowania podejrzanego ruchu. Najsolidniejszą obroną jest szyfrowanie. Kiedy połączenie jest opakowane w , jak w przypadku HTTPS, atakujący nie może już wstrzyknąć prawidłowego RST, ponieważ nie jest w stanie stworzyć niezbędnych zaszyfrowanych rekordów.
Podsumowanie: Warstwowe Podejście do Bezpieczeństwa
Protokół TCP, choć genialny w swoim projekcie niezawodności, nie został zbudowany z myślą o wrogim środowisku współczesnego internetu. Omówione ataki, SYN flood, przejęcie sesji i wstrzyknięcie RST, pokazują, jak jego podstawowe mechanizmy mogą być wykorzystywane.
Na przestrzeni lat do nowoczesnych implementacji TCP zintegrowano środki zaradcze, takie jak ciasteczka SYN i losowe ISN, zapewniając silną ochronę przed niektórymi z najczęstszych zagrożeń. Jednak ostateczną lekcją bezpieczeństwa TCP jest to, że żadna pojedyncza warstwa nie może być wyłącznie odpowiedzialna za ochronę. Prawdziwe bezpieczeństwo sieci opiera się na warstwowym podejściu do obrony w głąb.
Podczas gdy TCP zabezpiecza transport danych, solidne bezpieczeństwo osiąga się, dodając warstwy kryptograficzne na wierzchu (jak TLS/SSL) i wdrażając inteligentne urządzenia sieciowe (takie jak zapory sieciowe i IDS), które mogą monitorować i reagować na złośliwe wzorce ruchu. TCP zapewnia niezawodny fundament, ale bezpieczeństwo to wspólny wysiłek całego stosu sieciowego.