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

 


 

 

 

Previous Page

Next Page