Il buffer overflow è un problema che può affliggere un programma
software. Consiste nel fornire al programma più dati di quanto esso si
aspetti di ricevere, facendo in modo che una parte di questi dati vadano
scritti in zone di memoria dove sono, o dovrebbero essere, altri dati o lo
stack del programma stesso. 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 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 dilettanti di sfruttarla per
bloccare o prendere il controllo di altri computer collegati in rete.
Un caso del genere si può verificare quando il programma non controlla in
anticipo la lunghezza dei dati in arrivo, ma si limita a scrivere il loro
valore in un buffer di lunghezza prestabilita, confidando che l'utente (o il
mittente) non immetta più dati di quanti esso ne possa contenere. Se invece,
per errore o per calcolo, vengono inviati più dati della capienza del buffer
destinato a contenerli, i dati extra vanno a sovrascrivere le variabili
interne del programma, o il suo stesso stack. Conoscendo molto bene il
programma in questione e il tipo di macchina 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
tramite questo dell'intero computer.
Non tutti i programmi sono vulnerabili a questo tipo di inconveniente:
perché un dato programma sia a rischio è necessario che:
- il programma preveda l'input di dati di lunghezza variabile e non nota a
priori;
- che li immagazzini entro buffer allocati nel suo spazio di memoria dati
vicini ad altre strutture dati vitali per il programma stesso;
- che il programmatore non abbia implementato alcun mezzo di controllo
della correttezza dell'input in corso.
La prima condizione è facilmente verificabile, dalle specifiche del
programma; le altre due invece sono interne ad esso e riguardano la sua
completezza in senso teorico.
Stack overflow
Lo stack overflow, come il buffer overflow, consiste nella
sovrascrittura dell'area dati del programma, ma questa volta non è causata da
un input di dati troppo lungo ma dall'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 adiacente.
|