Guida rapida per PaX su Gentoo Hardened
1.
Che cos'è Gentoo Hardened?
Gentoo Hardened è un progetto il cui scopo è rendere più sicuro un sistema
Gentoo. Sono supportate varie soluzioni differenti e presenta una buona dose di
flessibilità per personalizzare la propria installazione. Il cuore di una
normale installazione di Gentoo Hardened è PaX.
2.
Che cos'è PaX?
PaX è una patch per il kernel Linux che aumenta la sicurezza in due modi.
Il primo, ASKR (Address Space Layout Randomization), consente di rendere
casuale lo schema di indirizzamento di tutti i dati caricati nella memoria.
Quando una applicazione è compilata come PIE (Position Independent
Executable), PaX è in grado inoltre di rendere casuale anche gli indirizzi
della base dell'applicazione.
La seconda protezione fornita da PaX è la memoria non eseguibile. Questo
previene una forma di attacco piuttosto comune in cui un attaccante inserisce
codice eseguibile nella memoria. Si possono trovare altre informazioni su
PaX in questa guida, ma la homepage del progetto è
http://pax.grsecurity.net.
3.
Introduzione a PIE e a SSP
Come si è accennato in precedenza, il complemento di PaX è PIE. Questa tecnica
per compilare applicazioni salva le informazione necessarie a spostare parti
dell'eseguibile nella memoria, da cui il nome Position Independent.
SSP (Stack Smashing Protector) è la seconda tecnologia complementare che
è introdotta in fase di compilazione dell'eseguibile. SSP fu originariamente
introdotto dalla IBM sotto il nome ProPolice. Esso modifica il
compilatore C per inserire codice di inizializzazione nelle funzioni che creano
un buffer nella memoria.
Nota:
Nelle nuove versioni di SSP, è possibile applicare SSP a tutte le funzioni
aggiungendo una protezione alle funzioni i cui buffer normalmente avrebbero una
dimensione inferiore al limite imposto da SSP. Questo si può abilitare
attraverso la CFLAG -fstack-protector-all.
|
In fase di esecuzione, quando un buffer viene creato, SSP aggiunge un valore
casuale segreto, il canary, alla fine del buffer. Quando la funzione effettua il
return, SSP si accerta che il canary sia ancora intatto. Se un attaccante
volesse attuare un buffer overflow, sovrascriverebbe questo valore e farebbe
scattare lo stack smashing handler. Attualmente questo uccide il processo.
Ulteriori
informazioni su SSP.
4.
Compilare un kernel con PaX abilitato
Diversi sorgenti dei kernel di Gentoo sono già modificati con PaX.
Per i sistemi 2.4/2.6, i kernel consigliati sono gli hardened-sources.
Si deve scegliere uno dei sorgenti consigliati oppure applicare la patch
corretta da http://pax.grsecurity.net al proprio albero e
configurarlo come si farebbe normalmente per il proprio sistema.
In Security Options -> PaX, attivare le seguenti opzioni.
Codice 4.1: Configurazione Kernel |
[*] Enable various PaX features
PaX Control ->
[ ] Support soft mode
[*] Use legacy ELF header marking
[*] Use ELF program header marking
MAC system integration (none) --->
Non-executable page ->
[*] Enforce non-executable pages
[*] Paging based non-executable pages
[*] Segmentation based non-executable pages
[*] Emulate trampolines
[*] Restrict mprotect()
[ ] Disallow ELF text relocations
Address Space Layout Randomization ->
[*] Address Space Layout Randomization
[*] Randomize kernel stack base
[*] Randomize user stack base
[*] Randomize mmap() base
[*] Randomize ET_EXEC base
|
Si deve compilare questo kernel come si farebbe normalmente e installarlo in
/boot.
5.
Compilare un ambiente utente con PIE/SSP abilitato
Gentoo Hardened supporta la compilazione PIE/SSP trasparente tramite lo specfile
di GCC. Questo implica che ogni utente che stia aggiornando una installazione
Hardened precedente debba rimuovere le LDFLAGS e le CFLAGS utilizzate per
attivare PIE/SSP. Inoltre, hardened-gcc è ora deprecato e si dovrebbe
rimuovere (la versione 5.0 è un pacchetto dummy). Per ottenere la versione
aggiornata di GCC, è necessario aggiungere USE="hardened pic" a
/etc/make.conf se non si sta utilizzando il profilo hardened.
Per mantenere una toolchain corretta, prima è necessario un emerge binutils
gcc virtual/libc. In seguito, occorre ricompilare l'intero sistema con
emerge -e world. Tutti i pacchetti futuri saranno compilati con PIE/SSP.
Avvertenza:
È noto che sia PIE che SSP possano provocare incompatibilità con qualche
pacchetto. Se si incontra un pacchetto la cui compilazione fallisce, si prega
di segnalare a http://bugs.gentoo.org/ un bug report dettagliato che
includa un log della compilazione fallita e l'output di emerge info.
|
Probabilmente è utile installare pax-utils. Spesso se un ELF presenta
spostamenti dell'eseguibile nel segmento di testo, questi possono causare
problemi. scanelf -BRylptq
6.
Quando le cose non funzionano correttamente (Controllo di PaX)
Alcune applicazioni legittime proveranno a generare in fase di esecuzione codice
che viene eseguito al di fuori della memoria. Naturalmente, PaX non lo consente
e terminerà immediatamente l'applicazione.
Nota:
Le applicazioni di questo tipo più comuni sono XFree/Xorg, mplayer e strumenti
multimediali che si basano sulle xine-lib. La soluzione più semplice a questi
problemi consiste nel disabilitare le protezioni PaX.
|
Fortunatamente esiste una utilità per abilitare le protezioni a seconda
dell'applicazione, paxctl. Come per ogni altro pacchetto Gentoo, si può
installare paxctl con il comando emerge paxctl. Le informazioni
sull'utilizzo di paxctl si possono vedere con paxctl -h.
Nota:
Se si dispone di una vecchia versione di binutils, è necessario usare
chpax, che modifica le configurazioni precedenti di PaX. Si può usare
chpax quasi allo stesso modo di paxctl. Questo richiede che nel proprio kernel
sia built-in il supporto legacy marking. Versioni recenti di paxctl rendono
chpax obsoleto.
|
Codice 6.1: paxctl -h |
usage: paxctl <options> <files>
options:
-p: disable PAGEEXEC -P: enable PAGEEXEC
-e: disable EMUTRMAP -E: enable EMUTRMAP
-m: disable MPROTECT -M: enable MPROTECT
-r: disable RANDMMAP -R: enable RANDMMAP
-x: disable RANDEXEC -X: enable RANDEXEC
-s: disable SEGMEXEC -S: enable SEGMEXEC
-v: view flags -z: restore default flags
-q: suppress error messages -Q: report flags in short format flags
|
La prima opzione che si nota è -v, che può visualizzare le flag impostate
su un binario specifico.
Codice 6.2: paxctl -v |
shell user # paxctl -v /usr/bin/Xorg
PaX control v0.2
Copyright 2004 PaX Team <pageexec@freemail.hu>
- PaX flags: -p-sM--x-eR- [/usr/bin/Xorg]
PAGEEXEC is disabled
SEGMEXEC is disabled
MPROTECT is enabled
RANDEXEC is disabled
EMUTRAMP is disabled
RANDMMAP is enabled
|
Questo mostra un binario XFree con tutte le protezioni disabilitate.
Per impostare le flag su un binario, la flag -z è utile in quanto
riporta le flag alla configurazione iniziale.
Per disabilitare le protezioni su Xorg, si deve eseguire il comando paxctl
-zpeMRxs /usr/bin/Xorg.
Si può giocare ad abilitare e disabilitare le protezioni per vedere le richieste
minime necessarie per far funzionare il sistema. Spesso si scoprirà che servirà
la combinazione -m -sp.
I contenuti di questo documento sono rilasciati sotto la licenza Creative
Commons - Attribution / Share Alike.
|