Grsecurity

A HupWiki-ből...

GR = eredetileg "Get Rewted"

Egy teljeskörű Linux-rendszermag folt a biztonsági problémák észlelésére, megelőzésére és beazonosítására. Használata kis időráfordítást igényel. Nemcsak ajánlott, hanem kötelező, nemcsak saját magad, hanem mások érdekében is. (Természetesen semmilyen védelem sem nyújt teljes biztonságot a szoftverhibák / emberi tényezők ellen, ezért folyamatosan frissítsd a rendszered és képezd magad a témában.)

Rendelkezik RBAC támogatással és részét képezi a magyar fejlesztésű PaX.

A letöltött forrás ellenőrzéséhez a Grsecurity PGP kulcsa: gpg --keyserver wwwkeys.pgp.net --recv-keys 0x4245D46A

Tartalomjegyzék

Kernel opciók

Megj.: ez a rész a 2.6 kernelhez készült, de a 2.4hez is használható.
Megj.2.: az opciókról részletes leírás van az adott "Help"ben;

  • Security options
    • Grsecurity = Y - az adott opciók "Help"jében teljes részletességgel le van írva mi mire jó;
      • Security level = általános sémák különböző biztonsági szintre, ha először használod és / vagy bizonytalan vagy, akkor egy ideig "low"ban, majd "medium"ban menjen, aztán rakd az itt leírt "high"ra; "custom" esetén minden opciót szabadon variálhatsz;
      • Address Space Protection
        • Deny writing to /dev/kmem, /dev/mem, and /dev/port = Y - ha nem működik megfelelően az, akkor kapcsold ki; nem kompatibilis továbbá a vmwarerel, dosemuval; FIXME
        • Disable privileged I/O = N - pld az X nem fog menni;
        • Remove addresses from /proc/pid/[maps|stat] = Y
        • Deter exploit bruteforcing = Y
        • Hide kernel symbols = Y
      • Role Based Access Control Options
        • Hide kernel processes = Y
        • Maximum tries before password lockout
        • Time to wait after max password tries, in seconds
      • Filesystem Protections
        • Proc restrictions = N
        • Linking restriction
        • FIFO restriction
        • Chroot jail restrictions
      • Kernel Auditing - érdmes bekapcsolni: Resource logging, (Un)Mount logging, Signal logging, Fork failure logging, Time change logging
      • Executable Protections
        • Enforce RLIMIT_NPROC on execs = Y
        • Destroy unused shared memory = Y
        • Dmesg(8) restriction = Y
        • Randomized PIDs = Y
        • Trusted path execution = N
      • Network Protections
        • Larger entropy pools = Y
        • Randomized TCP source ports = Y
        • Socket restrictions = N
      • Sysctl support = N
      • Logging options - jó alapállapotban;
    • PaX
      • PaX Control
        • Support soft mode = Y
        • Use legacy ELF header marking = Y - régebbi módszer, 'chpax' kell a felülbírálásához;
        • Use ELF program header marking = Y - újabb módszer, 'paxctl't igényel és patchelt 'binutils't (lásd pax honlap); magasabb priorítása van az előzőnél;
        • MAC system integration = direct
      • Non-executable pages
        • Enforce Non-executable pages = Y
        • Paging based non-executable pages = Y
        • Segmentation based non-executable pages = Y
          • Default non-executable page method = SEGMEXEC
        • Emulate trampolines = Y - alkalmazásszintű bekapcsolása biztonsági kockázatot rejt;
          • Automatically emulate sigreturn trampolines = N - bekapcsolása tényleges biztonsági rést jelent a pagexecben;
        • Restrict mprotect() = Y
          • Disallow ELF text relocations = N - rendszerfüggő, ha nem megy pld a login, kapcsold ki; (az opera pluginjei is akadnak: "Warning: XtRemoveGrab asked to remove a widget not on the list");
        • Enforce non-executable kernel pages = Y - nem múködik együtt a kernel modulokkal;
      • Address Space Layout Randomization
        • Address Space Layout Randomization = Y
          • Randomize kernel stack base = Y - nemvárt fagyásokat okozhat, ha használni akarod teszteld alaposan;
          • Randomize user stack base = Y
          • Randomize mmap() base = Y
          • Disable the vsyscall page = Y

