La grandezza dei sistemi GNU/Linux è quella di permettere agli utenti stessi di creare volendo e/o apportare le modifiche ricercate al cuore dei sistemi linux; il kernel.

Le migliorie di sicurezza molto spesso sono implementate in versioni di kernel già pronte per alcune distribuzioni linux e distribuite nei formati riconosciuti dalle stesse. Siccome però niente è definitivo e tutto è modificabile, vediamo assieme come rendere il nostro sistema linux più sicuro applicando una delle più diffuse patch di sicurezza ad un kernel vanilla “ufficiale”.

Si sta parlando del progetto: Grsecurity

NB: L’esempio si riferisce ad un kernel source serie 2.6.24.5 ; predefinito della distibuzione Slackware 12.1 . Chiaramente in base alla versione di riferimento del kernel indipendentemente dalla distribuzione e in base alla disponibilità della patch dal sito ufficiale Grsecurity è possibile ripetere l’identica procedura.

Vediamo in prima fase come applicare la patch al kernel, analizzando, le varie funzionalità.

Scarichiamo la patch per la versione del kernel di riferimento e la estraiamo:

~$ wget http://grsecurity.net/grsecurity-2.1.11-2.6.24.5-200804211829.patch.gz
~$ gunzip grsecurity-2.1.11-2.6.24.5-200804211829.patch.gz

Copiamo la patch e ci spostiamo dove risiedono i source del kernel:

~$ su
Password:
~# cp grsecurity-2.1.11-2.6.24.5-200804211829.patch /usr/src/linux
~# cd /usr/src/linux

Puliamo l’albero dei collegamenti del kernel:

~# make mrproper

NB: Volendo possiamo scegliere di partire da un config preesistente, che solitamente è salvato nella directory /boot. Se non è necessario saltate le stringhe in verde.

~# cp /boot/config_versione_scelta /usr/src/linux/.config
~# make oldconfig

Applichiamo la patch:

~# patch -p1 < grsecurity-2.1.11-2.6.24.5-200804211829.patch

A questo punto lanciamo il comando per scegliere le opzioni da abilitare, dando un accenno alle differenze di configurazione.

~# make menuconfig

NB: Si può scegliere xconfig e/o gconfig. Per dubbi  consultare i post: compilazione e ricompilazione kernel 2.6.x nel blog sezione kernel.

NB: La traduzione delle voci del kernel è relativa alla patch e/o localizzazione tramite catalogo. Per info e dubbi consultare il post traduzione e localizzazione italiana del kernel linux nel blog.

Dal menu principale ci spostiamo nella sezione che ci interessa, ossia: Opzioni di Sicurezza **

All’interno saranno presenti le categorie: Grsecurity & Pax

 

NB:  Abilitando Grsecurity si richiamerà automaticamente l’abilitazione di Pax. Ci spostiamo quindi nell’apposita sezione senza considerare Pax per il momento.

 

L’abilitazione di Grsecurity in maniera statica ci presenterà al menu molte opzioni. La configurazione di tali opzioni avviene scegliendo il Livello di Sicurezza “Security Level”. Tale livello che in maniera predefinita è impostato su Low (basso) può essere impostato manualmente su:

Basso - Medio - Alto e/o Custom

NB: Come è facile intuire il livello Custom permette di scegliere le opzioni da abilitare/disabilitare in maniera manuale. In alternativa scegliendo uno dei livelli di sicurezza preimpostati si attivano le seguenti caratteristiche di sicurezza. Cerchiamo di capire le voci in dettaglio.

Livello Basso “Low” , attiva le seguenti caratteristiche:

linking restrictions
fifo restrictions
random pids enforcing nproc on execve()
restricted dmesg
random ip ids
enforced chdir(”/”) on chroot

NB: Questo tipo di settaggio consene di abilitare le funzioni di sicurezza standard, ed è compatibile con la maggior parte del software in uso. Può essere la soluzione migliore di compatibilità quando si usano software particolari o magari un pò datati. Garantisce in ogni caso un livello minimo aggiuntivo di sicurezza a quello standard del kernel.

Livello Medio “Medium”, attiva le seguenti caratteristiche:

random tcp source ports
failed fork logging
time change logging
signal logging
deny mounts in chroot
deny double chrooting
deny sysctl writes in chroot
deny mknod in chroot
deny access to abstract AF_UNIX sockets out of chroot
deny pivot_root in chroot
denied writes of /dev/kmem, /dev/mem, and /dev/port
/proc restrictions with special gid set to 10 (generalmente wheel)
address space layout randomization
removal of addresses from /proc//[maps|stat]

NB:  Questo settaggio aggiunge le funzione elencate a quelle del livello basso precedente. Garantisce quindi un notevole livello di sicurezza; medio-alto. Può però causare problemi di non compatibilità con software datati o particolari. Se si sceglie di attivare questo livello di sicurezza bisogna essere certi che sia attivo il servizio di autenticazione_ “identd”_ sul sistema in uso e che sia settato a gid 10 (corrispondente normalmente al gruppo wheel).

Livello Alto “High”, attiva le seguenti caratteristiche:

additional /proc restrictions
chmod restrictions in chroot
no signals, ptrace, or viewing processes outside of chroot capability restrictions in chroot
deny fchdir out of chroot
priority restrictions in chroot
segmentation-based implementation of PaX
mprotect restrictions
kernel stack randomization
mount/unmount/remount logging
kernel symbol hiding

