Dyskusja o bezpieczeństwie jądra
Wśród developerów Linuksa rozgorzała dyskusja na temat błędu w nowych jądrach opensource'owego systemu. Największym zagrożeniem jest fakt, że ataki można przeprowadzać nawet na w pełni zabezpieczone maszyny, a luka w jądrze jest niemal niemożliwa do wykrycia.
Po raz pierwszy o problemie poinformował Brad Spengler, który w ostatni piątek opublikował kod umożliwiający zaatakowanie Linuksa. Specjalistów martwi to o tyle, że problem dotyczy najnowszego jądra, które dopiero ma zostać rozpowszechnione.
Błąd dereferencji pustego wskaźnika (null pointer dereference) występuje w kilku miejscach jądra, w tym w interfejsie Tun jądra 2.6.18 oraz 2.6.30. Sprawdzanie kodu nie wykazuje żadnych błędów, jednak jeśli do kompilacji jądra użyto GCC z włączonymi funkcjami optymalizacyjnymi, to usunie on kilka linijek kodu chroniących przed wystąpieniem błędu. W efekcie jądro w pewnych przypadkach może próbować uzyskać dostęp do zwykle niedostępnych obszarów pamięci, co atakujący może wykorzystać do uzyskania uprawnień administratora systemu. Błąd występuje tylko wówczas, gdy użytkownik systemu korzysta z rozszerzenia SELinux i gdy zainstalowane jest PulseAudio.
Luka jest najprawdopodobniej rodzajem błędu w samych założeniach projektowych, które Linux odziedziczył po Uniksie. Trwa dyskusja, w jaki sposób można zabezpieczyć użytkowników na przyszłość.
Komentarze (6)
mikroos, 20 lipca 2009, 13:38
Nie widzę w tym problemu to zmartwień. Wystarczy odwołać publikację/udostepnienie kodu źródłowego jądra. Prawdziwym powodem do zmartwień byłoby raczej wykrycie krytycznej dziury po udostępnieniu kodu i powszechnej aktualizacji jądra po stronie użytkowników.
czesiu, 20 lipca 2009, 16:19
Dla mnie wygląda to raczej na błąd optymalizacji kompilatora, ale nie będę się sprzeczał z mądrzejszymi.
Zgadzam się z mikroosem - wszystko, co twórcy muszą zrobić (poza rozwiązaniem problemu) to opóźnić wydanie nowego jądra.
Mariusz Błoński, 20 lipca 2009, 19:32
No właśnie o to się też sprzeczają. Czy błąd jest w kompilatorze czy w jądrze. Pytanie jest też, co z nim zrobić, bo z jednej strony jest poważny, z drugiej - trzeba się sporo nagimnastykować, żeby go wykorzystać. No i pojawiły się też zarzuty, że o błędzie wiadomo od baardzo dawna, ale dotychczas nic z nim nie zrobiono. Tak czy inaczej - ciekawy problem.
czesiu, 20 lipca 2009, 23:15
Akurat to jest łatwe do rozstrzygnięcia - istnieje sporo RÓŻNYCH kompilatorów c/c++, wystarczy jądro skompilować na innym kompilatorze i będzie jasne, kto zawinił.
Problem jest ciekawy z nieco innej przyczyny - zakładając, że załatany zostanie jedynie gcc jądra zbudowane starszą wersją kompilatora (wszyscy* wiemy, jak to jest z zabawą w ciągłe aktualizowanie oprogramowania) będą nadal podatne na tę lukę. Wydaje mi się, że właśnie dlatego twórcy jądra, nawet jeżeli wina leży po stronie GCC główkują, jak problem skrzętnie obejść.
*wypowiadam się sam za siebie (Usera okienek), z nadzieją, że znajdzie się choć 10 innych internautów, którzy także nie zawsze są na bieżąco z aktualizacjami oprogramowania.(czasami niedopatrzenie, czasami wynik świadomego wyboru)
Eselix, 20 lipca 2009, 23:32
Błąd jest w jądrze. Kompilator zgodnie z życzeniem zoptymalizował kod przez usunięcie niepotrzebnego sprawdzania wskaźnika. Konkretnie chodzi o taki fragment kodu:
Kompilator założył, że skoro wcześniej się z tego wskaźnika skorzystało, to nie trzeba go potem już sprawdzać. Normalnie przy próbie odwołania do nieprawidłowego wskaźnika, powinien wystąpić błąd i funkcja dalej się nie wykona, ale gdy jest zainstalowane SELinux, to błędu nie będzie, funkcja będzie się wykonywać dalej, ale już z usuniętym zabezpieczeniem.
Rozwiązaniem jest przeniesienie fragmentu sprawdzającego czy wskaźnik jest prawidłowy na sam początek, zanim skorzysta się z niego. Czyli tak jak każdy dobry programista by zrobił
Szczegóły: http://isc.sans.org/diary.html?storyid=6820
wilk, 21 lipca 2009, 00:03
Huh, faktycznie. Toż to podręcznikowy błąd podczas zabawy ze wskaźnikami.