Nowo dodana opcja MCAST_MSFILTER w funkcji setsockopt jest podatna na integer overflow w kernelach 2.4.22-2.4.25 oraz 2.6.1 do 2.6.3. Wersje 2.6.4 i pózniejsze, oraz 2.4.26 i pózniejsze błedu nie zawierają. Zalecana jest szybka aktualizacja kernela.

Błąd występuje w ip_setsockopt(), która to funkcja jest wywoływana jako podfunkcja przez setsockopt.
Dla tych którzy nie wiedzą co to integer overflow, krótkie wyjaśnienie. Liczby z i bez znaku są przechowywane w pamięci tak samo, cała różnica leży w sposobie ich obsługi.
Dla przykładu liczba 65535 na 16bitowych procesorach może być także wartością -1, wszystko zależy od tego jak obsłuży tę wartość program.
W konsekwencji, niektóre warunki sprawdzające czy dana liczba mieści się w dozwolonym przedziale, inaczej będa się zachowować dla liczb z i bez znaku.

Wracając do błędu, nowo dodana funkcja MCAST_MSFILTER w setsockopt() pozwalająca przekazac kernelowi wiele adresów multicast które mogą być obsłużone przez gniazdo jest podatna na błąd przepełnienia wartości.

Podatny kod znajduje się w net/ipv4/ip_sockglue.c:

    /* ... */    #define IP_MSFILTER_SIZE(numsrc)   	(sizeof(struct ip_msfilter) - sizeof(__u32)   	+ (numsrc) * sizeof(__u32))    /* ... */    case MCAST_MSFILTER:  {  /* ... */  	msize = IP_MSFILTER_SIZE(gsf->gf_numsrc);  	msf = (struct ip_msfilter *)kmalloc(msize,GFP_KERNEL);  /* ... */  	for (i=0; i<gsf->gf_numsrc; ++i) {  		psin = (struct sockaddr_in *)&gsf->gf_slist[i];  		if (psin->sin_family != AF_INET)  			goto mc_msf_out;  		msf->imsf_slist[i] = psin->sin_addr.s_addr;  	}    

Błąd polega na sposobie w jaki to makro oblicza pamięć potrzebną na struktury adresów.
Makro traktuje wartość numsrc jako liczbe bez znaku (__u32 oznacza unsigned int 32 bits, czyli 32 bitową liczbę bez znaku), pętla for natomiast traktuje ją jako liczbę ze znakiem.
Przepełnienie to może prowadzić w efekcie do zmiany pewnych wartości w pamieci, co z kolei prowadzi do zawieszenia się jądra, natychmiastowego restartu lub też umiejętnie manipulowane, do eskalacji przywilejów (krótko mówiąc uzyskania roota).

Nie jest to błąd nowy, Paul Starzetz odkrył go około pół roku temu. Powód dla którego nie został ten błąd zgłoszony wczesniej nie jest mi znany.

Orginalne iSec advisory

Archiwalny news dodany przez użytkownika: gj.
Kliknij tutaj by zobaczyć archiwalne komentarze.

Oznaczone jako → 
Share →