Gentoo Logo

Gentoo Hardened - często zadawane pytania

Spis treści:

1.  Pytania

Ogólne

PaX

grsecurity

RSBAC

SELinux

2.  Pytania ogólne

Co to jest "toolchain"?

Termin "toolchain" odnosi się do zbioru pakietów oprogramowania, który jest wykorzystywany do rozwijania i budowania aplikacji na konkretną architekturę sprzętową. "Toolchain" o którym można usłyszeć na kanale IRC #gentoo-hardened, składa się z GNU Compiler Collection (GCC), pakietu binutils oraz biblioteki GNU C (glibc).

Z czego korzystać: grsecurity, RSBAC czy SELinux?

Odpowiedź na to pytanie jest wysoce subiektywna. Projekt Gentoo Hardened wskazuje różne rozwiązania, natomiast wybór należy do użytkowników. Decyzja wymaga analizy, którą - mamy nadzieję - ułatwi niniejsza dokumentacja. Jeśli jednak rodzą się konkretne pytania dotyczące modelu bezpieczeństwa wprowadzanego przez każde z rozwiązań, to zachęcamy do skorzystania z listy mailingowej oraz do zadawania pytań odpowiednim deweloperom.

Czy jest możliwe jednoczesne korzystanie z grsecurity, SELinux oraz PaX?

Tak, taka kombinacja jest możliwa gdyż PaX pracuje zarówno z grsecurity, RSBAC jak i SELinux. Jedyny konflikt jaki może mieć miejsce ma swoje źródło w tym, że możemy korzystać tylko z jednego systemu kontroli dostępu.

Czy należy dodać jakieś flagi do LDFLAGS/CFLAGS, aby włączyć kompilację z PIE/SSP?

Nie. Obecny "toolchain" automatycznie dostarcza odpowiednik CFLAGS="-fPIE -fstack-protector-all" LDFLAGS="-Wl,-z,now -Wl,-z,relro", poprzez pliki specyfikacji GCC (ang. specfile). Jest to lepsze rozwiązanie niż flagi. W przypadku, gdy korzystamy ze starszej wersji hardened-gcc musimy dodać USE="hardened pic" do pliku /etc/make.conf, a następnie wykonać aktualizację przy użyciu poleceń:

Listing 2.1: Instalacja toolchain w wersji hardened

# emerge --oneshot binutils gcc virtual/libc
# emerge -e world

Uwaga: Gentoo stosuje patche do GCC, które umożliwiają przekazanie pliku specyfikacji poprzez zmienną środowiskową. Obecnie w Gentoo instalowanych jest kilka zestawów plików specyfiakcji, co pozwala użytkownikom obsługiwanych architektur łatwo włączać i wyłączać funkcjonalności toolchain. Użytkownicy końcowi mogą uzyskać dostęp do plików specyfikacji wykorzystując narzędzie gcc-config.

Jak wyłączyć kompilację z PIE/SSP?

Możemy tego dokonać używając programu gcc-config:

Listing 2.2: Przykładowy wynik polecenia gcc-config -l

# gcc-config -l
[1] i686-pc-linux-gnu-3.4.4 *
[2] i686-pc-linux-gnu-3.4.4-hardenednopie
[3] i686-pc-linux-gnu-3.4.4-hardenednopiessp
[4] i686-pc-linux-gnu-3.4.4-hardenednossp
[5] i686-pc-linux-gnu-3.4.4-vanilla

Kompilację bez wykorzystywania SSP wybierzemy przełączając się na profil hardenednossp:
# gcc-config i686-pc-linux-gnu-3.4.4-hardenednossp

Możemy również zmienić nasze flagi CFLAGS:

Standardową opcję SSP dla budowania binariów można wyłączyć przez dodanie -fno-stack-protector-all -fno-stack-protector do zmiennej CFLAGS.

Jeśli chcemy wyłączyć domyślną opcję PIE, to dodajemy -nopie do naszej zmiennej CFLAGS.

