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 ...
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
2.2. Modelli <strong>data</strong> <strong>flow</strong> 17<br />
• se v è Exit(f) semplicemente si rimuove v<br />
• se v non riguarda una chiamata di funzione ma una system call si toglie v e si<br />
inserisce s ∈ Σ e non-deterministicamente si sceglie w : (v, w) ∈ E e si inserisce<br />
w<br />
Se invece s si trova sulla cima dello stack si verifica che s = s ′ , dove s ′ è <strong>il</strong> simbolo<br />
corrente dell’input. Se l’uguaglianza è verificata si estrae s dallo stack e si procede,<br />
altrimenti si entra in uno stato d’errore che viene segnalato.<br />
2.2 Modelli <strong>data</strong> <strong>flow</strong><br />
I precedenti modelli visti focalizzano la loro attenzione esclusivamente sul flusso di<br />
<strong>control</strong>lo del programma, senza tenere in alcuna considerazione i dati (ovvero i pa-<br />
rametri) coinvolti nelle chiamate di sistema. Tuttavia monitorare anche i parametri<br />
si rivela di notevole importanza. Si prenda ad esempio un attacco che sfrutta una<br />
race condition del tipo TOCTTOU (Time of check to time of use) dove una risorsa<br />
riferita da un nome cambia tra <strong>il</strong> momento in cui viene fatto un test e <strong>il</strong> momento<br />
in cui viene usata (si veda l’esempio di Figura 2.5). In un attacco come questo le<br />
chiamate di sistema fatte da un programma sono sempre le stesse ma l’interpreta-<br />
zione dei loro parametri in un momento piuttosto che in un altro è completamente<br />
diversa.<br />
if (access("f<strong>il</strong>e", W_OK) != 0) {<br />
exit(1);<br />
}<br />
/* In questo esatto momento in un altro processo un<br />
attaccante esegue symlink("/etc/passwd", "f<strong>il</strong>e"); */<br />
fd = open("f<strong>il</strong>e", O_WRONLY);<br />
write(fd, buffer, sizeof(buffer));<br />
Figura 2.5: Time to check to time of use.<br />
<strong>Un</strong> altro scenario è quello delineato in [4]. Gli autori notano che chi attacca<br />
un sistema attualmente è concentrato su metodologie che portano <strong>il</strong> processore ad<br />
eseguire codice in qualche modo estraneo al programma (<strong>control</strong> <strong>data</strong> attacks: buffer<br />
over<strong>flow</strong>, heap over<strong>flow</strong>, return-to-libc,... ricadono in questa categoria). Da questa<br />
osservazione si chiedono se, nel momento in cui <strong>il</strong> <strong>control</strong> <strong>flow</strong> è protetto, diventa