Grsecurity

15.07.2002 20:07 | blackhole

Grsecurity je patch do linuxoveho kernela, ktory nam po zapnuti urcitych features zvysi bezpecnost.
Stiahnut si ho mozete z http://www.grsecurity.net, posledna stabilna verzia je 1.9.5 a je dostupna
pre kernely 2.4.19-rc1 a 2.4.18.

Po aplikovany patchu mame dostupne nove menu \"Grsecurity\" v configuracii kernelu(make menuconfig,..).
Na zaciatok tu mame 4 moznosti zapnutia grsecurity:
Low
Medium
High
Customized
Prve tri maju automaticky pozapinane niektore features, podla stupna zabezpecenie, ale kedze mi chceme vidiet
vsetky jednotlive featury, tak dame customized.

----- JEDNOTLIVE FEAUTRES: -----

-- Buffer Overflov Protection --
Openwall non-executable stack
tak toto netreba ani komentovat, ked zapneme tuto features, tak nam zmizne PaX protection, lebo ta robi to iste (a este viac)

PaX protection
to iste ako openwall, ale este tusim zakaze executovanie kodu aj v heap. po zapnuti PaXu mame moznost zapnut aj restrict mprotect. samozrejme, ked zapneme PaX, tak nam Openwall featura zmizne a nebudeme ju moct zapnut
za chodu systemu sa da pre jednotlive binarky povypinat a pozapinat secky featury z PaXu pomocou chpax utilitky, ktoru najdete na PaX stranke http://pageexec.virtualave.net

