Gentoo Logo

Krótkie wprowadzenie do PaX w Gentoo Hardened

Spis treści:

1.  Czym jest Gentoo Hardened?

Gentoo Hardened to projekt mający na celu ulepszenie zabezpieczeń systemów opartych o Gentoo. Prezentujemy kilka różnorodnych rozwiązań, które można dostosować do własnych potrzeb. W sercu typowej konfiguracji Gentoo Hardened znajduje się PaX.

2.  Czym jest PaX?

PaX jest łatą na linuksowy kernel, która ulepsza zabezpieczenia w dwojaki sposób.

Pierwszy z nich, ASLR (Address Space Layout Randomization - losowy rozkład przestrzeni adresowej) dostarcza środków do wprowadzenia losowości do schematu adresowania wszystkich danych, które są ładowane do pamięci. Kiedy aplikacja jest budowana jako PIE (Position Independent Executable - binaria z możliwością relokacji kodu), to dodatkowo PaX jest w stanie wygenerować losowy adres bazowy dla aplikacji.

Drugie zabezpieczenie wprowadzone przez PaX stanowi pamięć z atrybutem NX (kod zawarty w takim obszarze pamięci, nie może być wykonywany). Zapobiega to popularnej formie ataku, kiedy to agresor wstawia kod wykonywalny do pamięci. Więcej informacji na temat PaX można znaleźć w niniejszym przewodniku, natomiast strona domowa znajduje się pod adresem http://pax.grsecurity.net.

3.  Wprowadzenie do PIE i SSP

Jak już wspomniano powyżej, PaX jest uzupełniany przez PIE. Ta metoda budowania plików wykonywalnych przechowuje informacje potrzebne do relokacji części binariów w pamięci, stąd nazwa Position Independent (niezależność od pozycji).

SSP (Stack Smashing Protector) jest drugą uzupełniającą technologią, którą wprowadzamy podczas budowania binariów. Po raz pierwszy SSP zostało przedstawione przez IBM pod nazwą ProPolice. Rozwiązanie polegało na modyfikacji kompilatora C tak, aby do funkcji tworzących bufory w pamięci dodawany był kod inicjalizujący.

Uwaga: W nowszych wersjach SSP, możliwe jest zastosowanie SSP do wszystkich funkcji, wliczając w to ochronę funkcji, dla których rozmiar bufora jest zazwyczaj mniejszy niż limit ustalony dla SSP. Jest to włączane przez flagę CFLAG -fstack-protector-all.

W trakcie działania programu, podczas tworzenie bufora, SSP dodaje na końcu bufora, sekretną wartość losową, tzw. znacznik. Kiedy funkcja kończy działanie, SSP sprawdza, czy znacznik jest nietknięty. Jeśli agresor próbowałby przepełnić bufor, to nadpisałby wartość znacznika i tym samym wyzwolił funkcję ochrony stosu. Obecnie funkcja ta zabija docelowy proces.

Dalsza lektura na temat SSP.

4.  Budowanie kernela ze wsparciem dla PaX

Kilka z kerneli oferowanych w Gentoo posiada już PaX.

Dla komputerów opartych o jądra w wersji 2.4 i2.6 zaleca się użycie kerneli z pakietu hardened-sources.

Wybieramy jeden z zalecanych kerneli lub aplikujemy na nasz kernel, odpowiednią łatę ze strony http://pax.grsecurity.net, a następnie przeprowadzamy standardową konfigurację.

W sekcji Security Options -> PaX zaznaczamy poniższe opcje.

Listing 4.1: Konfiguracja kernela

[*] Enable various PaX features

PaX Control ->

 [ ] Support soft mode
 [*] Use legacy ELF header marking
 [*] Use ELF program header marking
     MAC system integration (none)  --->

Non-executable page ->

 [*] Enforce non-executable pages
 [*] Paging based non-executable pages
 [*] Segmentation based non-executable pages
 [*] Emulate trampolines
 [*] Restrict mprotect()
 [ ] Disallow ELF text relocations

Address Space Layout Randomization ->

 [*] Address Space Layout Randomization
 [*] Randomize kernel stack base
 [*] Randomize user stack base
 [*] Randomize mmap() base
 [*] Randomize ET_EXEC base

Budujemy standardowo kernel i umieszczamy go w katalogu /boot.

5.  Budowanie przestrzeni użytkownika z włączonym PIE/SSP

