Un buffer overflow si verifica quando un programma che scrive dati in un buffer lo sovraccarica. È come versare 355 ml di latte in un bicchiere da 237 ml.
Dopo aver letto questo articolo sarai in grado di:
Argomenti correlati
Cos'è la sicurezza delle applicazioni Web?
Scraping di dati
Cross-Site Request Forgery (CSRF, richiesta intersito falsa)
Attacco brute-force
Perché usare HTTPS?
Abbonati a theNET, il riepilogo mensile di Cloudflare sulle tematiche più discusse in Internet.
Copia link dell'articolo
Un buffer overflow è un'anomalia che si verifica quando un software, scrivendo dati in un buffer, ne supera la capacità, causando la sovrascrittura di posizioni di memoria adiacenti. In altre parole, si stanno passando troppe informazioni a un contenitore che non ha spazio sufficiente, e tali informazioni finiscono per sostituire i dati nei contenitori adiacenti.
I buffer overflow possono essere sfruttati dagli aggressori per modificare la memoria di un computer al fine di compromettere un programma o assumere il controllo della sua esecuzione.
Un buffer, o buffer di dati, è un'area di memoria fisica utilizzata per archiviare temporaneamente dei dati mentre vengono spostati da una posizione all'altra. Questi buffer risiedono in genere nella memoria RAM. I computer utilizzano frequentemente i buffer per migliorare le prestazioni; la maggior parte dei moderni dischi rigidi sfrutta il buffering per accedere efficientemente ai dati e molti servizi online utilizzano anch'essi i buffer. Ad esempio, sono frequentemente utilizzati nello streaming video online per prevenire interruzioni. Quando un video è riprodotto in streaming, il lettore video scarica e memorizza circa il 20% del video alla volta in un buffer, per poi riprodurlo da quest'ultimo. In questo modo, lievi cali della velocità di connessione o brevi interruzioni del servizio non influiranno sulle prestazioni dello streaming video.
I buffer sono progettati per contenere quantità specifiche di dati. A meno che il programma che utilizza un buffer non disponga di istruzioni integrate per scartare i dati quando gliene vengono inviati troppi, il programma sovrascriverà i dati nella memoria adiacente al buffer.
I buffer overflow possono essere sfruttati dagli aggressori per danneggiare un software. Nonostante siano ben compresi, gli attacchi di buffer overflow sono ancora un problema di sicurezza importante che affligge i team di sicurezza informatica. Nel 2014, una minaccia nota come "Heartbleed" ha esposto centinaia di milioni di utenti ad attacchi a causa di una vulnerabilità di buffer overflow nel software SSL
Un aggressore può deliberatamente fornire a un programma un input, attentamente progettato, che induca il programma a tentare di memorizzarlo in un buffer di dimensioni insufficienti, sovrascrivendo le porzioni di memoria adiacenti. Se il layout della memoria del programma è ben definito, un attaccante può sovrascrivere deliberatamente aree note per contenere codice eseguibile. L'attaccante può quindi sostituire questo codice con il proprio codice eseguibile, alterando drasticamente il funzionamento atteso del programma.
Ad esempio, se la porzione sovrascritta in memoria contiene un puntatore (un oggetto che punta a un'altra posizione in memoria), il codice dell'attaccante potrebbe sostituire tale codice con un altro puntatore che punta a un payload dannoso. Questa azione può trasferire il controllo dell'intero programma al codice dell'attaccante.
Alcuni linguaggi di programmazione sono più suscettibili al buffer overflow di altri. C e C++ sono due linguaggi molto diffusi e con un'alta vulnerabilità, poiché non integrano protezioni contro l'accesso o la sovrascrittura dei dati nella memoria. Windows, Mac OSX e Linux contengono tutti codice scritti in uno o entrambi questi linguaggi.
Linguaggi più moderni come Java, PERL e C# dispongono di funzionalità integrate che contribuiscono a ridurre le possibilità di buffer overflow, ma non possono prevenirlo completamente.
Per fortuna, i moderni sistemi operativi dispongono di protezioni runtime che aiutano a mitigare questo tipo di attacchi. Analizziamo due protezioni comuni che contribuiscono a mitigare il rischio di exploit:
Gli sviluppatori di software possono adottare precauzioni contro le vulnerabilità di buffer overflow scrivendo in linguaggi che offrono protezioni integrate, oppure inserendo procedure di sicurezza specifiche nel loro codice.
Nonostante le precauzioni, gli sviluppatori continuano a scoprire nuove vulnerabilità di buffer overflow, a volte a seguito di un exploit riuscito. Quando vengono scoperte nuove vulnerabilità, i tecnici devono correggere il software interessato e garantire che gli utenti del software abbiano accesso alla patch.
Esistono svariati attacchi di buffer overflow che utilizzano diverse strategie e prendono di mira diverse porzioni di codice. Di seguito sono elencati alcuni tra i più noti.
*I computer utilizzano due diversi modelli di allocazione della memoria, noti come stack e heap; entrambi risiedono nella RAM del computer. Lo stack è ben organizzato e trattiene i dati seguendo un modello LIFO (Last-In, First-Out). L'ultimo dato inserito nello stack sarà il primo a essere estratto, proprio come l'ultimo proiettile inserito in un caricatore sarà il primo a essere sparato. L'heap è un pool disorganizzato di memoria aggiuntiva; i dati non entrano né escono dall'heap in un ordine particolare. Poiché l'accesso alla memoria dallo stack è molto più veloce dell'accesso dalla memoria heap, l'heap è generalmente riservato a blocchi di dati più grandi o a dati che un programmatore desidera gestire esplicitamente.