OpenBSD
Transkrypt
OpenBSD
– zapobieganie – autorzy OpenBSD stawiają sobie za cel nacisk na poprawianie w kodzie pomyłek, jeszcze zanim (o ile w ogóle) zostanie znaleziony sposób na ich wykorzystanie w celu dokonania ataku na system. Dzięki takiemu podejściu, w dyskusjach dotyczących tropienia zagrożeń bezpieczeństwa można spotkać komentarze typu: “ten problem został rozwiązany w OpenBSD pół roku temu”. polityka jawności – w OpenBSD duży nacisk kładzie się na oficjalne ujawnianie odkrytych pomyłek, wraz z publikacją poprawek (ich sprawna dystrybucja i stosowanie jest możliwe dzięki “errata & patch page”, gdzie publikowane są poprawki dotyczące tak wspólnej dla wszystkich architektur części kodu, jak i zagadnień specyficznych). Publicznie dostępna jest też cała grupa list mailingowych, które powiadamiają o różnych rodzajach poprawek (o różnych stopniach ważności) dotyczących O – – Packet Filter – Od wersji 3.0 OpenBSD w głównej gałęzi projektu za bezpieczeństwo łączności sieciowej systemu odpowiada Packet Filter, który jest zaawansowanym narzędziem udostępniającym możliwość szczegółowej konfiguracji zachowania interfejsów sieciowych (funkcje firewalla), priorytetów ruchu, ograniczeń pasma, itd. OpenBSD nie stawia – jak często to robi konkurencja – na “łatwość” konfiguracji interfejsów sieciowych (np przy pomocy narzędzi graficznych), lecz na elastyczność konfiguracji (np poprzez istnienie makr dla PF, itp). Pseudo Random Number Generator – generowanie nieprzewidywalnych liczb pseudolosowych jest ważnym zagadnieniem dla bezpieczeństwa. Jądro OpenBSD korzysta przy generowaniu takich liczb z wielu źródeł entropii, takich jak czasy wystąpienia przerwania myszy, czasy związane z nadejściem pakietów sieciowych, czasy naciskania klawiszy, itp. Stosowanie uzyskanych w ten sposób pseudolosowych liczb w systemie operacyjnym jest istotne dla bezpieczeństwa, i tak OpenBSD kładzie ogromny nacisk na używanie losowych PIDów, losowych identyfikatorów datagramów IP, nazw plików tymczasowych, elementów losowości przy alokacji pamięci, itp, itd. nowe funkcje kryptograficzne – oprócz klasycznych już dziś funkcji crypt oraz md5, OpenBSD może używać do haszowania haseł także funkcji bcrypt, która korzysta z udoskonalonej wersji szyfru blowfish – tzw. eksblowfish (expensive key setup blowfish). W przeciwieństwie do poprzedników, bcrypt pozwala na regulowanie “siły” zaszyfrowania hasła, tak by potrzebne do jego rozgryzienia moce obliczeniowe mogły być zwiększane na bieżąco, wraz z wzrostem wydajności systemów komputerowych. I tak, OpenBSD – na dzień dzisiejszy – przyjmuje dla standardowych użytkowników siłę kodowania hasła na poziomie “szóstym”, zaś dla administratora – już na poziomie “ósmym”. wsparcie hardware'owe – OpenBSD udostępnia możliwość korzystania ze sprzętowego wsparcia szyfrowania, głównie dzięki obsłudze zewnętrznych generatorów liczb (pseudo)losowych, a także zastosowaniu kryptograficznych kart sieciowych. Mechanizmy nieco bardziej “wewnętrzne”: – – ProPolice – od wersji 3.3 OpenBSD wspiera mechanizm zapobiegania przepełnieniu buforów, a właściwie zapobiegania wykorzystaniu przepełnienia buforów do uruchomienia szkodliwego kodu. Aby skorzystać z tego udogodnienia, użytkownicy powinni kompilować programy przy pomocy przygotowanego do skorzystania z ProPolice kompilatora, lub korzystać z wersji binarnych dystrybuowanych z OpenBSD, przygotowanych do tego rodzaju zabezpieczenia. – – ulepszone koncepcje strcpy() i strcat() - częstym miejscem, w którym występują problemy z przepełnieniem bufora, jest użycie jednej z tych funkcji – problematyczna jest zawsze długość kopiowanego lub zlepianego łańcucha i występowanie znacznika jego zakończenia. Programiści najczęściej usiłują radzić sobie z tym korzystając z funkcji strncpy() oraz strncat(), które jako jeden z parametrów przyjmują ilość znaków, na jakich ma być przeprowadzona operacja. Takie postępowanie wymaga jednak pewnego nakładu pracy programistycznej, a ponadto te funkcje w niektórych przypadkach znacząco spowalniają pracę systemu (z powodu zerowania wszystkich niewykorzystanych miejsc w pamięci, a nie tylko ustawieniu znacznika końca łańcucha). Kod używający tych funkcji wygląda czasem dość niezrozumiale, a jego zrozumienie sprawia wrażenie zadania karkołomnego. – – Aby poradzić sobie z tym problemem, zespół OpenBSD opracował funkcje strlcpy() oraz strlcat(), dobrze przemyślane pod kątem uproszczenia programowania. Jako dodatkowy parametr przyjmują one rozmiar bufora, na którym chcemy operować i zwalniają programistę z konieczności niezależnego dodania znacznika końca łańcucha już po wywołaniu funkcji na tym łańcuchu operującej. – – – Więcej na ten temat w dokumencie http://www.openbsd.org/papers/strlcpy-paper.ps – – bezpieczniejszy dostęp do pamięci – zabezpieczenia na poziomie stron (page-level memory permissions): dana strona może zostać oznakowana jako wykonywalna lub zapisywalna, ale nigdy jedno i drugie jednocześnie. Dzięki temu potencjalny intruz nie skorzysta już tak łatwo z możliwości zapisania, a następnie uruchomienia szkodliwego kodu. To zabezpieczenie jest dostępne na niektórych architekturach, na których działa OpenBSD. – – szyfrowanie pamięci wirtualnej – przydatną z punktu widzenia bezpieczeństwa danych funkcjonalnością udostępnianą przez OpenBSD jest szyfrowanie pamięci wirtualnej. Cóż po zabezpieczeniu dysku przez szyfrowanie systemu plików, gdyby istotne dane były ładowane do niezabezpieczonej pamięci wirtualnej? Mogłyby zostać odczytane np po wyłączeniu systemu. W pewnych przypadkach istotne dane z pamięci witrualnej, jak hasła, itp, mogłyby przetrwać na dysku nawet restart systemu. Nieszczęściom, które mogłyby wyniknąć z takiego przebiegu spraw, zapobiegnie szyfrowanie pamięci wirtualnej. Ulotne klucze są generowane dzięki sprawnym mechanizmom pseudolosowości, i zapominane, kiedy tylko nie są potrzebne. – Szczegółową analizę zagadnienia można znaleźć w dokumencie http://www.openbsd.org/papers/swapencrypt.ps