Projekt PaX

PaX ma własną wersję Linuxowej maskotki, Tux'a.


Piotr Powałowski


PaX w skrócie - co to jest?

PaX (PAge eXecute) jest patchem na jądro Linuxa implementującym dodatkowe zabezpieczenia systemu, ograniczające możliwe wykorzystanie niedoskonałości systemu i oprogramowania pozwalających na włamania. W szczególności PaX zabezpiecza system uniemożliwiając wykonywanie kodu nie będącego częścią uruchomionego programu (np. umieszczonego w pamięci jako dane). Celem projektu PaX nie jest jednakże "łatanie" błędów implementacyjnych Linuxa czy jego poprawianie, lecz implementacja "mechanizmów obronnych" systemu przeciwdziałających i powstrzymujących włamania.

Strona główna projektu PaX: http://pax.grsecurity.net/

. Można tam odnaleźć pełną dokumentację projektu, a także PaX'owe patche na najpopularniejsze jądra Linuxa. PaX wprowadza dwa główne usprawnienia: Usprawnienia te efektywnie zabezpieczają system przed różnorakimi sposobami włamań, m.in: wynikającymi z przepełnienie bufora czy polegającymi na wykonaniu kodu zewnętrznego (ataki typu Code Injection czy return-to-libc).

Historia projektu PaX

Projekt PaX został napisany przez grupę programistów pod pseudonimem "The PaX Team". Główny auror PaX'a pragnie jednak pozostać anonimowy.

PaX stał się częścią innych projektów zorientowanych na poprawę bezpieczeństwa systemu Linux, m.in: Adamantix (Trusted Debian), GrSecurity, OpenBSD, Hardened Gentoo czy Hardened Debian.

Struktura projektu PaX

PaX zawiera implementację następujących metod:

SEGMEXEC - dokładniej

SEGMEXEC jest PaX'ową implementacją metody zabezpieczającej stron pamięci przed wykonywaniem. Wykorzystuje ona mechanizmy segmentacji stosowane dla architektury IA-32 (procesorów Intel x86). SEGMEXEC emuluje funkcjonalność NX (No eXecute) poprzez podzielenie przestrzeni adresowej użytkownika na dwie równe części. Dolna część przechowuje mapowania dostępu do danych, górna do kodu wykonywalnego. Przestrzeń jest więc dzielona na części wielkości 1.5 GB. PaX mirroruje wszystkie wykonywalne mapowania w dolnej połowie na górną. Gdy wywoływana jest instrukcja fetch odwołująca się do dolnej części (segmentu danych), jej adres docelowy jest tłumaczony na mirror. Jeśli w mirrorze kod do wykonania nie jest mapowany, proces jest zabijany.

Pomimo iż SEGMEXEC dzieli przestrzeń adresową na pół, wydajność emulacji wzrasta, jeżeli jest ona wykonywana w architekturze IA-32 (x86). Ponadto, warto zaznaczyć że mapowanie w górnej i dolnej części podziału odwołuje się do tej samej pamięci fizycznej, przez co nie wykorzystuje dwukrotnie większej ilości pamięci RAM.

Według tego samego schematu działa również metoda KERNEXEC, z tą różnicą iż jest ona przeznaczona wyłącznie dla jądra.

Wymieniona wcześniej metoda PAGEEXEC była pierwszą implementacją funkcjonalności NX. Jednakże dla architekury x86 została wyparta przez SEGMEXEC.

ASRL - dokładniej

ASRL (Adress Space Layout Randomization) ma za zadanie wprowadzenie losowości w adresach wykorzystywanych przez proces, m.in. w położeniu stosu, kodu plików bibliotek, kodu wykonywalnego, stosu i innych. Ważnym jest, aby względne rozmieszczenie tych adresów było od siebie niezależne i różne dla różnych uruchomień procesu. Pozwala to na zabezpieczenie systemu przed atakami typu ret2libc czy uruchamianiem kodu wykorzusując obce dane (execute existing code in original program order with arbitrary data).

Oto przykład rozdysponowania pamięci prosesu przy zastosowaniu ASRL:

Zielonym kolorem oznaczono pamięć z prawami do zapisu, niebieskim wykonywalną. Przy ponownym uruchomieniu proceu otrzymujemy zupełnie inne rozmieszczenie:

Do losowania położenia w pamięci stosuje się randomizację jedynie "środkowych" bitów adresu. Bity najbardziej i najmniej znaczące pozostają niezmienione. W architekturze 32 bitowej (i386) losuje się więc odpowiednio: Oczywiście dla innych architektur liczby te są inne. W szczególności dla komputerów 64 bitowych są one większe, lecz nie dwukrotnie.

W analogiczny sposób działają metody RANDUSTACK oraz RANDUSTACK.

Możliwe typy włamań i ich interakcja z PaX'em

PaX wyróżnia i stara się zabezpieczyć system przed trzema typami włamań: Dla przykładu atak typu return-to-libc zalicza się do drugiej kategorii.

Wymienione powyżej metody zabezpieczania systemu zmniejszają szanse wystąpienia powyższych. Użycie ASRL niweluje możliwość wystąpienia ataków drugiego i trzeciego rodzaju, gdyż wymagają one znajomości względnego rozmieszczenia wykorzystywanych przez proces fragmentów pamięci (np. w celu zmiany wskaźnika powrotu na stosie (2) czy danych wykorzystywanych przez proces (3)). Oczywiście możliwe jest odgadnięcie położenia interesujących atakującego danych lub dokonanie ataku siłowego, lecz przy dobranej losowości szanse jego powodzenia są zerowe, a niepowodzenie w większości przypadków doprowadzi do crashu systemu. Pax dzięki zastosowaniu SEGMEXEC oraz mirroringowi VMA generalnie uniemożliwia ataki typu pierwszego.

Należy jednak zaznaczyć, iż każdy z tych ataków ma szansę się powieść, zależnie od wiedzy i potrzebnych zasobów atakującego:

PaX - problemy

Niestety okazuje się, iż niektóre programy wymagają dostępu do pamięci w sposób blokowany przez PaX,a lub bazują na założeniach, które przy jego działaniu okazują się nie być prawdziwe. Przykładowo korzystają ze stałych czy przewidywanych zależności w przestrzeni adresowej, bądź podejmują próby wygenerowania kodu, który jest wykonywany poza pamięcią. PaX naturalnie nie pozwoli na takie zachowanie i natychmiast zakończy działanie występnego programu.

Najbardziej godne uwagi z tego rodzaju aplikacji, wydają się XFree, Xorg, mpalyer i narzędzia dla multimediów oparte o xine-lib. Najprostszy sposób na rozwiązanie problemów to wyłączenie zabezpieczeń PaX. Służy do tego narzędzie 'chpax' (jako część systemu PaX), pozwalające na kontrolowanie rozmaitych zabezpieczeń stosowanych przez PaX'a. Podczas instalacji pakietu chpax, instalowany jest również standardowy skrypt init/conf.d, który ze względu na dobrze znane problemy, ustawia uzasadnione opcje domyślne. Chcąc włączyć ustawianie tych uprawnień, przy każdym uruchomieniu systemu, należy wykonać następującą komendę:
emerge chpax ; rc-update add chpax default ; /etc/inid.d/chpax start.


W systemie Gentoo istnieje jeszcze inne narzędzie służące do kontroli nad PaX'em - paxctl. Pozwala ono na wyłączanie/włączanie ochrony dla poszczególnych plików wykonywalnych.

Linki