03.06.2013 Views

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 ...

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!