Gentoo Hardened dostarcza wsparcia dla przezroczystego budowania binariów z PIE/SPP poprzez plik specyfikacji GCC. Oznacza to, że użytkownicy aktualizujący starsze wersje instalacji Hardened, powinni usunąć flagi LDFLAGS lub CFLAGS, które wyzwalały PIE/SSP. Ponadto pakiet hardened-gcc jest teraz przestarzały i powinien zostać odinstalowany (wersja 5.0 jest pakietem atrapą). Jeśli chcemy mieć aktualne GCC, to dodajemy USE="hardened pic" do pliku /etc/make.conf, o ile nie używamy profilu hardened.

Dla utrzymanie spójnego toolchaina, na początku wykonujemy polecenie emerge binutils gcc virtual/libc. Następnie musimy przebudować cały system poleceniem emerge -e world. Wszystkie później instalowane pakiety zostaną zbudowane z PIE/SSP.

Ostrzeżenie: PIE i SSP są znane z tego, że powodują problemy przy niektórych pakietach. Jeśli napotkamy problem z kompilacją pakietu, powinniśmy zgłosić szczegółowy raport błędu (zawierający log z kompilacji oraz wynik polecenia emerge info) na stronie http://bugs.gentoo.org/.

Możliwe, że będziemy chcieli zainstalować pakiet pax-utils. Często ELF posiada relokacje w segmencie text i może to być przyczyną problemów. scanelf -BRylptq

6.  Kiedy zacznie się źle dziać (kontrolowanie PaX)

Czasem aplikacje w trakcie działania 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.

Uwaga: 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.

Na szczęście istnieje narzędzie pozwalające na wyłączanie/włączanie ochrony dla poszczególnych plików wykonywalnych. Jest to paxctl, który instalujemy tak jak każdy inny pakiet w Gentoo, emerge paxctl. Sposób użycia pokazywany jest po wydaniu polecenia paxctl -h.

Uwaga: Jeśli posiadamy starszą wersję pakietu binutils, to będziemy musieli skorzystać z programu chpax, który modyfikuje starsze znaczniki PaX. Korzystanie z chpax jest w dużej mierze podobne do paxctl. Dodatkowo wymagane jest wsparcie kernela dla zapisu znaczników. Nowa wersja paxctl sprawia, że chpax jest przestarzałe.

Listing 6.1: paxctl -h

usage: paxctl <options> <files>

options:
        -p: disable PAGEEXEC            -P: enable PAGEEXEC
        -e: disable EMUTRMAP            -E: enable EMUTRMAP
        -m: disable MPROTECT            -M: enable MPROTECT
        -r: disable RANDMMAP            -R: enable RANDMMAP
        -x: disable RANDEXEC            -X: enable RANDEXEC
        -s: disable SEGMEXEC            -S: enable SEGMEXEC

        -v: view flags                  -z: restore default flags
        -q: suppress error messages     -Q: report flags in short format flags

Pierwszą opcją, jaką zaprezentujemy jest -v, która wyświetla ustawione flagi dla wskazanego pliku wykonywalnego.

Listing 6.2: paxctl -v

shell user # paxctl -v /usr/bin/Xorg
PaX control v0.2
Copyright 2004 PaX Team <pageexec@freemail.hu>

- PaX flags: -p-sM--x-eR- [/usr/bin/Xorg]
        PAGEEXEC is disabled
        SEGMEXEC is disabled
        MPROTECT is enabled
        RANDEXEC is disabled
        EMUTRAMP is disabled
        RANDMMAP is enabled

Powyższa komenda pokazuje, że dla pliku Xorg wszystkie zabezpieczenia są wyłączone.

Do ustawienia flag na pliku binarnym korzystamy z opcji -z, która przywraca domyślne flagi.

By wyłączyć zabezpieczenia dla Xorg wykonujemy polecenie paxctl -zpeMRxs /usr/bin/Xorg.

Próbujemy włączać/wyłączać zabezpieczenia, by zobaczyć jaki zestaw opcji pozwoli na działanie programu. Często zdarza się, że potrzebna jest kombinacja opcji -m i -sp.



Drukuj

Zaktualizowano 11 września 2007

Podsumowanie: Krótkie omówienie PaX i Gento Hardened.

Brandon Hale
Autor

Blackace
Redaktor

solar
Redaktor

Paweł Kwiatkowski
Tłumacz

Donate to support our development efforts.

Copyright 2001-2014 Gentoo Foundation, Inc. Questions, Comments? Contact us.