“Secure by design” è una metodologia per la creazione di applicazioni o sistemi informatici in cui tutti gli aspetti del software sono sviluppati intrinsecamente in un modo che rende difficile o impossibile per un utente malintenzionato danneggiare, attaccare o compromettere il sistema. In molti casi, il software sicuro per progettazione è progettato fin dal concepimento per chiudere anche le più piccole falle di sicurezza nelle funzioni elementari e per utilizzare tecniche classiche e affidabili durante la fase di codifica per garantire che nessun difetto venga portato in un prodotto finito. Alcune delle aree principali che sono al centro dell’ingegneria secure-by-design sono l’input dell’utente o del client, le comunicazioni sicure e la convalida di base per garantire che determinati tipi di attacchi siano resi impossibili. Sebbene nessuna applicazione informatica sia immune da tutti gli attacchi dannosi, un sistema secure-by-design presenta un netto vantaggio rispetto ai sistemi che utilizzano librerie di sicurezza esterne o si basano sulla sicurezza dell’ambiente circostante, come un sistema operativo, perché il design del il software è realizzato per prevenire e contenere gli attacchi di sfruttamento.
Una delle aree più vulnerabili di qualsiasi applicazione per computer, a causa della sua natura imprevedibile, è l’input dell’utente. L’input non convalidato, utilizzato senza controllo degli errori o accettato alla cieca da qualsiasi fonte può utilizzare il funzionamento interno di un sistema contro se stesso per esporre dati sensibili o causare l’arresto anomalo di un sistema. Quando un’applicazione è protetta per progettazione, l’input dell’utente di solito viene convalidato in qualche modo, controllato per sequenze dannose o persino convertito in un formato sicuro in modo che possa essere elaborato senza preoccuparsi di comportamenti imprevedibili che potrebbero derivare dall’elaborazione predefinita di alcune combinazioni di caratteri.
Il problema dell’input dell’utente diventa più complesso in un sistema sicuro per progettazione quando il software è un server che accetta input da un client attraverso una rete. Alcuni aggressori possono intercettare messaggi validi da un client a un server o falsificare completamente un client, quindi di solito vengono impiegati metodi diversi dalla crittografia proprietaria, perché un utente malintenzionato che intercetta i messaggi potrebbe facilmente violare la crittografia. Metodi di sicurezza più efficaci all’interno della progettazione di un programma includono la limitazione delle informazioni inviate da un client e la limitazione della capacità di un server o di un modulo in ciò che può o non può fare da solo.
Combinando la modularità del software con il principio del privilegio minimo, un sistema sicuro per progettazione può impedire agli aggressori di compromettere completamente un sistema delegando compiti tra moduli che non hanno necessariamente la capacità di eseguire da soli una singola azione distruttiva. In questo modo, possono essere messe in atto protezioni e sistemi di sicurezza che possono consentire a un sistema di riprendersi in modo sicuro da un’intrusione. Questo concetto è difficile da incorporare in un’applicazione che non utilizza principi sicuri in base alla progettazione, perché richiede che l’intera architettura del programma sia orientata verso l’obiettivo della sicurezza.