Randomize mmap() base
toto je skvela vec, nahodne vybere hornu adresu stacku, base adresu mmap() a base addresu dynamickych ELF programov pri kazdom spusteni
priklad na normalnom systeme:
[root@localhost ~]# cat a.c
int main(int ac,char *av[]) {
printf(\"stack: %p\\n\",av[0]);
printf(\"text: %p\\n\",&main);
}
[root@localhost ~]# gcc a.c -o a
[root@localhost ~]# ./a
stack: 0xbffff9a1
text: 0x8048490
[root@localhost ~]# ./a
stack: 0xbffff9a1
text: 0x8048490
ako vydime, stack aj base adresu mame vzdy rovnaku
priklad na systeme so zapnutim randomizovanim:
[root@localhost ~]# ./a
stack: 0xbff109b7
text: 0x8048490
[root@localhost ~]# ./a
stack: 0xbffea9b7
text: 0x8048490
uz mame randomny stack, ale nie base address. to spravime tak, ze subor skompilujeme ako spustitelny shared object
[root@localhost ~]# cat interp.c
const char __invoke_dynamic_linker__[] __attribute__ ((section (\".interp\"))) = \"/lib/ld-linux.so.2\";
[root@localhost ~]# gcc -c interp.c
[root@localhost ~]# gcc -c a.c
[root@localhost ~]# gcc -shared a.o interp.o /usr/lib/crt1.o -o a
[root@localhost ~]# ./a
stack: 0xbffef9b7
text: 0x116b19c0
[root@localhost ~]# ./a
stack: 0xbfff69b7
text: 0x89869c0

mno, uz to pekne fici :>>, ako vydime, je to uplne jednoduche, na stranke grsecurity najdeme tgz s niekolkymi patchmi na par daemonov(apache,openssh,...), ktory nam upravi zdrojaky a vysledna binarka bude spustitelny shared object Deny ioctl writes of /dev/kmem zabrani zapisovaniu do /dev/kmem tu ide o to, aby sme zabranili moznemu utocnikovy vlozit(a vykonavat) nejaky kod do kernelu utocnik ma na to 2 moznosti bud cez kernelove moduly, alebo cez /dev/kmem (prielom 17 article 2) aby sme ochranily nas linux, musime vypnut moduly a zapnut tuto feature (ked citate bugtraq, tak viete, ze sa to da obist a zapisovat priamo do pamate :[[)

-- ACL options --
ACLka popisem az na konci, tu su iba nejake somariny s logovanim a debugovanim a tak, pozrite sa sami...

-- Filesystem Protections --
Proc restrictions
uzivatelia budu mat pristup iba k adresarom so svojimy procesmy v /proc pre laikov s `ps axf` si uvidite iba svoje procesi po zapnuti tohto feature mozme nastavit special group, v ktorej budu non-root usery, ktory budu moct vydet secky procesy
Linking restrictions
uzivatelia nebudu moct nasledovat symlinky patriace inym userom v world-writeable +t adresaroch (/tmp) je to proti race exploitom
FIFO restrictions
uzivatelia nebudu moct zapisovat do rury, ktora im nepatri vo world-writeable +t adresaroch (/tmp)
Chroot jail restrictions
po zapnuti tohto feature si budete moct vybrat z mnoho nastaveni, ktore stazia alebo zabrania utocnikovy dostat
sa z chroot prostredia. napriklad \"Deny double chroot\" alebo \"Deny fchdir outside of chroot\" hovoria sami za seba
Capability restrictions within chroot
rootovske procesy v chroot klietke nemozu insertovat moduly, rebootovat, ........

-- Kernel Auditing --
tak tu mozme nastavit logovanie niektorych systemovych volani a tak, napr. exec logging, chdir logging, (un)mount logging, ipc logging, fork failure logging, ... dalej sa tu da nastavit, ze logovat sa bude iba 1 zadefinovana group

-- Executable Protections --
Exec process limiting
na normalnom systeme sa kontroluju resource limit pri forku, tymto sposobite, ze sa budu kontrolovat aj pri exec
Protect capability-aware processes
nieco s capabilitamy, resp. precitajte si to sami
Dmesg(8) restriction
non-root uzivatelia si nebudu moct dat vypisat kernelovsky log buffer pomocou `dmesg`
Randomized PIDs
cisla procesov budu nahodne generovane
Trusted path execution
tu nastavite group, ktorej usery budu moct spustat programy iba v root adresaroch a ktore su writeable iba pre roota

-- Network Protections --
Randomized *
tu su 4 feature, jedna randomizuje ID v ip hlavicke, jedna randomizuje tcp source porty (defaultne sa inkrementuju) a zbyle 2 maju neco spolocne s RPC
Altered Ping IDs
ID v icmp hlavicke echo reply je rovnake ako v echo request
Socket restrictions
tak toto je celkom zaujimava featura
Deny any sockets to group - zadate GID skupiny, ktora nebude moct sa ani connectnut, ani bindnut na nejaky port
Deny client sockets to group - GID skupiny, ktora nebude moct spustat klientske sietove programy, ale bude moct serverove
Deny server sockets to group - GID skupiny, ktora bude moct spustat klientske sietove programy, ale nie serverove
-- Sysctl support --
Sysctl support
ked je toto vypnute, tak po rebootovani kernelu budu zakompilovane feature defaultne zapnute, ale ked je toto zapnute grsec featury budu po boote vypnute a budete ich moct zapnut cez subory v /proc/sys/kernel/grsecurity
vsetky featury sa cez sysctl daju zapnut alebo vypnut pokial grsec_lock neni nastavene na nenulovu hodnotu
-- Miscellaneous Features --
tu su nejake veci proti zafloodovaniu logov
----- KONIEC FEATUR -----

----- ACLka -----
aby sme mohli robit s aclkami, musime si najskor stiahnut utilitku gradm z grsecurity stranky
po make install bude chciet heslo, toto heslo by nemalo byt to, co pouziva root, ale nejake ine,
lebo pomocou neo sa daju ACLka vypnut.
/etc/grsec/acl je hlavny subor pre ACLka
tu mame ukazku
/ {
/ rwx
/dev/mem r
/dev/kmem r
/bin rx
/sbin rx
/lib rx
/usr/lib rx
/usr/bin rx
/usr/sbin rx
/etc rx
/boot r
/etc/grsec h
/usr/X11R6/bin rx
/etc/passwd r

-CAP_SYS_RAWIO
-CAP_SYS_MODULE
}
/usr/bin/passwd {
/etc/passwd rw
}
ako vydime pomocou tohto sa daju porobit genialne nastavenie vid /etc/passwd je readonly pre secky procesy, ale /usr/bin/passwd ma pravo write a zase /usr/bin/passwd je read a execute only, takze nikdo nezmeni binarku passwd
a secky nastavenia v /etc/grsec su pomocou flagu h skrite pozrite si dokumentaciu a viacej sa s tym pohrajte sami
----- KONIEC ACLiek -----
Na zaver by som chcel napisat, ze po nainstalovani tohto patchu bude vas linux lepsie zabezpeceny, ale urcite nie
nepremozitelny. Ked si myslite, ze staci zapnut PaX a tesit sa z toho ze mame neexucutovatelni stack a heap a ze nas nikdo nehackne cez nejaky deravy demon, tak ste na omyle. Nejaky ten bug sa urcite najde (vid zapisovanie do /dev/kmem). Este by bolo dobre uvazit kombinaciu niektorych featur.
Jo a ked zapnete Sysctl support, treba pomocou ACLiek zabranit prepisaniu suboru, ktory sa spusti pri bootovani
, v ktorom mame take nieco ze echo 1 >/proc/sys/kernel/grsecurity/grsec_lock .bez zabranenia zapisu by utocnik mohol dany riadok vymazat, rebootnut pocitac a cele grsecurity je nam na nicstanojr