PaX patch a 2.6-os kernelhez

Címkék

A PaX Team-nek köszönhetően elérhető egy kísérleti PaX biztonsági patch a 2.6-os (2.6.0) Linux kernelhez. A patch a 2.4.23-as kernelhez készült folt előre portolt verziója, amely jelenleg i386 platformon működik biztosan, a többi platformon valószínűleg le sem fordul.

A PaX patch használatával számos puffer túlcsordulásra építő támadásnak állhat ellen rendszerünk. Kipróbáltam a patchet a stabil 2.6.0-ás kernelen.



A tapasztalatok:A kernel simán lefordult, az összes PaX opciót engedélyeztem a ``menuconfig''-ban. Bebootolva a kernelt a fixen belefordított hálózati kártya inicializálása előtt kaptam egy ``general protection fault''-ot, de a kernel felállt, és elindította a rendszert. Lefuttattam a paxtest-0.9.5 tesztet. Eredménye:

Executable anonymous mapping : Killed

Executable bss : Killed

Executable data : Killed

Executable heap : Killed

Executable stack : Killed

Executable anonymous mapping (mprotect) : Killed

Executable bss (mprotect) : Killed

Executable data (mprotect) : Killed

Executable heap (mprotect) : Killed

Executable shared library bss (mprotect) : Killed

Executable shared library data (mprotect): Killed

Executable stack (mprotect) : Killed

Anonymous mapping randomisation test : 16 bits (guessed)

Heap randomisation test (ET_EXEC) : 13 bits (guessed)

Heap randomisation test (ET_DYN) : 25 bits (guessed)

Main executable randomisation (ET_EXEC) : 16 bits (guessed)

Main executable randomisation (ET_DYN) : 17 bits (guessed)

Shared library randomisation test : 16 bits (guessed)

Stack randomisation test (SEGMEXEC) : 23 bits (guessed)

Stack randomisation test (PAGEEXEC) : 24 bits (guessed)

Return to function (strcpy) : Vulnerable

Return to function (strcpy, RANDEXEC) : Return to function (memcpy) : Vulnerable

Return to function (memcpy, RANDEXEC) : Killed

Executable shared library bss : Killed

Executable shared library data : Killed

Writable text segments : Killed

A patch a kezdeti ``GPF''-től eltekintve nem okozott semmilyen negatív változást a kernelben (eddig). A PaX alkalmazása után néhány alkalmazás nem fut. Erről a kernel menuconfig help-je tájékozatat is minket. A legemlítésreméltóbb programok, amelyek nem indulnak el: az Xfree86 4.x verziója, a Java viruális gép és a Wine. A patch szerintem nem is desktop gépeken kap nagyobb hangsúlyt, hanem szerveren, ahol esetleg több rosszindulatú helyi felhasználóval kell számolnunk. A patchelt kernellel futott a MySQL 4.x, az Apache legújabb verziója, működött a PHP-ra írt weboldal, ment a postfix, és az amavisd-new is. Mindez Debian Sarge operációs rendszeren. Hosszabb távú tapasztalatok nincsenek, hiszen a patch 3 napja jelent meg. Tervezem egy teszt szerver felállítását, amely lokális hálón nagy terhelésnek van kitéve.

A szerver üzemeltetés szempontjából érdekes lehet még az, hogy mekkora a ``overhead''-je (overhead ebben az esetben = a patch működéséből adódó lassulás) van a patchnek. A dokumentáció szerint i386 és ppc környezetben számolnunk kell az ``overhead''-del. Erre vonatkozólag még nem végeztem méréseket. Az alpha, ia64, parisc, sparc, sparc64 és x86_64 platformokon nem kell overhead-del számolnunk.

A patch tesztelésre letölthető:

http://pax.grsecurity.net/pax-linux-2.6.0-200312302245.patch

A PaX mögött álló elgondolásról bővebben itt olvashatsz. A patchelt kernel teszteléséhez használható a paxtest-0.9.5 tesztprogram. A patchelt kernelen file alapon tudjuk a PaX jelzőket állítani. Ehhez a chpax programra van szükségünk.

Jó szórakozást!

Hozzászólások

Hali!

Nem pont idevag a kerdes, de azt szeretnem kerdezi hogy a Pax mukodese soran okozhat e problemat syslog-ng vel es iptables logolassal? Vagy legalabbis van arra valami gyogyir, hogy logrotate utan a syslog-ng tovabbra is megkapja az iptables logjat?Nekem mondjuk ez a problema altalaban akkor jon elo (ha jol emlexem), amikor a kovetkezok valamelyikoje be van kapcsolva:

Address Space Layout Randomization

Deny writing to /dev/kmem, /dev/mem, and /dev/port

Egyebkent sima sysloggal szepen megy az egesz.

Elore is koszi a segitseget!

Ysolt

nehany eszrevetel:

1. amikor az osszes opciot engedelyezted, abban benne volt-e a KERNEXEC (ehhez a modul tamogatast ki kell venni egyenlore)?

2. arrol a boot soran latott GPF-rol tudnal kuldeni vmi bovebb infot?

3. milyen gcc-t hasznalsz? azert kerdezem mert a 'Return to function (strcpy, RANDEXEC):' tesztnek szemmel lathatolag nem volt eredmenye, ami altalaban akkor fordul elo, ha a verem tartalma nem egeszen az, amit a teszt feltetelez. legjobb lenne, ha elkuldened a rettofunc1x file-t ami ezt az eredmenyt produkalta.

4. az XFree86 tokeletesen mukodik PaX alatt, ha nem az elfloader-t hanem a dlloader-t hasznalja az ember. akit erdekelnek a reszletek, az kuldjon email-t vagy figyelje a gentoo-t, ahol remelhetoleg hamarosan megjelenik ez az egyszeru modositas.

5. teljesitmeny vesztes: i386-on semmi, ha a SEGMEXEC-t hasznalod, ami altalaban az alapertelmezes, mint pl. a te esetedben. a PAGEEXEC az egyetlen, ami i386-on meg ppc-n lassulast okoz, az adott program memoriahasznalatatol fuggoen (nehez ra szabalyt mondani, egyszerubb kiprobalni).

6. a chpax tobbe-kevesbe 'obsolete', vagyis a jovoben nem ajanlott hasznalata, helyette a van egy binutils folt (ma keszultem el vele), aminek segitsegevel a linker (GNU ld) meg tudja jelolni azokat a programokat, amik futas idoben generalnak kodot es ezert kivetelnek szamitanak PaX alatt (nemsokara elerheto lesz gentoo alatt, ill. talan bekerul a fo binutils disztribicioba is).

1.) KERNEXEC? Ilyen nincs a konfigomban.

#

# Security options

#

CONFIG_PAX=y

CONFIG_PAX_NOEXEC=y

CONFIG_PAX_PAGEEXEC=y

CONFIG_PAX_SEGMEXEC=y

CONFIG_PAX_EMUTRAMP=y

CONFIG_PAX_MPROTECT=y

CONFIG_PAX_NOELFRELOCS=y

CONFIG_PAX_PT_GNU_STACK=y

CONFIG_PAX_PT_GNU_HEAP=y

CONFIG_PAX_ASLR=y

CONFIG_PAX_RANDKSTACK=y

CONFIG_PAX_RANDUSTACK=y

CONFIG_PAX_RANDMMAP=y

CONFIG_PAX_RANDEXEC=y

# CONFIG_SECURITY is not set

2.) Megprobalok.

3.) gmicsko03:/usr/src/linux-2.6.0-pax# gcc -v

Reading specs from /usr/lib/gcc-lib/i486-linux/3.3.2/specs

Configured with: ../src/configure -v --enable-languages=c,c++,java,f77,pascal,objc,ada,treelang --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-gxx-include-dir=/usr/include/c++/3.3 --enable-shared --with-system-zlib --enable-nls --without-included-gettext --enable-__cxa_atexit --enable-clocale=gnu --enable-debug --enable-java-gc=boehm --enable-java-awt=xlib --enable-objc-gc i486-linux

Thread model: posix

gcc version 3.3.2 (Debian)

a filet kuldom, csak ahhoz masik gep kell.

[snip]

fb0: VESA VGA frame buffer device

SBF: Simple Boot Flag extension found and enabled.

SBF: Setting boot flags 0x1

Machine check exception polling timer started.

apm: BIOS version 1.2 Flags 0x03 (Driver version 1.16ac)

ikconfig 0.7 with /proc/config*

general protection fault: 0000 [#1]

CPU: 0

EIP: 00c0:[] Not tainted

EFLAGS: 00010046

EIP is at 0x5ddd

eax: 00000b02 ebx: 00000000 ecx: 00000102 edx: 00000000

esi: 00000000 edi: 0000001c ebp: dfd77f4c esp: dfd77f46

ds: 00c8 es: 0000 ss: 0068

Process kapmd (pid: 6, threadinfo=dfd76000 task=dfd79900)

Stack: 7f4c5ea5 00c80000 02020000 00c00000 00007f60 01020000 0216530e 5ef50000

000000b8 7facc012 1d4edfd7 0060c021 7fac0000 0202dfd7 007b0000 007bc010

60000000 7fa8dfd7 0000dfd7 00000000 00000000 0000c010 59f40000 0000c018

Call Trace:

Code: Bad EIP value.

note: kapmd[6] exited with preempt_count 1

Installing knfsd (copyright (C) 1996 okir@monad.swb.de).

NTFS driver 2.1.5 [Flags: R/O].

[snip]

Ahogy nezem az apmd nem viselte jol a dolgot.