Hasznos infók

PaX felülbírálása

A 'chpax' programra lesz szükség (vagy a modernebb 'paxctl', ami speciális 'binutils't igényel).
A felülbírálandó bináris helyét a which adja meg (pld.: 'which glxgears').
A 'chpax'nak adható opciók közül a kisbetűsök megakadályozzák, hogy a pax egy adott ellenőrzést végrehajtson, ezzel lehetővé téve néhány nem telejesen szabványos bináris futtatását. A nagybetűsök engedélyezik, hogy a pax végrehajtsa az adott ellenőrzést. Alapesetben egy bináris PeMRxS beállításokkal bír.
A PaX a fenti beállítások mellett a '/var/log/syslog'ba loggol; legegyszerűbb a 'dmesg | tail'-lal lekérdezni az utolsó üzeneteket.

Példa 1: egy openglt használó program nem indul az nvidia bináris libGL.so-ja miatt:

Mar 2 14:20:13 localhost kernel: PAX: execution attempt in: /usr/lib/tls/libGL.so.1.0.5336, 25a40000-25a4e000 0004b000
Mar 2 14:20:13 localhost kernel: PAX: terminating task: /usr/X11R6/bin/glxinfo(glxinfo):18887, uid/euid: 1000/1000, PC: 25a45f20, SP: 5efdaa90
Mar 2 14:20:13 localhost kernel: PAX: bytes at PC: b8 f0 ff ff ff e9 2b 73 fe ff b8 f4 ff ff ff e9 31 73 fe ff

Ok: a bináris nvidia driverhez járó libGL.so nem működik együtt az mprotect() védelemmel
Megoldás: ki kell kapcsolni a "restrict mprotect()"-et
Parancs: chpax -m /usr/X11R6/bin/glxinfo

Példa 2: az X nem indul el:

Mar 2 14:16:04 localhost kernel: PAX: execution attempt in: <anonymous mapping>, 081f3000-08254000 00000000
Mar 2 14:16:04 localhost kernel: PAX: terminating task: /usr/X11R6/bin/XFree86(XFree86):18833, uid/euid: 0/0, PC: 082514e8, SP: 5e201e8c
Mar 2 14:16:04 localhost kernel: PAX: bytes at PC: 55 89 e5 83 ec 08 c7 04 24 e0 17 25 08 8b 45 08 a3 e8 17 25

Ok: az X memóriakezelése egy nem igazán szabványos módszerre épül
Megoldás: ki kell kapcsolni a "segmentation based non-executable pages", "paging based non-executable pages", "mprotect() restriction" és "mmap() base randomization" védelmet
Parancs: chpax -spmr /usr/X11R6/bin/XFree86

Még pár példa, a bináris nevével és a kikapcsolandó funkcióval:
java + opera:
(megj: adott java változatok esetén csak akkor fut 2.6 kernel alatt, ha felülbírálod a glibc szálkezelését: export LD_ASSUME_KERNEL=2.2.5 )
java : segmentation based non-executable pages, paging based non-executable pages, restrict mprotect()
opera : segmentation based non-executable pages, paging based non-executable pages
wine:
wine-kthread : segmentation based non-executable pages, paging based non-executable pages, restrict mprotect()
wine-pthread : segmentation based non-executable pages, paging based non-executable pages, restrict mprotect()
mplayer:
mplayer : segmentation based non-executable pages, paging based non-executable pages, restrict mprotect()
mencoder : segmentation based non-executable pages, paging based non-executable pages
localedef:
localedef : segmentation based non-executable pages, paging based non-executable pages
OOo:
soffice.bin : segmentation based non-executable pages, paging based non-executable pages
grub:
grub : segmentation based non-executable pages, paging based non-executable pages, restrict mprotect()

