Zdalny atak DoS w Linux Kernel 2.6

Adam Osuchowski i Tomasz Dubinski poinformowali o luce w Linux Kernel z serii 2.6 umożliwiającej przeprowadzenie zdalnego ataku typu DoS (Denial of Service). Wykryta luka znajduje się w kodzie netfiltra. Użytkownicy używający iptables z parametrem TCP (–tcp-option) są narażeni na atak.

Błąd został przetestowany w architekturze i386. Inne architektury nie zostały sprawdzone jednak jest niemal pewne że są one również podatne.

Problem dotyczy funkcji tcp_find_option() (net/ipv4/netfilter/ip_tables.c). Kod funkcji przeszukuje lokalną tablicę pobranych opcji.

char opt[60 – sizeof(struct tcphdr)];

Jeśli wartość pobranego oktetu jest większa niż 127 powoduje to nieskończone powtarzanie pętli.

Przykład pakietu umożliwiającego przeprowadzenie ataku DoS:

0x0000: 4500 0030 1234 4000 ff06 e83f c0a8 0001
0x0010: c0a8 0002 0400 1000 0000 0064 0000 0064
0x0020: 7000 0fa0 dc6a 0000 0204 05b4 0101 04fd

Poniżej jest dostępny kod umożliwiający „załatanie” jądra.

— net/ipv4/netfilter/ip_tables.c.orig 2004-04-04 05:36:47.000000000 +0200
+++ net/ipv4/netfilter/ip_tables.c 2004-06-24 21:24:26.000000000 +0200
@@ -1461,7 +1461,7 @@
int *hotdrop)
{
/* tcp.doff is only 4 bits, ie. max 15 * 4 bytes */
– char opt[60 – sizeof(struct tcphdr)];
+ u_int8_t opt[60 – sizeof(struct tcphdr)];
unsigned int i;

duprintf(„tcp_match: finding option\n”);

Źródło informacji: BugTraq