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