Cos'è un buffer overflow?

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.

Obiettivi di apprendimento

Dopo aver letto questo articolo sarai in grado di:

  • Definire un buffer
  • Spiegare cosa è il buffer overflow e come può essere utilizzato in un attacco informatico
  • Capire chi è più vulnerabile e come proteggersi da questo tipo di attacchi

Argomenti correlati


Vuoi saperne di più?

Abbonati a theNET, il riepilogo mensile di Cloudflare sulle tematiche più discusse in Internet.

Fai riferimento all'Informativa sulla privacy di Cloudflare per scoprire come raccogliamo ed elaboriamo i tuoi dati personali.

Copia link dell'articolo

Cos'è un buffer overflow?

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.

Overflow del buffer

Che cos'è un buffer?

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

In che modo gli aggressori sfruttano i buffer overflow?

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.

Chi è vulnerabile agli attacchi di buffer overflow?

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.

Come proteggersi dagli attacchi di buffer overflow

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:

  • Randomizzazione dello spazio degli indirizzi: riorganizza in modo casuale le posizioni dello spazio degli indirizzi delle aree dati chiave di un certo processo. Gli attacchi di buffer overflow si basano generalmente sulla conoscenza della posizione esatta di codice eseguibile importante; la randomizzazione degli spazi di indirizzi rende questa conoscenza quasi impossibile.
  • Prevenzione dell'esecuzione dei dati: contrassegna determinate aree di memoria come eseguibili o non eseguibili, impedendo a un exploit di eseguire codice presente in un'area non eseguibile.

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.

Quali sono i diversi tipi di attacchi di buffer overflow?

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.

  • Attacco di overflow dello stack. Si tratta del tipo più comune di attacco di buffer overflow e comporta l'overflow di un buffer nello stack delle chiamate*.
  • Attacco di overflow dell'heap - Questo tipo di attacco prende di mira i dati nel pool di memoria aperto noto come heap*.
  • Attacco di overflow di numeri interi: in un overflow di numeri interi, un'operazione aritmetica produce un numero intero troppo grande per essere memorizzato nel tipo di dato intero designato; questo può causare un buffer overflow.
  • Overflow Unicode: un overflow Unicode crea un buffer overflow inserendo caratteri Unicode in un input che prevede caratteri ASCII. ASCII e Unicode sono standard di codifica che consentono ai computer di rappresentare il testo. Ad esempio, la lettera "a" è rappresentata dal numero 97 in ASCII Mentre i codici ASCII coprono solo i caratteri delle lingue occidentali, Unicode può creare caratteri per quasi tutte le lingue scritte presenti nel pianeta. Poiché ci sono molti più caratteri disponibili in Unicode, molti caratteri Unicode sono più grandi del carattere ASCII più grande.

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