Krótkie wprowadzenie do PaX w Gentoo Hardened
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.
Materiał udostępniany na podstawie licencji Creative Commons -
Attribution / Share Alike.
|