Costruire una applicazione software è già un compito complesso di per se. Costruire una applicazione software sicura complica la situazione notevolmente!
Ecco dieci consigli da tenere in mente per sviluppare un’applicazione robusta e sicura, proteggendola da attacchi di hacker e cybercriminali.
1. Non fidarti mai
Ottenere un’applicazione sicura al 100% è un obiettivo ammirevole, ma irrealizzabile.
Ogni applicazione, indipendentemente dalla complessità o dalle tecnologie utilizzate, è vulnerabile ad attacchi informatici. Gli sviluppatori devono adottare tutte le misure di sicurezza possibili, ma ci saranno sempre falle di sicurezza che possono essere sfruttate. Anche i framework più testati e gli algoritmi più sicuri possono essere soggetti a vulnerabilità nascoste, quindi è importante NON FIDARSI MAI.
Se guidati da questo principio durante la progettazione e lo sviluppo, sarà più semplice riuscire a minimizzare i rischi dell’applicazione garantendo un alto livello di sicurezza.
2. Pianifica il progetto in modo sicuro
Molto spesso, nella progettazione di un’applicazione, l’attenzione viene posta esclusivamente sugli aspetti funzionali o di performance.
Tuttavia, la pianificazione dell’architettura, la scelta delle tecnologie, delle librerie, dei linguaggi utilizzati va effettuata anche in ottica di sicurezza e va presa in considerazione nella primissima fase di design, in modo da evitare rallentamenti e aumento di costi derivanti da modifiche “in corso d’opera”.
Nella scelta delle componenti va tenuto conto che:
- Esistono linguaggi di programmazione intrinsecamente più sicuri di altri
- Librerie e framework vanno scelti accuratamente, preferendo componenti largamente utilizzati, testati e aggiornati con frequenza
- La scelta dell’architettura e dell’organizzazione delle componenti deve essere orientata all’utilizzo delle tecniche e degli algoritmi di sicurezza più avanzati
3. Effettua il testing in maniera estensiva
In qualsiasi ciclo di sviluppo, la fase di testing è importante e non va assolutamente sottovalutata.
Il testing è necessario per identificare e correggere tutte le problematiche delle applicazioni prima che queste vengano rilasciate in produzione, in modo da proteggere adeguatamente la informazioni e garantire la continuità operativa.
L’analisi statica e dinamica del codice, il fuzzing, la code review e il penetration testing, sono esempi dei più comuni metodi di testing delle applicazioni nei diversi momenti del loro ciclo di vita. Sfruttare queste metodologie è la chiave vincente per essere confidenti che il proprio prodotto risulti sicuro nelle più disparate condizioni.
4. Automatizza i processi ripetitivi
I processi di sviluppo ripetitivi nascondono delle insidie pericolose.
Può capitare, per esempio, che per negligenza o per disattenzione alcuni passaggi vengano saltati o che alcuni step vengano eseguiti frettolosamente.
È consigliabile dunque, ove possibile, evitare che attività ripetitive vengano eseguite manualmente. Tutto quello che può essere automatizzato, va automatizzato. Dal testing alla distribuzione, tutto deve essere reso semplice e immediato.
Investire nell’automazione comporta sicuramente un effort, ma a lungo termine porta vantaggi significativi e permette di mantenere sotto controllo tutti i processi legati al progetto, evidenziando in modo efficace tutte le criticità. Inoltre, semplifica la vita agli sviluppatori, che possono concentrarsi su attività più impegnative.
5. Aggiorna il software
I sistemi operativi, i framework e le librerie di terze parti sono, anch’esse, soggette a vulnerabilità.
Aggiornare un’applicazione è una operazione necessaria, ma molte volte viene tralasciata o sottovalutata. A volte, questa operazione può essere tediosa, anche a causa di eventuali problemi di compatibilità che emergono e che richiedono la modifica o la riscrittura di parti di codice. In questo caso, è buona norma, eseguire le operazioni di aggiornamento frequentemente anche in modo da ridurne la complessità.
Aggiornare tutti i pacchetti e le dipendenze di un’applicazione richiede tempo e dedizione. Tuttavia, l’esecuzione periodica di questa attività rappresenta un tassello fondamentale nella prevenzione degli attacchi informatici, poichè riduce notevolmente la superficie d’attacco.
6. Utilizza la cifratura in maniera corretta
La protezione del dato è un aspetto fondamentale e spesso è legato al rispetto di normative e legislazioni.
Il dato deve essere opportunamente protetto in qualunque fase della sua conservazione, elaborazione e utilizzo.
Alcuni meccanismi di protezione come la cifratura, consentono, anche in caso di leak, di limitare I danni, rendendo il dato inutilizzabile esternamente. In questo caso è importante:
- Non sviluppare algoritmi di cifratura in proprio, ma basarsi sempre su algoritmi testati e noti
- Verificare sempre che le chiavi di cifratura siano gestite in modo corretto
- Studiare a fondo le librerie di crittografia scelte per evitare di configurarle in modo errato
- Utilizzare protocolli cifrati per la trasmissione (es. HTTPS)
7. Utilizza i log in modo estensivo
L’importanza dei log viene spesso sottovalutata.
Il logging non solo è utile per aiutare l’analisi dei malfunzionamenti dell’applicazione da parte degli sviluppatori ma è necessario per un insieme di attività di cyber security. Ad esempio, risulta essenziale per:
- Auditing delle attività degli utenti
- Rivelazione delle intrusioni
- Analisi forense
I log devono essere accurati, esaustivi e frequenti. Devono riportare le informazioni necessarie per poter ricostruire esattamente lo stato del sistema, ma allo stesso tempo non devono esporre informazioni sensibili quali dati privati, credenziali di autenticazione e informazioni legate al debug.
8. Applica il principio del “Least Privilege”
Ogni componente può esporre a rischi di compromissione. Una volta compromesso, le azioni che un attaccante può portare avanti dipendono anche dai privilegi del componente stesso.
Per questo, ogni componente deve avere assegnato il set minimo di privilegi necessari al suo funzionamento, nulla in più. E’ buona prassi quindi verificare che ogni componente non abbia mai più privilegi o più capacità di quelle necessarie per poter eseguire i suoi task.
Questo passaggio deve avvenire soprattutto nelle fasi di refactoring del codice, dove le componenti possono cambiare in parte le loro funzionalità, e potrebbero essere dimenticati dei privilegi per delle azioni che quel componente non deve più compiere.
9. Non abusare delle librerie esterne
È impossibile sviluppare del codice senza importare librerie.
Tuttavia, è bene essere moderati, e non importare enormi librerie che nel codice devono svolgere solo un semplice task. Ogni libreria intrinsecamente contiene delle vulnerabilità. Se il codice non utilizza nemmeno quelle componenti, si rischia di aggiungere delle potenziali criticità all’applicazione senza ottenere un reale vantaggio.
E’ opportuno quindi analizzare e pianificare con criterio quali librerie di terze parti sono necessarie per il funzionamento dell’applicazione, in modo da valutare se può essere preferibile sviluppare delle funzioni autonomamente.
10. Adotta un processo di sviluppo sicuro
I punti precedenti non rappresentano una lista esaustiva. Esistono numerosi altri aspetti da considerare.
Al giorno d’oggi, lo sviluppo di un’applicazione non può prescindere dalla sua messa in sicurezza.
E’ controproducente, in termini di costi ed effort, improvvisare. E’ buona norma invece, adottare un processo di sviluppo di sicuro, che tenga conto dei diversi aspetti di sicurezza, in tutte le fasi: dal design all’implementazione, dal testing all’esecuzione.
A prescindere dalla grandezza del team o dell’applicazione stessa, è utile strutturare delle procedure di verifica e affidarsi all’esperienza e alle best practice di settore.
Se vuoi approfondire la tematica, scrivici a info@radsec.it