Rilevare vulnerabilità nel codice C è hard science e rimane un problema aperto. Lo strumento più conosciuto per questo è ancora il cervello umano. Questa è chiamata recensione del codice . Questo tipo di cose funzionano è che ti occupi di mettere l'onere della prova sullo sviluppatore.
In effetti, la situazione comune è che lo sviluppatore ha prodotto il codice, quindi il revisore cerca di dare un senso a questo. Ma lo sviluppatore non aggiusterà nulla finché il revisore dimostrerà una vulnerabilità. Questo è ciò che accade in molti progetti software in cui i "recensori" sono "Internet in generale" e il fornitore di software propone una patch solo quando è stato trovato e pubblicato un vero e proprio exploit. Questo è abbastanza insoddisfacente.
Invece, chiedi allo sviluppatore di scrivere codice chiaro con molti commenti, in modo che un revisore con accesso al codice sorgente possa capire cosa fa il codice, e vedere perché i buffer non sono ovviamente sovrasfruttati. In queste condizioni la revisione del codice può essere efficiente, soprattutto perché costringe lo sviluppatore a avere una visione chiara del proprio compito.
Strumenti dinamici come Valgrind sono grandiosi come strumenti di debug, ma non così grandi nel rilevare potenziali vulnerabilità. Ti diranno se si è verificato un overflow del buffer durante i test , non se un potrebbe essersi verificato con dati di input diversi .
C è una lingua difficile perché devi pensare a tutto. Una fonte comune di buffer overflow in C è la gestione delle stringhe di caratteri, poiché C non ha stringhe di caratteri che valgono quel nome, solo una matrice di caratteri con la convenzione di uno zero terminale. Altri linguaggi di programmazione offriranno stringhe reali che possono essere concatenate e divise e condivise come se fossero semplici interi; tali stringhe evitano un sacco di buffer overflow semplicemente essendo molto più semplici da usare. Di couse, le stringhe semplici da usare richiedono una sorta di gestione automatica della memoria, che sia un garbage collector o conteggio dei riferimenti (in una certa misura, C ++ può fare il conteggio dei riferimenti per le stringhe, ma è comunque necessario riconvertire in array di caratteri quando si interagisce con il sistema operativo).
Nessuna delle risposte precedenti si applica direttamente al problema di rilevamento delle vulnerabilità nelle applicazioni esistenti. Mostra solo che il tuo compito è difficile . Si può dimostrare che è impossibile in tutte le generalità (non si possono mai rilevare automaticamente le vulnerabilità tutte ).