E' fondamentale ai fini della sicurezza implementare dei tools propri o utilizzare tools di terze parti che possono analizzare l'applicativo prodotto.
E' altrettanto fondamentale utilizzare gli ultimi compilatori/linker/framework rilasciati e non utilizzare metodi bannati.
I compilatori di ultima generazione (C e C++) tendono a scrivere un messaggio di warning nel caso in cui il metodo che stiamo utilizzando non è sicuro (vedi i vari: strcat, sprintf etc)
Ricordiamoci comunque che tutti i tools che utilizzeremo non potranno mai analizzare il codice come un essere umano, sicuramente potranno venirci incontro con la maggior parte di bugs (almeno quelli più grossolani).
E' utile avere una secure coding checklist dove appunteremo i passi da seguire per ottenere almeno un risultato minimo in termini di sicurezza.
Test
Utilissimi per capire lo stato della nostra applicazione sono i test.
E' indubbio che scrivendo codice seguendo la metodologia agile del TDD porta ad avere codice testato almeno in fase di implementazione.
Ma è utile anche implementare dei test del tipo:
- Fuzz
- Penetration
- Run-time
Fuzz
La metodologia del Fuzz Tesing si basa nel creare un dato mal formattato che il nostro applicativo dovrà analizzare.
Solitamente questi dati possono esser di tre tipi:
- File
- Network protocol parsers
- APIs and micellaneous parsers
In tutti e tre i casi la procedura rimane la stessa.
Creare un dato mal formattato (dimensioni, dati sporchi, crc errato, file di grosse dimensioni etc) e darli in pasto all'applicativo a run-time.
Come fare è solamente questione di fantasia.
Possiamo avere una collezione di file errati, o possiamo creare un metodo che manda un pacchetto mal formattato etc.
Se l'applicativo muore durante questa fase di test, abbiamo trovato un bug e molto probabilmente un bug di sicurezza.
Penetration
In un test di tipo Penetration, viene simulato un attacco da parte di un'entità esterna al sistema.
Ovvero ci fingeremo cracker ed andremo ad analizzare il sistema dall'esterno alla ricerca di eventuali falle e, una volta trovate, si inizierà una fase di studio su com'è possibile sfruttarle.
Una volta capito come è possibile sfruttare la falla potremo scegliere la contromisura da usare.
Run-Time
Questa è l'ultima fase di test dove andremo ad usare applicativi come AppVerif per verificare i bugs presenti nella nostra applicazione.
Un tool simile che mette a disposizione Microsoft è Driver Verifier (Verifier.exe).