Podziel się opinią o serwisie

Biblioteka Wiedzy poleca

Office 365 - podręcznik użytkownika

Ta książka pokaże Ci, jak wykorzystać chmurowe przetwarzanie danych - a konkretnie Office 365 - aby robić więcej, współpracować łatwiej i działać...
pobierz »

Jak zwiększyć wydajność infrastruktury serwerowej oszczędzając czas i pieniądze? Nowoczesne rozwiązania serwerowe

Niniejszy dokument ma na celu zaprezentowanie sposobów na poprawę funkcjonowania i efektywności działania infrastruktury serwerowej w firmie lub...
pobierz »

Dlaczego warto korzystać z Office 365?

Jakie funkcje i możliwości Microsoft Office 365 decydują o tym, że warto wybrać to rozwiązanie zamiast tradycyjnego pakietu Office i rozwiązań...
pobierz »

Więcej bezpłatnych raportów w serwisie
powiększ tekst >
AKTUALNOŚCI

Nowa dziura w kernelu Linuksa

20 lipca 2009

Paweł Krawczyk
Nowy błąd w kernelu Linuksa odnaleziony w kodzie obsługującym interfejsy tunelowe należy do jednych z najciekawszych jakie do tej pory odnaleziono.

Po pierwsze, umożliwia obejście zabezpieczeń działających na poziomie kernela takich jak SELinux. Po drugie, do jego znalezienia wymagane była nie tylko analiza kodu źródłowego ale i wiedza o działaniu kompilatora. Błąd nie jest wprost widoczny w kodzie źródłowym, a właściwą dziurę wprowadza dopiero kompilator na etapie optymalizacji kodu wynikowego.

Dziura to niewłaściwa kolejność inicjalizacji pewnej struktury w pliku drivers/net/tun.c, widoczna wyraźnie w łatce nadesłanej do zespołu zarządzającego kodem kernela:

struct sock *sk = tun->sk;
if (!tun)
return POLLERR;

Ponieważ struktura została dopiero co zainicjalizowana, więc kompilator "mądrze" usuwa cały warunek "if" z kodu wynikowego. Programista prawie poprawnie zabezpieczył się przed wykorzystaniem dziury. Prawie, bo jego wysiłek został zniweczony przez kompilator.

Kod programu w C (działającego w trybie użytkownika), który pozwala na zademonstrowanie błędu jest bardzo prosty:

int fd;
struct pollfd pfd;
fd = open("/dev/net/tun", O_RDWR);
pfd.fd = fd;
pfd.events = POLLIN | POLLOUT;
poll(&pfd, 1, 0);

Serwis SANS określił tę dziurę jako "fascynującą" ze względu na sposób jej powstania. Jako wcześniejszy błąd tego kalibru można wymienić niezapomnianą dziurę do_brk(), która wiele osób postawiła ponownie na ziemi po okresie fascynacji "bezpiecznym Linuksem" w przeciwstawieniu do dziurawej reszty.

Błąd został naprawiony w najnowszym kernelu 2.6.30.1.

Wystaw ocenę:
   Średnia ocena (liczba głosów: 11)
wydrukuj wydrukuj wyslij do znajomegowyślij do znajomego

Komentarze

slepiec

  • ocena: brak oceny
  • IP: 82.146.248.79
  • 20-07-2009, 10:49

''szkoda'' że łatkę mam nagraną od jakiś 4-5 dni .... a wy dopiero teraz o tym piszecie.

swoją drogą ciekawe jak odkryli dziurę.

Gość

  • ocena: 5
  • IP: 85.222.115.168
  • 20-07-2009, 10:56

łata jest łatą (jakie błędy soba powoduje) ale zatrzęsienie softu pod linuksy, wraz z jądrem ma już w sobie te błądy a nawet rekompilacji może mieć inne błędy - bo programiści "obsłuzyli" ten problem na swój sposób a teraz wyjdzie nieobsłużone/inne obłuźenie wpływu tej zmiany (i jej pochodnych) w kompilatorze. Na jakiś czas lin stał sie o jeden stopnień mniej wart uwagi w zastosowaniach lepszych i droższy w doborze przez kolejną dodatkową weryfikację biblotek i aplikacyjek dopuszczonych do uzywania itd.
Nie stać nas na linuxa od dawna. Od paru lat Windows 2008 nie jest tym co wam wciskali do główek o Windows ME.