Buffer overflow

Da Wikipedia, l'enciclopedia libera.
bussola Disambiguazione – Se stai cercando il buffer overflow legato alle telecomunicazioni, vedi Buffer overflow (telecomunicazioni).

In informatica il buffer overflow è una condizione di errore che si verifica a runtime quando in un buffer di una data dimensione vengono scritti dati di dimensioni maggiori. Quando questo accade viene sovrascritta parte della zona di memoria immediatamente adiacente al buffer in questione, con diversi effetti possibili a seconda di dove è situato il buffer e di come è organizzata la memoria in quella particolare piattaforma software; in alcuni programmi software questo provoca delle vulnerabilità di sicurezza. I linguaggi managed, cioè basati su un modello di memoria gestito a runtime come Java, dovrebbero in teoria essere immuni da questo tipo di errore, ma in pratica la possibilità rimane presente in caso di chiamate a codice nativo, o a causa di bug del modulo manager (la JVM nel caso di Java) o del compilatore JIT.

Descrizione[modifica | modifica wikitesto]

Quando, per errore o per malizia, vengono inviati più dati della capienza del buffer destinato a contenerli (che per errore, malizia o superficialità non è stato progettato a dovere), i dati extra vanno a sovrascrivere le variabili interne del programma, o il suo stesso stack; come conseguenza di ciò, a seconda di cosa è stato sovrascritto e con quali valori, il programma può dare risultati errati o imprevedibili, bloccarsi, o (se è un driver di sistema o lo stesso sistema operativo) bloccare il computer. Conoscendo molto bene il programma in questione, il sistema operativo e il tipo di computer su cui gira, si può precalcolare una serie di dati malevoli che inviata per provocare un buffer overflow consenta ad un malintenzionato di prendere il controllo del programma (e a volte, tramite questo, dell'intero computer).

Questo tipo di debolezza dei programmi è noto da molto tempo, ma solo di recente la sua conoscenza si è diffusa tanto da permettere anche a dei cracker capaci di sfruttarla per bloccare o prendere il controllo di altri computer collegati in rete. Non tutti i programmi sono vulnerabili a questo tipo di inconveniente: perché un dato programma sia a rischio è necessario che:

  1. il programma preveda l'input di dati di lunghezza variabile e non nota a priori;
  2. li immagazzini entro buffer allocati nel suo spazio di memoria dati vicini ad altre strutture dati vitali per il programma stesso;
  3. il programmatore non abbia implementato alcun mezzo di controllo della correttezza dell'input in corso.
  4. l'area di memoria dello stack sia eseguibile, se si tenta di scrivere dello shellcode sullo stack; questo non è vero sui computer più recenti dotati di NX bit

La prima condizione è facilmente verificabile, dalle specifiche del programma; la seconda e la terza invece sono interne ad esso e riguardano la sua completezza in senso teorico.

Stack overflow[modifica | modifica wikitesto]

Exquisite-kfind.png Per approfondire, vedi stack overflow.

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.

Heap overflow[modifica | modifica wikitesto]

Exquisite-kfind.png Per approfondire, vedi heap overflow.

L'heap overflow avviene quando vi è un eccesso di dati in ingresso nell'area heap della memoria. Solitamente i cracker generano volutamente degli heap overflow per perforare programmi scritti in modo non impeccabile.

Voci correlate[modifica | modifica wikitesto]

Sicurezza informatica Portale Sicurezza informatica: accedi alle voci di Wikipedia che trattano di Sicurezza informatica