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

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

4 1. Introduzione<br />

1 void g(void)<br />

2 {<br />

3 char buf[128];<br />

4 strcpy(buf, some_other_string);<br />

5 }<br />

6<br />

7 void f(void)<br />

8 {<br />

9 g();<br />

10 }<br />

Figura 1.2: Buffer over<strong>flow</strong>.<br />

copiati è possib<strong>il</strong>e scrivere oltre la fine del vettore, fino ad arrivare al record di<br />

attivazione della procedura g. Nel record di attivazione è memorizzato <strong>il</strong> punto<br />

del programma al quale restituire <strong>il</strong> <strong>control</strong>lo una volta che g è terminata: se lo<br />

sovrascriviamo con l’indirizzo di buf e in buf inseriamo del codice eseguib<strong>il</strong>e, esso<br />

verrà eseguito senza problemi. <strong>Un</strong>a buona prassi da seguire durante la stesura del<br />

codice consiste quindi nell’evitare di allocare vettori sullo stack e preferire l’ut<strong>il</strong>izzo di<br />

malloc(). Naturalmente questo non evita totalmente questo tipo di problemi, tant’è<br />

che dal buffer over<strong>flow</strong> (<strong>il</strong> tipo di attacco appena visto) si è passati ad altri attacchi<br />

più sofisticati che vanno sotto i nomi di jump to register, heap over<strong>flow</strong>, return into<br />

libc solo <strong>per</strong> citarne alcuni. Questo tipo di approccio ha avuto (ed ha) un successo<br />

tale che esistono dei framework (Metasploit) che <strong>per</strong>mettono la costruzione semi-<br />

automatica dell’attacco. Gli sforzi fatti <strong>per</strong> contrastare questo tipo di attacchi sono<br />

stati svariati e vanno da tecniche puramente software, tipo la Address Space Layout<br />

Randomization oppure lo Stack Protector di gcc a tecniche assistite dall’hardware,<br />

tipo <strong>il</strong> noto execute disable bit (XD) implementato nelle recenti CPU Intel e AMD.<br />

Nella stragrande maggioranza dei casi attaccare tramite l’iniezione di codice ma-<br />

levolo comporta l’esecuzione di chiamate di sistema estranee al normale flusso d’e-<br />

secuzione di un programma: <strong>per</strong> lanciare una shell ad esempio è necessario eseguire<br />

almeno una execve(). In Solaris è esistito un buffer over<strong>flow</strong> nel comando ping<br />

(CVE-1999-0056) che <strong>per</strong>metteva appunto l’esecuzione di codice arbitrario. Tale<br />

comando necessita di usare le raw socket, che <strong>per</strong>ò possono essere a<strong>per</strong>te solo dal<br />

su<strong>per</strong>utente: ping quindi era installato setuid root e dunque anche <strong>il</strong> codice inietta-<br />

to veniva eseguito a priv<strong>il</strong>egi elevati. Ora è chiaro che se ping esegue una execve,<br />

questo è un evento del tutto anomalo <strong>per</strong>ché <strong>per</strong> svolgere le sue funzioni <strong>il</strong> comando<br />

in questione non ha bisogno di lanciare in esecuzione alcun processo. Avendo questa

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

Saved successfully!

Ooh no, something went wrong!