Bezpieczny linux - cz.1
Transkrypt
Bezpieczny linux - cz.1
Bezpieczny linux - cz.1 - Openwall Autorem projektu jest Alexander Peslyak znany bardziej jako Solar Designer, jest on twórc m.in. narz dzia John the Ripper, które umo$liwia %amanie hase% oraz dystrybucji Linuxa Owl. Jednak my zainteresujemy si jego innym dzie%em a mianowicie %atce zwi kszaj cej bezpiecze(stwo j dra systemu Linux o nazwie Openwall Na dzie( dzisiejszy wydawane s wersje dla j der serii 2.0, 2.2 oraz 2.4. Z wypowiedzi autora wynika, $e przenoszenie mechanizmów do nowego b dzie mia%o sens (najwcze/niej) dopiero po pojawieniu si wersji 2.6.20 (czyli ju$ wkrótce). Mechanizmy ochronne jakie oferuje nam Openwall: + nie wykonywalny stos (non-executable user stack area) zatrzymuje wi kszo/5 exploitów opartych na przepe%nie( bufora (ang. buffer overflow), które oparte jest na kasowaniu przez nowy zapis adresu powrotnego funkcji na stosie, by wskaza5 do jakiego/ arbitralnego kodu, który te$ jest po%o$ony na stosie. Je/li obszar stosu jest chroniony i posiada flag non-execute, podatno/ci j dra na wylew buforu staje si du$o mniejsza. Nie wykonywalny stos jest podatny tak$e na atak znany jako powrót do biblioteki libc (ang. return to libc). Polega on na utworzeniu na stosie poprawnego wywo%ania wspó%dzielonej funkcji najcz /ciej system() z parametrem /bin/sh. W rezultacie w%amywacz przekazuje sterowanie do wskazanej funkcji, która uruchamia pow%ok systemow lub wykonuje inne operacje. Openwall chroni nas przed atakiem powrotu do libc przez randomizacj adresów funkcji bibliotek dzielonych. Teraz atakuj cy nie zna ju$ adresy funkcji system() poniewa$ poszczególne segmenty pami ci i adresy funkcji dzielonych s u%o$one inaczej przy ka$dym uruchomieniu programu. + restrykcje dowi za w /tmp (restricted links in /tmp) opcja wprowadza dodatkowe zabezpieczenia katalogów z atrybutem +t (sticky bit). Pliki w takich katalogach mog tworzy5 wszyscy u$ytkownicy, lecz ka$dy mo$e modyfikowa5 i kasowa5 tylko te pliki, których jest w%a/cicielem. Typowym katalogiem tego typu jest /tmp. Opisywana opcja nie pozwala na tworzenie w takich katalogach twardych dowi za( do plików, do których nie ma si uprawnie(. U$ytkownik i tak nie móg%by pó=niej skasowa5 takich dowi za(. Istniej ataki polegaj ce na stworzeniu w katalogu /tmp dowi zania do pliku istotnego z punktu widzenia bezpiecze(stwa (np. /etc/passwd) i nadaniu mu odpowiedniej nazwy. Przewiduj c nazw pliku tymczasowego tworzonego przez proces z SUID-em, w%amywacz jest w stanie spowodowa5 nadpisanie pliku, na który wskazuje takie dowi zanie. + restrykcje kolejek FIFO w /tmp (restricted FIFOs in /tmp) opcja wprowadza dodatkowe restrykcje dotycz ce kolejek FIFO w katalogach z atrybutem +t. Po jej zaznaczeniu u$ytkownik b dzie móg% zapisywa5 dane tylko do tych kolejek, których jest w%a/cicielem. + restrykcje dla /proc (restricted /proc) ograniczenie dost pu do systemu plików /proc. Po zaznaczeniu tej opcji, u$ytkownicy inni ni$ root b d mogli zobaczy5 jedynie list w%asnych procesów. Nie b d mie5 tak$e dost pu do listy po% cze( sieciowych (netstat). Dodatkowo opcja ta uniemo$liwia korzystanie z polecenia dmesg. + wymuszenie sprawdzenia liczby limitu procesów dla execve() (enforce RLIMIT_NPROC on execve(2)) j dro umo$liwia ustalenie limitu ilo/ci procesów dla u$ytkownika poprzez wywo%anie funkcji setrlimit(). Niestety limit ten jest sprawdzany tylko podczas wywo%ywania przez procesy funkcji fork(). Je/li proces zmieni swój UID, mo$liwe jest przekroczenie ustalonego wcze/niej limitu. Nie stanowi to du$ego zagro$enia, poniewa$ UID mog zmienia5 tylko procesy uprzywilejowane, ale ma to znaczenie w przypadku programów SUID/SGID, które po wykonaniu uprzywilejowanych operacji zmieniaj swój UID na UID u$ytkownika. Funkcja fork() jest w nich zazwyczaj wywo%ywana przed zmian UID, co pozwala na omini cie ograniczenia. Zaznaczenie tej opcji zapobiega takim sytuacjom. + niszczenie nieu0ywanych obszarów pami2ci dzielonej (destroy shared memory segments not in use) opcja pozwala na ustalenie limitu pami ci wykorzystywanej przez jeden proces, ale segmenty pami ci dzielonej mog istnie5 bez przypisanego procesu, co nie zalicza ich do tego limitu. Po w% czeniu tej opcji, j dro b dzie usuwa%o segmenty pami ci dzielonej, gdy korzystaj ce z nich procesy zako(cz dzia%anie. Zabezpieczy to system przed mo$liwo/ci zape%nienia ca%ej wolnej pami ci Uwaga !Aby korzysta5 z niektórych funkcji Openwalla w po% czeniu z niektórymi wersjami biblioteki glibc oraz programów z pakietów procps lub psmisc, mo$e by5 koniczne ich zaktualizowanie. Odpowiednie patche znajdziemy w katalogu optional po rozpakowaniu Openwalla. Dodatkowo znajdziemy tam do% czone dwa programy: chstk umo$liwia wskazanie programów uprawnionych do wykonywania kodu na stosie. Ustawia on flag w nag%ówku pliku ELF, a podczas tworzenia nowego procesu system sprawdza obecno/5 flagi i nadaje jej odpowiednie uprawnienia stacktest umo$liwia przetestowanie naszego systemu czy jest podatny na ataki przepe%nienia buforu (umo$liwia sprawdzenia tak$e naszego kompilatora gcc). W standardowej instalacji Slackware wszystkie ataki s mo$liwe Kompilacja obu programów przy pomocy gcc: • • # gcc chstk.c –o chstk # gcc stacktest.c –o stacktest Przyk6adowa konfiguracja 6atki dla systemu Linux Slackware dla kernela w wersji 2.4.34 1. Jako u$ytkownik root nadajemy katalogowi /usr/src prawo dost pu tylko dla roota nie $yczymy sobie przecie$ aby jakikolwiek user podgl da% nasza konfiguracje j dra (domy/lnie ma prawo dost pu do /usr/src) a wi c wydajemy nast puj ca komend : • • # chmod 700 /usr/src # cd /usr/src 2. Pobieramy =ród%a kernela • • • • # wget http://www.kernel.org/pub/linux/kernel/v2.4/linux-2.4.34.tar.gz # tar zxf linux-2.4.34.tar.gz { rozpakowujemy } # ln -s linux-2.4.34 linux { tworzymy dowi zanie } # cd linux 3. Pobieramy patch Openwalla dla odpowiedniej wersji kernela • • # wget http://www.openwall.com/linux/linux-2.4.34-ow1.tar.gz # tar zxf linux-2.4.33-ow1.tar.gz Instalujemy %atk : • # patch -p1 < linux-2.4.34-ow1/linux-2.4.34-ow1.diff Teraz mo$emy rozpocz 5 kompilacj kernela, mamy do wyboru kilka trybów umo$liwiaj cych konfiguracj : Tekstowy: meke config b dziemy kolejno pytani o uruchamianie funkcji kernela i za% czanie ich na sta%e lub jako modu% Konsolowy: make menuconfig chyba najbardziej popularna metoda konfiguracji wykorzystuj ca bibliotek ncurses Graficzny: make xconfig wykorzystuj cy bibliotek qt, dla kde make gconfig – wykorzystuj cy bibliotek gtk, dla gnome. Uruchamiamy konfiguracj konsolow : # make menuconfig Po skonfigurowaniu w%a/ciwym parametrów naszego jajka mo$emy przej/5 do Security options gdzie znajdziemy wcze/niej opisane opcje. W przypadku, gdy stosujemy %atk na serwerze, z którego korzysta wielu u$ytkowników, zaleca si zaznaczenie wszystkich opcji. Je/li chcemy zabezpieczy5 stacj robocz , u$ywan tylko przez zaufane osoby, wystarczy, $e w% czymy jedynie non-executable user stack area. Opcja ta zabezpieczy nas przed ewentualnymi próbami wykonania kodu exploita dla programu przyjmuj cego po% czenia z zewn trz. Pozosta%e zabezpieczenia chroni przed atakami lokalnymi, które na stacji roboczej raczej nie b d mie5 miejsca. W ten sposób na pewno nie stracimy kompatybilno/ci z u$ywanymi programami i nie nast pi odczuwalne zmiany w dzia%aniu systemu. Zapisujemy konfiguracj i przyst pujemy do kompilacji j dra. • • • • • • • • • • • # make dep { tworzy wszystkie powi zania } # make clean { usuwamy zb dne /mieci z kodu } # make bzImage { kompilujemy obraz } Po skompilowaniu nasz obraz znajduje si w katalogu /usr/src/linux/arch/i386/boot/bzImage przekopiujemy go do /boot i nadamy odpowiedni nazw # cp /usr/src/linux/arch/i386/boot/bzImage /boot/linux-2.4.34-ow # make module { kompilujemy modu%y } # make modules_install { kopiuje modu%y do /lib/module/<nazwa_jajka> # cp /usr/linux/System.map /boot/System.map-2.4.34-ow { mapa systemowa } # cd /boot # rm System.map { kasujemy stara map } # ln –s System.map-2.4.34-ow System.map Kolejny krok to konfiguracja lilo, w pliku /etc/lilo.conf dodamy nast puj ce wpisy • • • • image = /boot/linux-2.4.34-ow root = /dev/hda1 label = linux-owl read-only nast pnie aby konfiguracja by%a uaktywniona nale$y prze%adowa5 lilo # lilo Uwaga ! Teraz pozostaje edycja pliku /etc/fstab w celu wskazania uprzywilejowanego u$ytkownika (za wyj tkiem roota) którego nie b d dotyczy5 restrykcje /proc. W tym celu dodamy nowego u$ytkownika i przypiszemy go do grupy o tej samej nazwie. • • # groupadd proc # useradd –g proc proc W pliku /etc/fstab zmieniamy wpis • • • proc na none /proc proc defaults 0 0 /proc proc defaults,gid=107 0 0 gdzie 107 to id grupy proc który mo$emy sprawdzi5 komend # id –g proc Warto tak$e zmieni5 wpis w /etc/inted.conf • • • auth na auth stream tcp wait root /usr/sbin/in.identd in.identd stream tcp wait proc /usr/sbin/in.identd in.identd Teraz warto dopiszemy do syslog.conf instrukcje która b dzie logowa5 próby przepe%nienia bufora i inne dopisujemy • kern.alert /var/log/openwall a nast pnie: • • • # touch /var/log/openwall { tworzymy plik } # chown root.wheel /var/log/openwall { w%a/ciciel root i grupa wheel } # chmod 640 /var/log/openwall { RW dla w%a/ciciela i R dla grupy } Uruchamiamy ponownie nasz serwer i przy bootloaderze wybieramy nasze nowe jajko je/li po testach jeste/my zadowoleni z dzia%ania i nie widzimy $adnych b% dów w pracy systemu ustawiamy w lilo aby domy/lnie uruchamia% nasze nowe j dro. # lilo –D linux-2.4.34-ow