Diverso tempo fa analizzammo la security kernel patch Grsecurity nell'ottica di hardenizzare un sistema montante sistema operativo GNU/Linux.
In questa sede andremo, invece, a scoprire un'interessantissima patch per il kernel di OpenBSD.
Sembra strano ma vedremo come, attraverso la stessa, si possa rendere maggiormente sicuro l'OS "sicuro di default".
Proiettiamoci dunque nell'ottica di Zophie (http://www.0penbsd.com/zophie.html).
Zophie, come detto, implementa alcune features per l'OpenBSD kernel che permettono di rafforzare la sicurezza della nostra macchina, nello specifico esse sono:
1) Trusted Path Execution - kern.zophie.tpe e kern.zophie.tpe_gid
Delimitando una locazione arbitraria identificata col nome di TPE possiamo consentire l'esecuzione binaria nella stessa esclusivamente all'utente root o in gruppi creati per la fattispecie.
2) Privacy processi, utenti e connessioni - kern.zophie.privacy
E' possibile, molto similmente a quanto visto con Grsecurity, limitare la scrutabiltà dei processi, delle connessioni e delle utenze ai non relativi owners.
Suddetto viene quindi gestito attraverso le modiche delle utility ps, w, netstat, last, finger e who.
Le impostazioni descritte, come facilmente intuibile, vengono gestite attraverso sysctl(8); conseguentemente le direttive impostabili per il TPE e per il kernel privacy sono:
1) kern.zophie.privacy
Impostabile ad 1 (attivo) e 0 (disattivo).
2) kern.zophie.tpe
Impostabile anch'esso ad 1 e 0.
3) kern.zophie.tpe_gid
Consente l'impostazione dei Gruppi "speciali" a cui consentire l'esecuzione binaria all'interno del TPE.
-- Installazione:
Prima di tutto scarichiamo e decomprimiamo nella nostra home il tarball di zophie.
In quest'articolo analizzeremo la patch per l'OpenBSD Kernel 3.8 sebbene sia disponibile la patch per 3.9.
# cd ~/ && wget http://www.0penbsd.com/Zophie-3.8.tgz
# tar zxvf Zophie-3.8.tgz
Nel caso non l'avessimo già fatto (orrore!), scarichiamo i sorgenti del progetto OpenBSD:
# export [email protected]:/cvs
# export CVS_RSH=/usr/bin/ssh
# cd /usr
# cvs -q get -rOPENBSD_3_8 -P src
Rechiamoci in /usr/src ed applichiamo la patch:
# cd /usr/src
# patch -p0 < ~/3.8/Zophie-3.8.patch
Ricompiliamo il kernel:
# rm -rf /usr/obj
# mkdir /usr/obj
# cd /usr/src
# make obj
# cd /usr/src/sys/arch/i386/conf
# cp GENERIC SECURED
# vi SECURED -> include "../../../conf/GENERIC" => "../../../conf/SECURED"
# config SECURED
# cd ../compile/SECURED
# make clean
# make depend
# make
# cp /bsd /bsd.nozophie
# cp bsd /bsd
# reboot
Bootato il nostro nuovo kernel, ci occuperemo di sistemare Zophie:
Copiamo i nuovi header per sysctl da /usr/src/sys/sys/sysctl.h a /usr/include/sys/:
# cp /usr/src/sys/sys/sysctl.h /usr/include/sys/
Installiamo il file zophie.7:
# /usr/bin/nroff -Tascii -mandoc ~/3.8/zophie.7 > zophie.cat7
# /usr/bin/install -c -o root -g bin -m 444 zophie.cat7 /usr/share/man/cat7/zophie.0
Ricompiliamo le utility incriminate per il "kernel privacy" (finger, last, netstat, w, who) nonchè sysctl:
# cd /usr/src/usr.bin/finger
# make clean obj depend && make && make install
# cd /usr/src/usr.bin/last
# make clean obj depend && make && make install
# cd /usr/src/usr.bin/netstat
# make clean obj depend && make && make install
# cd /usr/src/usr.bin/w
# make clean obj depend && make && make install
# cd /usr/src/usr.bin/who
# make clean obj depend && make && make install
# cd /usr/src/sbin/sysctl
# make clean obj depend && make && make install
Infine modifichiamo il file /etc/sysctl.conf aggiungendo le opzioni di nostro interesse:
# sysctl -w kern.zophie.privacy=1
Proviamo la patch:
# su - mozako
$ ps aux
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
root 1 0.0 0.1 356 308 ?? Is 2:42PM 0:00.01 /sbin/init
root 25350 0.0 1.1 1852 4460 ?? Ss 2:42PM 0:00.21 httpd: parent (httpd)
root 26608 0.0 0.1 276 512 ?? Is 2:42PM 0:00.01 inetd
root 7775 0.0 0.3 572 1120 ?? Is 2:42PM 0:00.32 /usr/sbin/sshd
root 6908 0.0 0.5 3260 2076 ?? Ss 2:44PM 0:00.33 sshd: root@ttyp0 (sshd)
root 23390 0.0 0.1 416 492 p0 Ss 2:44PM 0:00.05 -ksh (ksh)
mozako 11826 0.0 0.1 484 432 p0 S 2:45PM 0:00.02 ksh
mozako 3566 0.0 0.1 320 204 p0 R+ 2:45PM 0:00.00 ps -aux
root 7074 0.0 0.1 444 480 C0 Is+ 2:43PM 0:00.08 -ksh (ksh)
$ exit
# sysctl -w kern.zophie.privacy=1
kern.zophie.privacy: 0 -> 1
# su - mozako
$ ps aux
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
mozako 5785 2.0 0.1 504 464 p0 S 2:45PM 0:00.02 ksh
mozako 6808 0.0 0.0 416 188 p0 R+ 2:45PM 0:00.00 ps -aux
Per quanto riguarda i processi sembra funzionare egregiamente, vediamo le connessioni:
# netstat -na
Active Internet connections (including servers)
Proto Recv-Q Send-Q Local Address Foreign Address (state)
tcp 0 0 192.168.1.190.22 192.168.1.103.59507 ESTABLISHED
tcp 0 0 *.21 *.* LISTEN
tcp 0 0 *.22 *.* LISTEN
tcp 0 0 *.37 *.* LISTEN
tcp 0 0 *.13 *.* LISTEN
tcp 0 0 *.113 *.* LISTEN
tcp 0 0 *.80 *.* LISTEN
Active Internet connections (including servers)
Proto Recv-Q Send-Q Local Address Foreign Address (state)
udp 0 0 127.0.0.1.512 *.*
udp 0 0 *.514 *.*
Active Internet connections (including servers)
Proto Recv-Q Send-Q Local Address Foreign Address (state)
tcp6 0 0 *.22 *.* LISTEN
tcp6 0 0 *.37 *.* LISTEN
tcp6 0 0 *.13 *.* LISTEN
tcp6 0 0 *.113 *.* LISTEN
Active Internet connections (including servers)
Proto Recv-Q Send-Q Local Address Foreign Address (state)
udp6 0 0 ::1.512 *.*
Active UNIX domain sockets
Address Type Recv-Q Send-Q Inode Conn Refs Nextref Addr
0xd657e330 stream 0 0 0x0 0xd0df0040 0x0 0x0
0xd657e264 stream 0 0 0x0 0xd0df0240 0x0 0x0
0xd657e198 dgram 0 0 0xd6552a18 0x0 0x0 0x0 /var/empty/dev/log
0xd657e0cc dgram 0 0 0xd6552978 0x0 0x0 0x0 /dev/log
# su - mozako
$ netstat -na
Active Internet connections (including servers)
Proto Recv-Q Send-Q Local Address Foreign Address (state)
tcp 0 0 192.168.1.190.50000 192.168.1.103.41005 ESTABLISHED
tcp 0 0 192.168.1.190.9445 195.110.105.18.6667 ESTABLISHED
tcp 0 0 *.50000 *.* LISTEN
Active Internet connections (including servers)
Proto Recv-Q Send-Q Local Address Foreign Address (state)
tcp6 0 0 *.50000 *.* LISTEN
Anche le connessioni sono mostrate unitamente all'owner del socket, si noti infatti che ambedue le connessioni stabilite nonchè quelle in ascolto appartengono al bouncer IRC volutamente eseguito a mò d'esempio.
OpenBSD comprende autonomamente il webserver Apache, opportunamente patchato nonchè chrootato di default...
Vediamo come, non volendo usare l'httpd offerto dall'OS (Apache), mettere online, nel giro di pochi secondi, il contenuto di una directory "al volo".
Il webserver che useremo è il leggerissimo thttpd.
Iniziamo con lo scaricare il pacchetto:
# opm -I thttpd
OpenBSD Packages Manager v.0.1beta
Your OpenBSD version: 3.8
Checking repository...
Package that will be installed is thttpd-2.25b.tgz
Are you sure ? [N|y]y
Installing...
parsing thttpd-2.25b
thttpd-2.25b: complete
Fatto questo chdiriamoci nella nostra home e poniamo il caso in cui vogliamo mettere online dei files html contenuti in una determinata cartella "al volo":
# cd
# mkdir web-on-the-fly
# cd web-on-the-fly/
# thttpd -p 81 -r
Immediatamente tutti i files contenuti nella cartella web-on-the-fly saranno online...
Sicuramente thttpd non è paragonabile ad Apache, resta il fatto che, per determinati utilizzi, però, è sicuramente più comodo.
Rivediamoci i comandi usati:
Con -p abbiamo specificato la porta cui metterci in ascolto.
Con -r abbiamo chrootato la directory in cui abbiamo eseguito thttpd (web-on-the-fly)
A mò d'esempio, possiamo trovare thttpd in esecuzione all'indirizzo: http://sickfreak.shacknet.nu:81