NB: Questa scelta aggiunge le funzioni elencate a quelle dei precedenti livelli. E’ il massimo in quanto a sicurezza con la patch Grsecurity. Il livello Alto in più, consente l’abilitazione di Pax e delle sue opzioni. Bisogna però prestare attenzione al livello di compatibilità con software particolari e/o datati. In alcuni casi infatti le restrizioni dettate da questo livello di sicurezza potrebbero causare particolari problemi di compatibilità. Per il corretto funzionamento e per ridurre le restrizioni di incompatibilità software sono valide ( è quindi consigliato attivare) le stesse opzioni di sistema del livello medio: Servizio identd avviato sotto gid 10.

Cos’è Pax ?

PaX introduce una coppia di meccanismi di sicurezza che rende difficile per degli attaccanti sfruttare bug che coinvolgano la corruzione della memoria. Solitamente le tecniche comune di exploit risultano essere tre:

  1. introdurre/eseguire codice arbitrario
  2. eseguire codice esistente al di fuori del normale flusso di esecuzione del programma originale
  3. eseguire codice esistente nel normale flusso di esecuzione del programma originale con dati arbitrari

I metodi di prevenzione di PaX impediscono che il codice eseguibile possa essere memorizzato in aree di memoria scrivibile.

Il primo metodo di prevenzione di Pax, chiamato NOEXEC, ha come scopo quello di fornire del controllo sulla generazione a runtime di codice eseguibile. Le pagine di memoria che non contengono codice eseguibile vengono marcate come non-eseguibili. Questo significa che heap e stack, che contengono solo dati e non dovrebbero contenere codice eseguibile, sono marcati come non-eseguibili. Gli exploit che inseriscono del codice in questa area con l’intento di mandarlo in esecuzione falliranno.

Il secondo metodo di prevenzione di Pax, chiamato ASLR (Address Space Layout Randomization), rende casuali gli indirizzi dati alle richieste di memoria. Mentre precedentemente la memoria veniva assegnata sequenzialmente (il che significa che gli exploit sanno dove le regioni di memoria di un processo sono situate) ASLR rende casuali questa allocazione, rendendo vane le tecniche che contano su queste informazione.

NB: Il Livello Custom può essere combinato ad uno dei tre livelli descritti. E’ possibile infatti partire da una scelta di uno dei tre livelli preconfigurati e successivamente scegliere il livello Custom. In questo modo le opzioni dettate da uno dei tre livelli di sicurezza rimarranno attive. Successivamente la scelta del livello custom ci consentirà di apportare modifiche ai moduli. E’ chiaro che le modifiche di selezione dei moduli da attivare/disabilitare saranno consentite solo se la disattivazione di alcuni moduli non andrà a diminuire il livello di base di sicurezza scelto prima della selezione Custom.

NOTA PARTICOLARE:

E’ molto frequente che l’abilitazione di Grsecutiry sui livelli medio/alto applichi restrizioni pesanti alla directory di sistema /proc . Questo tipo di restrizioni potrebbe causare il mal funzionamento di comandi e gestione di tutto ciò che concerne tale directory, rendendo difficile anche il funzionamento di un applicativo semplice come lo può essere ad esempio un contatore di stat come: conky,torsmo e/o anche potrebbe impedire all’utente comandi di sistema come ifconfig etc…

Per evitare tale restrizione è sufficiente disabilitare l’opzione Proc Restrictions come da screen seguente. Tale voce è  raggiungibile tramite menu:

Opzioni di Sicurezza ---> 
                 Grsecurity --->
                     Filesystem Protections --->
                                   [ ] Proc restrictions

 

Scelti i moduli e le opzioni da attivare. Salviamo ed usciamo dall’apposita opzione di menu:< Exit >

Ritornati in shell prima di procedere con la compilazione dell’immagine kernel, possiamo customizzare l’uname modificando il makefile alla voce EXTRAVERSION:

~# vi Makefile
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 24
EXTRAVERSION = .5-quello_che_vuoi

Salviamo ed usciamo.

NB: La patch Grsecurity applicherà in ogni caso di suo un uname personalizzato che aggiungerà all’EXTRAVERSION:   -grsec ; Il risultato finale quindi sarà un uname simile a:

2.6.24.5-quello_che_vuoi-grsec

Completata la parte che necessitava di qualche spiegazione. Completiamo la compilazione dell’immagine del kernel e dei relativi moduli:

~# make -j5 bzImage
~# make -j5 modules
~# make modules_install

Finita la creazione dell’immagine e dei moduli spostiamo il nuovo kernel e i relativi file di config nella directory /boot:

~# cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-2.6.24.5-grsec
~# cp /usr/src/linux/.config /boot/config_vmlinuz-2.6.24.5-grsec
~# cp /usr/src/linux/System.map /boot/System.map-2.6.24.5-grsec

Infine sistemiamo il boot loader (Grub/Lilo) con le stringhe relative al nuovo kernel patchato:

~# vi /etc/lilo.conf

#  Start Config Image kernel 2.6.24.5-grsec
  image = /boot/vmlinuz-2.6.24.5-grsec
  root = "/dev/hdaX"                            => device "1-2-3..." corrispondente alla partizione radice /
  label = "2.6.24.5-grsec"                      => nome che apparirà al boot lilo
  read-only
#  End Config Image kernel 2.6.24.5-grsec

Quindi, una volta salvate le modifiche, riavviamo lilo in modalità verbose per essere sicuri che non vi siano errori:

~# lilo -v

Al riavvio noteremo le stringhe relative al chroot abilitato, ai permessi utente,gid etc…

# End