Gentoo Logo

Introduzione a Gentoo Hardened

Indice:

1.  Introduzione

Questa guida è indicata per chi non conosce a fondo il progetto Gentoo "Hardened" ("temprato,indurito", ndT) , quali sono le possibilità che offre, come queste interagiscono e quali sono i loro rispettivi compiti all'interno del progetto.

La nozione principale sulla sicurezza su cui si pone l'accento è quello dei livelli di sicurezza. I livelli sono fondamentali nel garantire che il sistema di un utente non venga compromesso, e nel caso in cui ciò accada, nel minimizzare i possibili danni. Combinando una serie di tecnologie diverse, benchè tutte incentrate sulla sicurezza, si obbliga l'attaccante a superare ulteriori prove per compromettere un sistema. Per questo motivo si raccomanda sempre di decidere quali siano le proprie necessità e di combinare tali soluzioni per proteggere il proprio sistema. In questa guida si cercherà di esporre le varie opzioni disponibili e come queste si possano utilizzare contemporaneamente.

Gentoo Hardened non è un prodotto nè la soluzione in sé, ma è semplicemente un progetto in cui un gruppo di sviluppatori lavora insieme per raggiungere l'obiettivo di una migliore sicurezza. I sotto-progetti contenuti in Gentoo Hardened non hanno nessun altro legame tra loro se non quello di appartenere allo stesso progetto. Si può pensare a questo allo stesso modo per cui KDE e GNOME fanno entrambi parte del progetto desktop e hanno un obiettivo comune, ma sono comunque indipendenti l'uno dall'altro.

Nota: Chiedere aiuto per l'installazione o l'assistenza di un sistema 'Gentoo Hardened' non è chiaro e dovrebbe sempre essere specificato se si tratta di un problema relativo a SELinux, relativo a PIE/SSP e così via...

2.  Tecnologie Offerte

PaX

Il cuore del progetto è PaX. PaX è una patch del kernel che permette di proteggersi da attacchi di tipo buffer o heap overflow e simili. PaX è la prima linea di difesa.

A causa di software mal progettato si è sempre a rischio di compromissione da parte di attacchi chiamati buffer e heap overflow; questi tipi di overflow sono causati dalla mancanza di controlli sull'input inserito dall'utente in un'applicazione. Quando l'attaccante è in grado, in un'applicazione, di immettere input che viene inserito in memoria senza essere prima controllato, nasce la possibilità di un overflow. Linguaggi di programmazione a basso livello come C o C++ non proteggono automaticamente dai buffer overrun, e il risultato è che quando si inseriscono più dati di quanti il buffer ne possa contenere, il codice eseguibile ad esso adiacente può essere sovrascritto con l'input dell'utente. Questo normalmente dovrebbe causare il crash dell'applicazione se l'input dell'utente non è comprensibile alla macchina. Generalmente questo problema si manifesta in un page fault, in quanto i caratteri che hanno superato la dimensione del buffer e sono interpretati come codice eseguibile vengono trattati come un indirizzo che probabilmente non esiste. Questo è l'effetto meno nocivo di un overrun.

Se l'attaccante conosce la presenza di un overrun, tuttavia, ha la possibilità di aggiungere all'input un shellcode ed invece di causare il crash dell'applicazione, può fare in modo che esso esegua istruzioni arbitrarie. Questo accade perchè i shellcode sono la modalità con cui le istruzioni vengono salvate in memoria per l'esecuzione da parte del processore. In pratica il shellcode consiste in 'opcodes', codici in linguaggio macchina che specificano l'operazione prossima ad essere eseguita; questi vengono tradotti in routine assembly. L'attaccante ha un'ottima conoscenza di questi opcode ed è in grado di creare un shellcode che gli permette di fare qualunque cosa desideri, come ad esempio aprire una shell root e associarla ad una porta. Quando questo accade, l'utente non ne è minimamente consapevole poichè l'applicazione non termina, ed invece comincia ad eseguire il codice arbitrario dell'attaccante permettendogli qualunque azione sul sistema. PaX attenua questo problema allocando in modo casuale ogni funzione e buffer dell'applicazione in memoria. Questa tecnica è chiamata ASLR (Address Space Layout Randomization) ed è la base fondamentale su cui si fonda PaX. Avendo offset, cioè posizioni nella memoria, casuali per le funzioni e i buffer, l'attaccante non è in grado di creare un input che gli assicuri l'esecuzione del shellcode (rendendo invece quest'operazione molto difficile in quanto probabilmente l'applicazione andrà in crash e verrà riavviata con nuovi offset). L'ASLR è ancora più utile se utilizzata con codice PIE (Position Indipendent Executable, cioè eseguibile indipendente dalla posizione) ma funziona anche con codice standard pena un overhead.

PaX inoltre offre la possibilità di avere sia segmenti di codice che hanno permessi di esecuzione e non di scrittura che segmenti che hanno permessi di scrittura e non di esecuzione. Questa tecnica è chiamata pageexec. Nei processori basati su x86 non è possibile utilizzarla a livello hardware in quanto gli sviluppatori dell'x86, per risparmiare spazio, hanno deciso di utilizzare la stessa flag per segnalare i permessi di scrittura e di esecuzione. Dato che una zona di memoria può essere o scrivibile o leggibile ed eseguibile non è molto utile togliere i permessi di esecuzione ai buffer perchè questo li renderebbe non più leggibili. Per questa ragione, su x86 PaX emula questo comportamento a livello software, introducendo un overhead ma incrementando di molto la sicurezza.

