Io e TheZero abbiamo ben pensato di fare una guida sul Buffer Overflow, ovvero sulla tecnica ti Hacking più utilizzata per ottenere il controllo di un sistema. Premetto che il lavoro è di entrambi equo, nessuno dei due ha fatto più di un altro, quindi sicuramente dal testo capirete qual'è la parte scritta da me e quale scritta da lui ( se aveste letto qualcuna delle mie Guide allora lo capireste ), ma comunque, lascio la parola alle parole ( : ) : Guida al Buffer Overflow Molto spesso sulla rete si è sicuramente sentito parlare di "Buffer Overflow", ma di sicuro molte persone non sanno cos'è, o almeno sanno cos'è, però non riescono a comprendere l'utilità di esso e soprattuto come causarlo. Il Buffer Overflow non è altro che la tecnica di Hacking del Software più usate, nonchè la più potente, perchè esso agisce prevalentemente sul Software. Come le altre tecniche di Hacking, come per esempio il Defacing ( tecnica che implica il poter gestire un sito a proprio piacimento ) il Buffer Overflow serve per prendere il controllo di un sistema, attraverso l'utilizzo di Exploit a dovere ( cioè quelli giusti ), e con l'aiuto del Buffer Overflow, è possibile acquisire privilegi ( su quel sistema ) che di norma non possono essere assegnati a tutti gli utenti che utilizzano quel sistema. Infatti, in ogni sistema vi è un SUPERAMMINISTRATORE ( che sarebbe l'utente chiamato "root" nei sistemi Unix ), e poi la sottocategoria che è Utente normale, e Utente Guest ( quest'ultimo rispetto a quello prima, è l'utente che ha accesso solo ai files del sistema, però non può modificarli nè cambiarli ). Parlando del Buffer Overflow, ancora non ho detto in realtà cos'è...perchè prima è bene fare una precisazione : Ogni software è composto da una sequenza di BIT che legge il processore, e in base a COME IL PROCESSORE LEGGE quella sequenza, viene data una "risposta". In base al Software di cui il processore ne ha analizzato i BIT, e in base alla risposta che ha ottenuto dalla lettura dei BIT, avviene una determinata cosa. Ad esempio : Voi dovete cambiare l'immagine dello sfondo del vostro Desktop, il Processore legge i dati che voi gli state trasmettendo ( ovvero apertura finestre, scelta dell'immagine, e salvataggio di quest'ultima ). Esempio parecchio banale, però è utile : Comunque, alla fine il processore invierà al Computer ( Computer nel senso di "Schermo", cioè al Desktop ) la risposta finale, che corrisponderà a quella desiderata da voi. Ovvero che lo sfondo del vostro Desktop sarà cambiato. Adesso possiamo parlare del Buffer Overflow : Prendendo l'esempio di prima, ovvero del cambio dello Sfondo del proprio Desktop, mettiamo caso che per colpa di un Exploit ( perchè di Exploit esistono quelli per siti Web, e quelli per il Sistema Operativo ), i valori di ciò che facciamo vengano alterati ( cosa molto improbabile, perchè non esistono Exploit che alterano i valori di una sequenza di BIT che permette di cambiare l'immagine dello sfondo del Desktop xD, ma comunque, io sto facendo un esempio, voi potete decidere se capirlo o no ), dicevo, che se per colpa di un Exploit la sequenza di BIT che legge il processore dovesse essere alterata, il Processore invierà una risposta del tutto differente rispetto a quella di prima, e POTREBBE influire anche sull'intero funzionamento del Computer, perchè come credo voi sappiate, il Computer è tutto collegato, ovvero, se si danneggiasse la scheda video, non potremmo vedere nulla sul Desktop, e se non vediamo nulla sul Desktop allora non possiamo utilizzare nessun programma del Computer, e se non possiamo utilizzare nessun programma del Computer, non possiamo fare il nostro lavoro ( cioè quello che avevamo intenzione di fare ). Insomma, ogni parte del Computer è legata da un altra, e il processore deve interpretare la sequenza di BIT che ogni "azione" gli passa. Però non tutti i processi sono letti SOLO dal Processore, ci sono alcuni processi che prima passano dalla RAM ( memoria virtuale del Computer ) e poi passano al processore. Lo so che non avete capito, però adesso cercherò di farvelo capire meglio : Mettiamo caso che il processore debba leggere una stringa che contiene 10 caratteri di tipo NUMERICO, quindi non lettere. Attraverso il Buffer Overflow, è possibile alterare questa stringa, e di conseguenza si può andare in contro a vari problemi. Alterando questa sequenza di BIT, la stringa potrà contenere più di 10 valori ( che ciascuno occupa 1 BYTE, e in questo caso si parla di Buffer OVERFLOW ), oppure la stringa può essere "abbassata" di valori, nel senso che da 10 valori, potrebbe arrivare a 5-6 valori ( e qui allora si parla di Buffer UNDERFLOW ). Ecco alcuni esempi di Buffer Overflow : Un altro tipo di Buffer Overflow è quello legato alla memoria. Non tanto all'hardware, ma prevalentemente alla memoria del Computer. La memoria del Computer è composta da una parte chiamata STACK e l'altra chiamata HEAP. Di conseguenza è possibile effetturare un Buffer Overflow di HEAP e di STACK. La struttura del primo si estende verso il basso, e la sequenza del secondo si estende verso l'altro. Cosa vuol dire ? Vuol dire che prima che avvenga tutto quello che viene passato alla memoria dell'HEAP e alla memoria dello STACK avviene una cosa ben precisa, ovvero il caricamento dell'intera memoria in zone : - Prima zona ( o memoria di TEXT ) : che contiene il codice del programma in esecuzione ed è di sola lettura, infatti se si tentasse di scriverci sopra si incorrerebbe in un errore di Segmentation Fault. - Seconda Zona ( o memoria di HEAP ) : generalmente posto dopo la zona dati, in cui vengono memorizzate le variabili allocate dinamicamente. - Terza zona ( o memoria di STACK ) : che contiene le variabili locali, gli argomenti delle funzioni, le informazioni di stato del chiamante (ad esempio il contenuto di alcuni registri della CPU), l’indirizzo di ritorno necessario per poter ritornare dalla funzione corrente e altre informazioni. Naturalmente questi spazi non sono illimitati, bensì hanno una determinata lunghezza, dunque anche le variabili che vi verranno allocate dovranno rispettare tale lunghezza. Buffer Overflow di Heap : Heap overflow, o heap overrun, è un altro nome per indicare un buffer overflow che avvenga nell'area dati della heap. A differenza che nello stack, dove la memoria viene allocata staticamente, nella heap essa viene allocata in modo dinamico dalle applicazioni a run-time e tipicamente contiene dati dei programmi utente. Gli heap overflow solitamente vengono usati dai cracker per perforare programmi scritti in modo non impeccabile. L'attacco avviene come segue: se una applicazione copia dei dati senza preventivamente controllare se trovano posto nella variabile di destinazione, il cracker può fornire al programma un insieme di dati troppo grande per essere gestito correttamente, andando così a sovrascrivere i metadati (cioè le informazioni di gestione) della heap, prossimi alla destinazione dell'insieme di dati. In questo modo, l'attaccante può sovrascrivere una locazione arbitraria di memoria, con una piccola quantità di dati. Nella maggior parte degli ambienti, questo può fornire all'attaccante il controllo dell'esecuzione del programma. La vulnerabilità Microsoft JPEG GDI+ MS04-028 è un esempio del pericolo che uno heap overflow può rappresentare per un utente informatico. In sintesi, questa vulnerabilità permetteva, durante la visualizzazione di una immagine JPEG ed attraverso un buffer overrun, l'esecuzione di codice malevolo in remoto che, se eseguito nello spazio di un utente con privilegi di amministratore, permetteva all'attaccante di prendere il controllo dell'intero sistema. La metodologia di attacco solitamente varia a seconda delle diverse implementazioni delle funzioni di allocazione dinamica della memoria. Buffer Overflow di Stack : Lo stack overflow consiste ugualmente nella sovrascrittura dell'area dati del programma, ma questa volta la causa è l'attività del programma stesso: chiamando con dei parametri particolari una funzione ricorsiva del programma, questa accumula chiamate in sospeso sullo stack fino a riempirlo completamente e inizia a sovrascrivere la memoria vicina. Alla luce di tutto ciò,come si può evitare di finire vittima di un Buffer Overflow? Dopo averne studiato la morfologia,capiamo perchè avviene tutto ciò: quando, ad esempio, siamo di fronte ad un array (array[10]) e questo viene riempito con più dati di quanto possibile,avviene una scrittura di dati ove non sarebbe possibile normalmente inserirli. L'errore più comune è assegnare valori ad un indice inesistente (nel nostro esempio il n° 10 o successivi). Quali criteri dobbiamo adottare per evitare l'Overflow? Anzitutto concedere permessi corrispondenti al tipo d'attività che il programma eseguirà. Così si evita che una volta bucato il programma il malintenzionato abbia accesso alla root shell. Poi bisogna trattare con circospezione ogni input e controllarlo: vigilare sulle funzioni strcpy (estremamente pericolose) e ispezionare la lunghezza di un array può salvarci nella maggior parte dei casi. Nel corso degli anni è stato sviluppato anche un software (StackGuard) che sfrutta dati “canarino”,eseguendo un controllo di integrità sui dati prima di sfruttarli. Cosa potrebbe accadere se non vigilassi attentamente per proteggere il mio codice? Potrebbero ripetersi situazioni quali il JailBreak (usato dagli iphoners per ottenere il controllo completo del loro dispositivo) o lo sblocco della Wii,tutto sommato non tanto dannevoli. Ma potrebbe anche verificarsi lo scenario opposto: è il caso degli Overflow effettuati sull'invio degli Sms agli Smartphones,con il risultato di ottenere la rubrica ed altre informazioni personali del malcapitato; oppure di Internet Explorer,vituperato browser; o ancora WebServer o la JVM (Java Virtual Machine),che scritta in C permette di effettuare l'Overflow in un linguaggio che controlla rigidamente gli input come il Java sfruttando proprio le falle della piattaforma. Tutte situazioni spiacevoli,certamente da evitare. Diritti riservati a System32 e Th3Z3r0 |