Ważne: Flaga -fno-pic nie powinna być używana, gdyż powoduje to generowanie kodu non-PIC (opcja -fpic generuje kod niezależny od pozycji, tzn. wszystkie statyczne adresy w obrębie kodu są otrzymywane z tzw. globalnej tablicy wskaźników. Ustawienie -fno-pic powoduje, że globalna tablica wskaźników nie jest wykorzystywana - przyp. tłum.). Powrót do standardowego zachowania GCC uzyskujemy poprzez flagę -nopie.

Uwaga: Jeśli dla każdego pakietu w Portage chcemy korzystać z osobnych ustawień CFLAGS, to warto zapoznać się ze skryptem, przygotowanym przez solara, który został stworzony do tego celu: http://article.gmane.org/gmane.linux.gentoo.hardened/1204.

Proces budowy kernela zostaje przerwany i pojawia się błąd "error: structure has no member named `curr_ip'", jak to naprawić?

Aby móc korzystać z PaX w pakiecie hardened-sources, musimy włączyć obsługę grsecurity w kernelu. W przyszłej wersji powinno to zostać naprawione.

Dopiero poznaję Gentoo Hardened. Czy muszę zainstalować wszystko co zostało wymienione na stronie projektu, by mieć Gentoo w wersji hardened?

Nie. Gentoo Harened jest zbiorem podprojektów, które mają wspólne założenia odnośnie bezpieczeństwa. Wiele z nich może być zainstalowana wspólnie z innymi. Niektóre powodują konflikty, jak np. kilka implementacji list kontroli dostępu (ACL) oferowanych przez projekt Gentoo Hardened.

Dlaczego programy nie działają jeśli korzysta się z CFLAGS="-O3" i gcc hardened?

W niektórych sytuacjach równoczesne używanie flagi -O3 i SSP (ang. stack-smashing protector) powoduje problemy. Flaga -O3 nie jest oficjalnie wspierana i dlatego zespół projektu Hardened odradza jej wykorzystywanie. Raporty problemów, zgłaszane przez użytkowników korzystających z CFLAGS="-O3", będą zamykane ze statusem INVALID/CANTFIX i/lub ignorowane.

Co się stało z bootstrap-cascade.sh?

Stare wersje bootstrap.sh i bootstrap-2.6.sh stały się nieaktualne i zastąpiono je przez bootstrap-cascade.sh. Następnie zmieniono nazwę skryptu bootstrap-cascade.sh na bootstrap.sh.

Jak przełączyć się na profil hardened?

Listing 2.3: Ustawiamy make.profile

# cd /etc
# rm make.profile
# ln -s ../usr/portage/profiles/hardened/x86 make.profile (Jądra serii 2.4)
# ln -s ../usr/portage/profiles/hardened/x86/2.6 make.profile (Jadra serii 2.6)

Po zmianie profilu należy przekompilować system korzystając z toolchain w wersji hardened, tak by mieć spójny system podstawowy:

Listing 2.4: Przełączenie na toolchain w wersji hardened

# emerge --oneshot binutils gcc virtual/libc
# emerge -e world

Jak należy debugować z gdb?

Pierwszym problemem jest fakt, że GDB nie jest w stanie określić symboli w PIE, gdyż nie wie, że adresy w PIE są względne, a nie bezwzględne. Ujawnia się to, gdy staramy się prześledzić działanie programu i widzimy ciąg linii ze znakami '??' w miejscach, gdzie powinny znajdować się symbole.

Aby obejść ten problem, należy ostatni etap łączenia programu przeprowadzić z opcją -nopie. Wszystkie wcześniejsze etapy mogą być przeprowadzane tak jak zawsze z opcją -fPIE (jest to domyślny sposób w przypadku kompilatora hardenend). W ten sposób plik wykonywalny jest jak najbardziej bliski prawdziwemu obiektowi, jednak ostatnie dowiązanie tworzy regularny plik wykonywalny. Flagę -nopie można dodać do zmiennej LDFLAGS, jeśli budujemy pakiety przy pomocy emerge.