PIE/SSP

Per aumentare la chiarezza, anche se generalmente si parla di PIE e SSP come di un'unica entità perchè entrambi fanno parte della toolchain hardened, bisogna chiarire che sono senz'altro tecnologie diverse con diversi obiettivi. PIE, di per sé, non fornisce misure di sicurezza aggiuntive, ma quando è combinata nel kernel con PaX diventa un mezzo molto potente per difendersi contro gli overflow. SSP è invece interamente implementato a livello utente e protegge contro gli attacchi che hanno come obiettivo lo stack senza il supporto del kernel. Dato che PIE e SSP sono implementati separatamente e fanno cose diverse, sono indubbiamente due diversi livelli di protezione: per esempio, un attacco chiamato ret2libc che potrebbe superare PaX, sarebbe fermato da SSP.

Si sono dovute superare molte difficoltà per fornire agli utenti un modo semplice per creare un ambiente interamente costituito da codice PIE in cui si possa usufruire dell'ASLR con overhead minimo. Oltre a PIE, la toolchain 'hardened' è dotata anche di SSP (Stack Smashing Protection). Per proteggere dallo stack smashing, SSP alloca un'area di memoria all'esterno dei buffer e vi inserisce un canary (o un marker) casuale crittografato. Questo permette all'SSP di controllare se il canary è stato sovrascritto dopo ogni fase di scrittura nel buffer e se ciò è accaduto, di terminare l'applicazione. La toolchain hardened fornisce nel modo più facile possibile un ambiente PIE/SSP a livello utente. Gli stage denominati 'hardened' sono stage standard compilati con PIE e SSP e non includono controlli degli accessi di tipo SELinux, RSBAC e grsecurity.

Controllo obbligatorio degli accessi

Se PaX è il primo livello di protezione, forse anche il secondo o il terzo se si dispone di un firewall e/o di un sistema di rilevazione delle intrusioni, si raccomanda fortemente di utilizzare il controllo degli accessi per rendere ancora più sicuro il proprio sistema. È molto importante rendersi conto che il controllo degli accessi rappresenta l'ultimo livello di protezione. Il controllo degli accessi è molto utile per porre dei limiti ad attaccanti che hanno già ottenuto accesso al vostro sistema, o ad utenti locali. Al momento attuale Gentoo Hardened supporta tre soluzioni di controllo: SELinux, grsecurity e RSBAC.

Se si desidera utilizzare grsecurity non ci si deve preoccupare di quale stage sia stato utilizzato perchè esso non richiede modifiche nello spazio utente. Si deve semplicemente utilizzare lo stage hardened e compilare il kernel utilizzandone uno in cui grsecurity sia attivo, come ad esempio quello hardened-sources. Una volta che il sistema è in funzione, si può utilizzare la "learning mode" di grsecurity per costruire la lista di controllo degli accessi per il proprio sistema.

Come per grsecurity, anche RSBAC non richiede nessuna modifica nello spazio utente ma può essere installato dopo aver configurato un sistema Gentoo standard. RSBAC è supportato dal kernel rsbac-sources. Quando il sistema funziona, è possibile scegliere tra i vari modelli di controllo degli accessi che offre RSBAC, dal momento che sono costituiti da moduli. La documentazione Gentoo su RSBAC riporta una lista dei vari modelli offerti insieme ad una descrizione più esauriente di ognuno di essi.

Oltre ai due livelli di sicurezza che sono stati descritti, ne verrano sicuramente aggiunti altri in futuro. Esempi di livelli aggiuntivi sono la prevenzione / rilevamento delle intrusioni, che diventerebbe il primo livello addirittura prima di PaX. Dischi e swap criptati, che offrono una protezione dalle vulnerabilità 'fisiche' della sicurezza. Auditing, che permetterebbe di vedere e agire contro le minacce prima che queste possano compromettere il sistema. Il traffico criptato nelle reti e misure rigide di autenticazione sono ulteriori livelli di sicurezza supportati appieno dalla maggior parte delle installazioni Linux ma qui non verranno trattati a fondo.

3.  Risorse

Progetto Homepage progetto Pagina progetto Gentoo
PaX http://pax.grsecurity.net http://hardened.gentoo.org/pax-quickstart.xml
PIE Non disponibile Non disponibile
SSP http://www.trl.ibm.com/projects/security/ssp/ Non disponibile
SELinux http://www.nsa.gov/selinux http://hardened.gentoo.org/selinux
grsecurity http://www.grsecurity.net http://www.gentoo.org/proj/it/hardened/grsecurity.xml


Stampa

Aggiornato il 7 febbraio 2007

Oggetto: Introduzione a Gentoo Hardened.

Joshua Brindle
Autore

Adam Mondl
Contributi

Ned Ludd
Redazione

Ju Liu
Traduzione

Donate to support our development efforts.

Copyright 2001-2014 Gentoo Foundation, Inc. Questions, Comments? Contact us.