Un modello integrato control-flow e data-flow per il rilevamento ...
Un modello integrato control-flow e data-flow per il rilevamento ...
Un modello integrato control-flow e data-flow per il rilevamento ...
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
26 3. <strong>Un</strong> <strong>modello</strong> che integra <strong>control</strong> <strong>flow</strong> e <strong>data</strong> <strong>flow</strong><br />
“la funzione log event() può scrivere nel log-f<strong>il</strong>e che un utente ha fallito<br />
l’autenticazione oppure che un client ha inviato una richiesta malforma-<br />
ta”.<br />
Questo <strong>per</strong>mette ad un ipotetico attaccante di costruire attacchi tali che <strong>il</strong> pro-<br />
gramma, pur rimanendo all’interno del <strong>control</strong> <strong>flow</strong> ammesso, riporti informazioni<br />
diverse da quelle che normalmente dovrebbe riportare. Nel contesto di un processo<br />
industriale critico, questo potrebbe rappresentare un notevole problema. Sarebbe<br />
ideale quindi riuscire a far si che le informazioni <strong>data</strong> <strong>flow</strong> che vengono apprese siano<br />
qualcosa di più dettagliato, qualcosa del tipo<br />
“la funzione log event(), se chiamata dal codice che si occupa dell’au-<br />
tenticazione può scrivere nel log-f<strong>il</strong>e che un utente ha inserito la password<br />
errata, mentre se chiamata dal codice di dialogo col client può scrivere<br />
che un client ha inviato una richiesta malformata”.<br />
L’osservazione fondamentale che consente questo miglioramento è che una chiama-<br />
ta di sistema è caratterizzata in modo molto più preciso se, invece di considerare<br />
soltanto la sua posizione assoluta nel codice, si considera anche <strong>il</strong> contesto in cui è<br />
eseguita, ovvero la sequenza di record di attivazione che la precedono sullo stack.<br />
Nei due casi si osserveranno sequenze differenti e questo consente di capire che si<br />
è arrivati a log event() da due strade diverse. L’informazione relativa allo stack<br />
viene già raccolta <strong>per</strong> la costruzione dell’execution graph e dunque vale la pena far<br />
si che ne benefici anche <strong>il</strong> <strong>modello</strong> <strong>data</strong> <strong>flow</strong>. In questo modo, <strong>per</strong> un ipotetico IDS<br />
costruito con queste tecniche, è immediato capire da dove proviene la richiesta di<br />
inserire un messaggio nel log-f<strong>il</strong>e e quindi capire se quel messaggio è lecito oppure<br />
no. Vediamo, nella pratica, come può presentarsi questo scenario.<br />
3.1.1 Primo scenario: vulnerab<strong>il</strong>ità nel codice<br />
Nel programma della Figura 3.1 è presente un evidente buffer over<strong>flow</strong>, dovuto al-<br />
l’uso non sicuro della funzione strcpy(). Il buffer over<strong>flow</strong> <strong>per</strong>mette di eseguire<br />
codice arbitrario e, nel caso <strong>il</strong> programma sia installato setuid root, <strong>per</strong>mette ad un<br />
attaccante di prendere <strong>il</strong> <strong>control</strong>lo completo del sistema. <strong>Un</strong> attacco tramite buffer<br />
over<strong>flow</strong> fatto nel modo standard tuttavia viene immediatamente r<strong>il</strong>evato anche dal<br />
più semplice FSA (Figura 3.2). Quello che <strong>per</strong>ò l’FSA non può r<strong>il</strong>evare è un attacco<br />
che, iniettando codice opportuno in buf, esegue un numero arbitrario di chiamate<br />
a put str() (e quindi a write) con parametri arbitrari. Le cose non migliorano di