Innym sposobem rozwiązania tego problemu jest instalacja =sys-devel/gdb-6.3-r5, paczka ta daje możliwość debugowania binarek zlinkowanych z -pie.

Drugą pułapką jest potencjalne uniemożliwienia przez PAX ustawienia punktów kontrolnych GDB, zależnie od tego jak skonfigurowane jest jądro. Dotyczy to również punktu kontrolnego ustawionego na funkcji main, którego potrzebujemy, aby cokolwiek rozpocząć. Aby zapobiec takiemu działaniu PaX-a, plik wykonywalny, który poddajemy debugowaniu musi posiadać flagi 'm' i 'x'. Flaga 'x' ustawiana jest domyślnie, więc wystarczy wydać jedynie poniższe polecenie:

Listing 2.5: Ustawianie PaX-a do debugowania

# /sbin/paxtcl -m foo

W tym momencie wszystko powinno być ustawione i gotowe do pracy. GDB uruchamiamy w normalny sposób. Powodzenia w debugowaniu!

3.  Pytania dotyczące PaX

Jaki jest adres strony domowej PaX?

Strona domowa PaX znajduje się pod adresem http://pax.grsecurity.net.

Czy istnieje jakaś dokumentacja Gentoo dotycząca PaX?

Obecnie jedyną dokumentacją Gentoo dotyczącą PaX jest krótki przewodnik po PaX, dostępny na stronie http://www.gentoo.org/proj/pl/hardened/pax-quickstart.xml.

Bez przerwy pojawia się komunikat: "error while loading shared libraries: cannot make segment writable for relocation: Permission denied". Co to oznacza?

Informacja o błędzie pojawia się wtedy, gdy włączymy CONFIG_PAX_NOELFRELOCS w następujący sposób:

Listing 3.1: Opcje w menuconfig

Non-executable page ->

 [*]   Disallow ELF text relocations

Jeśli korzystamy z "toolchain" w wersji hardened, to zazwyczaj podczas kompilacji powstają biblioteki ELF z opcją PIC, nie zawierające relokacji sekcji text (text jest jedną z sekcji pliku binarnego ELF - przyp. tłum.). Jednakże z różnych powodów, niektóre biblioteki nadal zawierają relokacje tej sekcji (są to najczęściej te, które zawierają nieprawidłowo obsługiwane fragmenty). Może to stanowić lukę w zabezpieczeniach, gdyż potencjalny agresor może wykorzystać biblioteki skompilowane z opcją non-PIC do wykonania swojego shellcode. Biblioteki z opcją non-PIC mają także niepożądany wpływ na zużycie pamięci, ponieważ podważają sens istnienia bibliotek współdzielonych.

Możemy pozbyć się tego błędu i pozwolić by program działał, lecz musimy poświęcić bezpieczeństwo, pozwalając na generowanie kodu w trakcie działania programu. Opcja PaX, która to umożliwia nazywa się MPROTECT. Należy wyłączyć MPROTECT dla każdego pliku wykonywalnego, który korzysta z bibliotek skompilowanych z non-PIC.

Aby sprawdzić, czy w naszym systemie znajdują się biblioteki zawierające relokacje sekcji text, możemy wykorzystać program scanelf z pakietu app-misc/pax-utils. Więcej informacji o używaniu pakietu pax-utils znajdziemy w dokumencie Gentoo PaX Utilities Guide.

Uwaga: Nowsze wersje sys-apps/portage (>=2.0.53) sprawdzają biblioteki pod względem występowania relokacji sekcji text i wyświetlają ostrzeżenia lub nawet przerywają proces budowania programu. Zachowanie Portage zależy od ustawień zmiennej FEATURES w pliku /etc/make.conf.

Dlaczego Java nie działa z PaX?

Wirtualna maszyna Javy przy każdym uruchomieniu generuje znaczną ilość kodu, co nie wpływa na PaX zbyt dobrze. Istnieją dwa rozwiązania problemu:

Listing 3.2: Instalacja chpax

# emerge chpax
# /etc/init.d/chpax start

