Abbiamo accennato ad alcune caratteristiche del linguaggio C, esso prevede che il programmatore si faccia carico della correttezza e integrità dei dati, se questo controllo fosse demandato al compilatore gli eseguibili ottenuti sarebbero molto più voluminosi e lenti. Questa vicinanza del C al linguaggio macchina consente di aumentare il controllo sull' hardware e di conseguenza l'efficienza del software prodotto, il rovescio della medaglia è che ciò può tradursi in vulnerabilità ai buffer overflow e perdite di memoria.Ad esempio, se viene allocato spazio in memoria per delle variabili,non esiste un sistema automatico per assicurare che i contenuti trovino posto nello spazio previsto a contenerli. Questa è l essenza del "buffer overflow", è da notare che i dati in eccesso potrebbero sovrascrivere zone della memoria adiacenti, fatto che potrebbe essere sfruttato per eseguire codice arbitrario.Ma esaminiamo il fenomeno con più calma, prendete questo semplice programma in C:
void copia(char* prov){
char buff[20];
strcpy(buff,prov);
}
int main(){
char over[100];
for(k=0;k<100;k++){
over[i]='T';
}
copia(over);
exit(0);
}
char buff[20];
strcpy(buff,prov);
}
int main(){
char over[100];
for(k=0;k<100;k++){
over[i]='T';
}
copia(over);
exit(0);
}
In questo esempio , si cerca di copiare il contenuto di un buffer di 100 caratteri in uno che ne può contenere soltanto 20, quando lo si compila va tutto bene , ma quando lo si esegue otterrete un errore di "Segmantation fault", il che indica che mancando lo spazio necessario il buffer ha "straripato" dalla sua memoria allocata provocando il crash. Immaginate un programma che prevede un campo per l 'inserimento di user-name senza un controllo attento sui dati in ingresso, magari funziona bene per anni, poi un hacker potrebbe provare ad inserire una stringa di migliaia di caratteri in un campo destinato a ospitarne al massimo 30,e mandare il tutto in crash.L' obiettivo di un hacker di rado di limita a mandare in crash un programma, ma piuttosto a prendere il controllo di un sistema, nei prossimi articoli scopriremo come questo è possibile sfruttando il buffer overflow sullo stack.
Nessun commento:
Posta un commento