4 - StackGuard
Questa sezione presenta una soluzione sistematica
al problema persistente degli attacchi di tipo buffer overflow. Con il progetto
Immunix, istituito dal Dipartimento di Informatica e Ingegneria dell'Università
dell'Oregon(USA), è nato StackGuard che si presenta come una semplice estensione
del compilatore atta a limitare i danni di un attacco da buffer overflow.
I programmi compilati con StackGuard sono sicuri da questo punto di vista.
Le modalità operative utilizzano una tecnica di compilazione che assicura
l'integrità dell'area di memoria contenente l'indirizzo di ritorno del record
d'attivazione della funzione.
4.1 - Integrità del record d'attivazione generato
dal compilatore
StackGuard si presenta come una piccola
patch da applicare a gcc che aggiunge del codice specifico al prologo e
all'epilogo di ogni funzione. Il codice aggiuntivo, inserito nel prologo,
piazza una canary word (diretta discendenza dai canarini
utilizzati nelle miniere del Galles) vicino all'indirizzo di ritorno nello
stack, come mostrato in figura 2:
![]() |
Figura 2 - Stack con Canarino
|
Il codice inserito nell'epilogo verifica
che la canary word sia intatta, prima di saltare all'indirizzo
di memoria a cui punta l'indirizzo di ritorno della funzione. In questo modo
se un attaccante dovesse tentare un'exploit,
come mostrato in figura 1, l'attacco verrebbe scoperto prima che il programma
possa eseguire codice maligno.
Un problema dell'approccio sopra descritto
è il seguente: un attaccante potrebbe leggere la canary word ed
incapsularla nella stringa utilizzata per rompere lo stack. In questo modo
riuscirebbe a sovrascrivere l'indirizzo di ritorno senza compromettere l'integrità
della canary word.
StackGuard utilizza tre metodi alternativi
per prevenire questo attacco:
Terminator Canary: è costituita da tutti i comuni simboli
di terminazione utilizzati dalle librerie standard del C: 0(null),
CR(carriage return), LF(line feed) e -1(EOF).
Un malintenzionato non potrebbe usare le
funzioni standard per leggere questi simboli ed incapsularli in una stringa,
poiché le funzioni di copia si fermerebbero alla prima occorrenza di uno di
questi caratteri.
Random Canary: La canary word è un semplice
numero casuale di 32 bit scelto al run-time. In questo modo, essa diventa un
segreto facile da usare, ma difficile da indovinare, poiché non è mai rivelata
e cambia ad ogni riavvio del programma.
Xor Random Canary: La versione 1.21 di StackGuard introduce
questo nuovo meccanismo di difesa. Come per il Random Canary, la canary
word consiste di un vettore di 128 bit casuali (quattro word scelte al
run-time), messi in XOR con l'indirizzo di ritorno. In questo modo, la canary
word viene legata all'indirizzo di ritorno della funzione attiva.
Programma Vulnerabile |
Risultato senza StackGuard |
Risultato con StackGuard |
Dip 3.3.7n |
Root shell |
Programma bloccato |
Elm 2.4
PL25 |
Root shell |
Programma bloccato |
Perl 5.003 |
Root shell |
Programma bloccato con uscita irregolare |
Samba |
Root shell |
Programma bloccato |
Super
Probe |
Root shell |
Programma bloccato con uscita irregolare |
umount 2.5k/libc 5.3.12 |
Root shell |
Programma bloccato |
wwwcount v2.3 |
Httpd shell |
Programma bloccato |
zgv 2.7 |
Root shell |
Programma bloccato |
|
||
Tabella
1 - Resistenza di StackGuard alle intrusioni. |
Risultati sperimentali hanno mostrato che StackGuard
realizza una protezione effettiva contro gli attacchi di stack smashing,
preservando le caratteristiche di compatibilità e utilizzo del
sistema protetto.
Nella tabella 1 vengono riportati dati riguardo
alla resistenza di StackGuard contro exploit
portati verso programmi con documentate vulnerabilità. I programmi non protetti da StackGuard,
ad un attacco di buffer overflow hanno fatto si che l'attaccante abbia potuto ottenere una shell
remota con i privilegi del programma vittima; i privilegi in questione sono di root, e il risultato
è una Root Shell.
Quando StackGuard protegge i programmi sopracitati, un tentativo
di attacco da parte di un malintenzionato termina nella maggior parte dei casi con un'uscita regolare
dovuta al rilevamento della morte del canarino; vi sono però casi in cui l'uscita del programma non è regolare.
Gli ideatori di StackGuard hanno compilato
un'intera distribuzione di Linux (Red Hat 5.1) usando il loro
applicativo, con risultati abbastanza incoraggianti. L'intero sistema è scaricabile
dal sito di Immunix.
Alla scoperta di nuove vulnerabilità di XFreee86-3.3.2-5
e lsof il sistema ha bloccato gli attacchi con successo. Le analisi
effettuate fin ora fanno pensare che l'approccio utilizzato sia valido anche
nei confronti di futuri attacchi.
In termini di overhead, i microbenchmark
hanno evidenziato un sostanziale incremento nel costo di ogni singola chiamata
a funzione. Successivi macrobenchmark su servizi di rete (il tipo di programma
che necessita protezione) hanno evidenziato un overhead totale trascurabile.
Il primo macrobenchmark utilizzava SSH
(secure shell) per misurare l'impatto di StackGuard sull'ampiezza di
banda, nel momento in cui un utente copia un grosso file passando
dall'interfaccia di loopback con il seguente comando:
scp bigsource localhost:bigdest
I risultati hanno mostrato che StackGuard
non peggiora il throughput di SSH.
Il secondo macrobenchmark effettuato
analizzava il peso di StackGuard sul web server Apache, che è senza
dubbio uno dei più validi candidati alla ricompilazione "protetta".
Se un server Apache fosse bucato, un intruso ne prenderebbe il controllo
e potrebbe leggere dati confidenziali, o cambiare completamente il contenuto
del sito web. Il costo della protezione di StackGuard è stato misurato usando WebStone,
che tiene traccia di vari aspetti di un web server, simulando un carico
generato da un vario numero di clients. I risultati comparati vengono mostrati
nella tabella 2.
Come con SSH, le
performance, con e senza StackGuard, sono praticamente identiche. Il server
"protetto" presenta un esiguo vantaggio per un numero di
clients piccolo, mentre la versione "non-protetta" vanta una
leggera superiorità quando gestisce un grande numero di clients. Comunque, nel
caso peggiore, il web server non protetto da StackGuard ha un vantaggio dell'8%
in connessioni per secondo. Dai risultati mostrati in tabella si potrebbe ipotizzare un
incremento delle prestazioni quando StackGuard protegge il web server Apache. Tuttavia gli autori del
macrobenchmark hanno attribuito questo fenomeno alle condizioni della rete al momento dei test.
StackGuard |
# di client |
Connessioni (per secondo) |
Latenza media (in secondi) |
Throughput (in Mbit/sec) |
No |
2 |
34.44 |
0.0578 |
5.63 |
No |
16 |
43.53 |
0.3583 |
6.46 |
No |
30 |
47.2 |
0.6030 |
6.46 |
Si |
2 |
34.92 |
0.0570 |
5.53 |
Si |
16 |
53.57 |
0.2949 |
6.44 |
Si |
30 |
50.89 |
0.5612 |
6.48 |
|
||||
Tabella
2 - Apache Web Server performance con e senza StackGuard |