Jeśli już posiadamy program chpax, możemy wykonać polecenie:

Listing 3.3: Opcja chpax dla java

# chpax -pemrxs /opt/*-jdk-*/{jre,}/bin/*

Obydwie opcje lekko modyfikują nagłówek ELF, tak by było możliwe ustawienia flag PAX na binariach.

Uwaga: Jeśli używamy PaX w połączeniu z dodatkowymi mechanizmami bezpieczeństwa, takimi jak RSBAC, grsecurity lub SELinux, to powinniśmy zarządzać PaXem przy użyciu dowiązań do funkcji kernela (ang. kernel hook), dostarczonych z każdą implementacją.

Poniższą komendą można przy włączonym RSBAC poetykietować wszystkie pliki Javy.

Listing 3.4: Opcje PaX dla Javy, przy włączonym RSBAC

# for i in $(ls /opt/*(jdk|sdk)*/{jre,}/bin/*);do attr_set_file_dir FILE $i pax_flags pmerxs;done

4.  Pytania dotyczące grsecurity

Jaki jest adres strony domowej grsecurity?

Strona domowa grsecurity znajduje się pod adresem http://www.grsecurity.net.

Czy istnieje jakaś dokumentacja Gentoo dotycząca grsecurity?

Najbardziej aktualną dokumentacją na temat grsecurity jest krótki przewodnik po Grsecurity2, znajdujący się pod adresem http://www.gentoo.org/proj/en/hardened/grsecurity.xml.

Czy można używać grsecurity z kernelami 2.6.8, 2.6.8.1 albo 2.6.9?

W związku ze znacznymi zmianami w kernelu 2.6.8, które uniemożliwiły obsługę PaX, poprawki PaX i grsecurity dla wersji 2.6.8, 2.6.8.1 i 2.6.9 nie są dostępne. Mimo istnienia eksperymentalnej poprawki na kernel 2.6.10, przed jej użyciem należy zapoznać się z oficjalnym stanowiskiem zespołu tworzącego PaX odnośnie serii 2.6: http://forums.grsecurity.net./viewtopic.php?t=968.

5.  Pytania dotyczące RSBAC

Jaki jest adres strony domowej RSBAC?

Strona domowa RSBAC znajduje się pod adresem http://www.rsbac.org.

Czy istnieje jakaś dokumentacja Gentoo, dotycząca RSBAC?

Cała dokumentacja Gentoo dotycząca RSBAC znajduje się na stronie podprojektu RSBAC, dostępnej pod adresem: http://www.gentoo.org/proj/en/hardened/rsbac/index.xml

Ponadto podręcznik RSBAC, dostępny pod adresem http://www.rsbac.org/documentation/rsbac_handbook, stanowi źródło niezwiązanych bezpośrednio z Gentoo informacji o tym projekcie.

Jak można korzystać ze startowego dysku RAM, gdy posiadamy kernel z włączonym RSBAC?

W kernelach z włączonym RSBAC, by używać startowego dysku RAM należy zaznaczyć specjalną opcję, która zapobiega traktowaniu initrd jako głównego urządzenia ([ang.] root device).

Listing 5.1: Opcje w menuconfig

General RSBAC options  --->
    [*] Delayed init for initial ramdisk

6.  Pytania dotyczące SELinux

Gdzie można znaleźć listę odpowiedzi na często zadawane pytania dotyczące SELinux?

Odpowiedzi na często zadawane pytania dotyczące SELinux można znaleźć w Podręczniku SELinux.



Drukuj

Zaktualizowano 18 lutego 2006

Podsumowanie: Ten dokument to zbiór pytań i odpowiedzi jakie często pojawiają się na kanale IRC #gentoo-hardened oraz na liście mailingowej gentoo-hardened.

Adam Mondl
Autor

solar
Redaktor

Guillaume Destuynder
Redaktor

The PaX Team
Redaktor

Paweł Kwiatkowski
Tłumaczenie

Waldemar Korłub
Tłumaczenie

Donate to support our development efforts.

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