Salve a tutti
Come molti di voi sanno, il C è un linguaggio molto flessibile, questa flessibilità comporta il programmatore a dover prestare maggiore attenzione quando scrive del codice per una applicazione.
Oggi vi voglio mostrare un piccolo suggerimento su come evitare che la vostra applicazione possa diventare una applicazione potenzialmente vulnerabile al famoso "Buffer Overflow", e prenderò in esame un caso molto diffuso, cioè l'utilizzo errato della funzione strcpy().
La strcpy() consente di copiare una stringa in un altra stringa, per capirci meglio ecco un semplice esempio della strcpy():
#include "string.h"
#include "stdio.h"
int main(){
char stringa1[5]="ciao";
char stringa2[5];
strcpy(stringa2,stringa1); /* Copia stringa1 in stringa2, stringa2 è uguale a stringa1 */
printf("%s",stringa2);
return 0; }
Dopo questo esempio vi mostro una applicazione vulnerabile:
#include "string.h"
#include "stdio.h"
int main(int argc,char *argv[]){
char prova[6]="prova";
char stringa[5];
strcpy(stringa,argv[1]); /* Utilizzo errato della strcpy */
printf("%s",stringa);
printf("\n%s",prova);
return 0; }
Perchè questa applicazione è vulnerabile???
La risposta è semplice, poichè non viene fatto un controllo su argv[1], se l'utente da in input una stringa più lunga di 4 caratteri, i caratteri in eccesso non vengono tagliati, ma vengono copiati nell'area di memoria "proibita", questo comporta al "Buffer Overflow".
Suggerimenti:
Consiglio vivamente di fare dei controlli sull'input dell'utente, si potrebbe aggirare il problema con una soluzione di questo genere:
strncpy(str_destinazione,str_sorgente,n);
strncpy() è una funzione che svolge lo stesso lavoro della strcpy() , ma consente di specificare anche la lunghezza della stringa da copiare.
Questo ultimo parametro ci può aiutare ad aggirare il problema perchè se noi facessimo:
strncpy(stringa2,stringa1,sizeof(stringa2)-1)
In questo modo se avessimo stringa1>stringa2, i caratteri in eccesso di stringa1 verrebberò tagliati.
Ovviamente consiglio se utilizzate questo metodo, di rilasciare un messaggio all'utente così da informarlo che la stringa è stata tagliata.
Conclusioni
Poichè il C è sempre un linguaggio amato dai programmatori di tutto il mondo, è importante far sapere quanto sia flessibile, ma anche quanto sia molto facile commettere "sviste" o errori che poi portano a questi tipi di vulnerabilità, oltre al BufferOverflow vi è anche il Format Stirng, la quale è un altra vulnerabilità molto frequente.
Scrivere un software sicuro e/o perfetto non penso tutti ne siano all'altezza, anche i programmatori più esperti alcune volte inceppano in queste "sviste".
Un saluto e alla Prossima
Matteo