Megj.: ha a pax lelő egy programot, az néha "beragad"; így kell felszabadítani:

$ chpax -spm /usr/local/bin/mplayer
/usr/local/bin/mplayer: Text file busy
$ fuser -k /usr/local/bin/mplayer
/usr/local/bin/mplayer: 16885e
$ chpax -spm /usr/local/bin/mplayer

Megj.2: elképzelhető, hogy egy bináris így száll el:

grsec: signal 11 sent to /usr/X11R6/bin/glxinfo[glxinfo:1436] uid/euid:1000/1000 gid/egid:1000/1000, parent /bin/bash[bash:2721] uid/euid:1000/1000 gid/egid:1000/1000
grsec: attempted resource overstep by requesting 4096 for RLIMIT_CORE against limit 0 by /usr/X11R6/bin/glxinfo[glxinfo:1436] uid/euid:1000/1000 gid/egid:1000/1000, parent /bin/bash[bash:2721] uid/euid:1000/1000 gid/egid:1000/1000

tehát nem tud sikeres core dumpot végrehajtani; ha tudsz mit kezdeni ennek eredményével, akkor 'ulimit -c unlimited' és reprodukáld a hibát;

Megj.3: bináris nvidia driver:

1. a bináris nvidia meghajtóhoz járó libGL.so nem működik együtt a pax mprotect() védelmével, ezért minden binárison - ami ezt a libraryt akarja használni - a 'chpax -m' segítségével ki kell kapcsolni sz ilyen típusú védelmet. De a qt-t használó programok nagy része alapból hozzá van linkelve a libGL.so-hoz és ez egy KDE esetén rengeteg felülbírálandó programot jelent. Tehát, ha KDEt és bináris nvidia meghajtót használsz és nem akarsz ezzel foglalkozni, akkor kapcsold ki a "Restrict mprotect()"-et;
2. a "Disallow ELF text relocations" mellett kifagy az X a GLX extension inicializálásakor;

Egyéb megszorítások

(oscon tippjei alapján)

/proc:

  • Filesystem Protections
    • Proc restrictions = Y
      • Restrict /proc to user only = N
        • Allow special group = Y
          • GID for special group = 1001
    • Additional restrictions = Y

az 1001 id alá tartozó csoport megnézheti a mások számára tiltott adatokat is; rendszerfüggő, néhány daemonnak szüksége lehet rá;

tpe:

  • Executable Protections
    • Trusted Path Execution (TPE) = Y
      • Partially restrict non-root users = Y
        • GID for untrusted users = 1005

az 1005 id alá tartozó csoport csak biztonságos pathben lévő binárisokat indíthat; tehát olyan programokat, amik könyvtárába csak a root és a saját maguk írhat; rendszerfüggő, ellenőrizni kell a PATHben lévő könyvtárak (pld /usr/local/bin) jogait;

socket restriction:

  • Network Protections
    • Socket restrictions = Y
      • Deny any sockets to group = Y
        • GID to deny all sockets for = 1004
      • Deny client sockets to group = Y
        • GID to deny client sockets for = 1003
      • Deny server sockets to group = Y
        • GID to deny server sockets for = 1002

egy adott csoport számára meg lehet tiltani: minden hálózati kapcsolatot (1004 id; pld root), kliens oldali kapcsolatot (1003 id; pld daemonok), szerver oldali kapcsolatot (1003 id; pld userek); erősen rendszerfüggő, tesztelni kell;

hogy ezeket használni lehessen, módosítani kell az '/etc/group' tartalmát:

grsec_proc:x:1001:
grsec_tpe_gid:x:1005:
grsec_socket_all_gid:x:1004:
grsec_socket_client_gid:x:1003:
grsec_socket_server_gid:x:1002:

hol mikor melyik csoportot lehet kitiltani erősen rendszerfüggő;

Külső hivatkozások

Fejlesztői (nem hivatalos) változatok