Znacznik czasu (timestamp) w protokole TCP

Spis treści

O znacznikach czasu (timestamp) wspominałem już raz w ramach omawiania mechanizmu jakim jest bufor połączenia, a konkretnie rozchodziło się o skalowanie okien TCP. Generalnie rzecz biorąc, przy wyższych prędkościach, rzędu 1 gbit/s, nie ma innej opcji jak skorzystanie z opcji znaczników czasu, które są niejako rozszerzeniem czegoś co widnieje pod nazwą numery sekwencyjne . Z jednej strony może i mamy możliwość implementacji łącz o większej przepustowości ale z drugiej te znaczniki czasu w pakietach TCP mogą zagrozić bezpieczeństwu stacji roboczej.

Timestamp, a bezpieczeństwo systemu

Jak możemy przeczytać w podlinkowanym we wstępie artykule, jeśli jakaś maszyna korzysta z opcji timestamp w nagłówku TCP, to jesteśmy w stanie obliczyć czas jej pracy (uptime). A jak wiadomo, aktualizacja oprogramowania ma to do siebie, że by poprawki weszły w życie trzeba zresetować kilka usług. Część z nich może wymagać ponownego uruchomienia maszyny i tu właśnie jest pewien problem. Znając czas pracy komputera, możemy ocenić czy określone poprawki zostały nałożone na system i w przypadku gdy czas pracy wychodzi poza datę wydania łaty, maszyna może być podatna na atak.

Nie chce za bardzo wchodzić w cały ten proces, a jedynie zastanowić się co ta opcja timestamp w nagłówku TCP niesie dla zwykłego człowieka korzystającego z sieci. Jak czytamy dalej w linku, nasza maszyna może zostać oznaczona sprzętowym ciasteczkiem już na poziomie warstwy transportowej, dzięki czemu wszystkie boty będą mogły nas w łatwy sposób zidentyfikować.

To czy nasz system ma włączoną opcję znaczników czasowych możemy zweryfikować przez sprawdzenie poniższego parametru:

# sysctl -a | grep timestamp
net.ipv4.tcp_timestamps = 1
net.netfilter.nf_conntrack_timestamp = 1

Poniżej jest zaś przykładowy wynik skanowania przy pomocy nmap :

# nmap -PN -O -v 192.168.10.100
...
Uptime guess: 197.261 days (since Sat Dec 13 09:51:44 2014)
...

W moim przypadku wynik nie jest trafiony. Zgodnie z tym co pokazuje aktualnie uptime , to mam 1 day, 4:58, . Także niezła rozbieżność. Pamiętam jak kiedyś poruszałem tę kwestię na forum dug'a. Widać coś namieszali i nie idzie już tak łatwo wyciągnąć uptime.

Jeśli chodzi z jakichś powodów skanowanie wykrywa nasz prawdziwy uptime, to zawsze można się posłużyć iptables i zablokować określone pakiety protokołu ICMP. Jeśli przejrzymy tabelkę typów komunikatów, to widzimy tam numerki 13 i 14 . Zatem komunikaty z żądaniem i odpowiedzią timestamp można zablokować niczym zwykły ping przy poniższych regułek:

iptables -A icmp_in -p icmp -m icmp --icmp-type 13 -m comment --comment timestamp-request -j DROP
iptables -A icmp_out -p icmp -m icmp --icmp-type 14 -m comment --comment timestamp-reply -j DROP

I już żaden skaner nie wyciągnie od nas informacji o uptime naszego serwera.

Mikhail Morfikov avatar
Mikhail Morfikov
Po ponad 10 latach spędzonych z różnej maści linux'ami (Debian/Ubuntu, OpenWRT, Android) mogę śmiało powiedzieć, że nie ma rzeczy niemożliwych i problemów, których nie da się rozwiązać. Jedną umiejętność, którą ludzki umysł musi posiąść, by wybrnąć nawet z tej najbardziej nieprzyjemniej sytuacji, to zdolność logicznego rozumowania.