Curriculum
- 4 Sections
- 7 Lessons
- 6 Hours
- Introduzione allo sviluppo sicuro del software3
- Pratiche di sviluppo sicuro: tecniche di programmazione sicura, modellazione delle minacce e valutazione dei rischi3
- IRilascio e manutenzione: Rilascio di software sicuro e pratiche di sicurezza post-implementazione3
- Ulteriori letture1
Fondamenti e basi teoriche
Tecniche di programmazione sicura
Le tecniche di programmazione sicura sono essenziali per gli sviluppatori per creare applicazioni resistenti agli attacchi e proteggere i dati degli utenti. Queste tecniche sono un sottoinsieme di pratiche di sviluppo sicuro che si concentrano specificamente sulla scrittura del codice in modo da prevenire l’introduzione di vulnerabilità nella sicurezza. Ecco una panoramica di alcune tecniche chiave di codifica sicura:
- Convalida degli input: assicurarsi che tutti i dati di input ricevuti da utenti, file, database o qualsiasi altra fonte esterna siano convalidati per tipo, lunghezza, formato e intervallo prima di utilizzarli nell’applicazione.
- Codifica dell’output: quando si visualizzano o si trasmettono dati, codificarli in modo appropriato per evitare attacchi di tipo injection, come il Cross-Site Scripting (XSS). Ad esempio, l’output HTML deve essere codificato per evitare che il browser esegua script dannosi.
- Query parametrizzate: usare query parametrizzate o istruzioni preparate quando si accede ai database per prevenire attacchi di tipo SQL injection.
- Privilegio minimo: applicare il principio del minimo privilegio eseguendo i processi e accedendo alle risorse con le autorizzazioni minime necessarie.
- Autenticazione e autorizzazione: implementare meccanismi di autenticazione forti e applicare controlli di autorizzazione rigorosi per garantire che solo gli utenti legittimi possano accedere a funzioni e dati sensibili.
- Gestione delle password: memorizzare le password in modo sicuro utilizzando algoritmi di hashing forti e adattivi come bcrypt o Argon2.
- Gestione delle sessioni: memorizzare i dati di sessione in modo sicuro e garantire che i token di sessione siano trasmessi in modo sicuro, in genere nelle intestazioni HTTP con l’uso corretto di HTTPS.
- Gestione degli errori: implementare una solida gestione degli errori che non esponga informazioni sensibili all’utente.
- Crittografia: utilizzare la crittografia per proteggere i dati in transito (con TLS/SSL) e a riposo. Assicurarsi che le implementazioni della crittografia siano aggiornate e utilizzino algoritmi e chiavi forti.
- Firma del codice: firmare il codice per garantirne l’integrità e l’origine. Questo aiuta a prevenire le manomissioni e può avvisare gli utenti di modifiche non autorizzate.
- Operazioni sicure sui file: quando si gestiscono i file, assicurarsi che le operazioni sui file siano eseguite in modo sicuro per prevenire gli attacchi di directory traversal e garantire che i permessi dei file siano impostati in modo appropriato.
- Gestione della memoria: per i linguaggi che non gestiscono automaticamente la memoria, come C e C++, è necessario essere diligenti nell’allocare, utilizzare e liberare la memoria per evitare perdite di memoria e buffer overflow.
- Gestione della concorrenza e delle “Situazioni di corsa”: scrivere codice sicuro per esecuzioni concorrenti e gestire le “Situazioni di corsa” (cioè l’esecuzione di processi che dipende dalla temporizzazione o dalla sequenza con cui essi vengono eseguiti) per evitare problemi come i bug da tempo di verifica a tempo di utilizzo (TOCTOU – Time-of-check to time-of-use).
- Sanificazione dei dati: sanificare i dati che verranno passati agli interpreti o alle shell di comando per evitare attacchi di tipo injection.
- Revisioni del codice e analisi statica: eseguire regolarmente revisioni del codice con particolare attenzione alla sicurezza e utilizzare strumenti di analisi statica per rilevare automaticamente potenziali vulnerabilità nel codice.
- Sicurezza delle dipendenze: mantenere aggiornate le librerie e le dipendenze di terze parti e verificare la presenza di vulnerabilità note utilizzando strumenti di analisi della composizione del software.

Figura-4
(Risorsa: https://securityboulevard.com/2022/01/7-security-coding-guidelines-to-keep-in-mind/)
Modellazione delle minacce e valutazione del rischio
La modellazione delle minacce e la valutazione del rischio sono processi proattivi utilizzati nella cybersecurity e nello sviluppo del software per identificare, dare priorità e mitigare le potenziali minacce a un sistema. Queste pratiche fanno parte di un approccio più ampio alla sicurezza noto come Security by Design, che sottolinea l’importanza di incorporare misure di sicurezza fin dalle prime fasi di sviluppo. La modellazione delle minacce è un approccio strutturato per identificare e affrontare le potenziali minacce a un sistema.

Figura-5
(Risorsa: https://www.security-analyst.org/threat-analysis-and-risk-assessment/)
Migliori pratiche per la modellazione delle minacce e la valutazione del rischio
- Iniziare presto: iniziare la modellazione delle minacce e la valutazione dei rischi nella fase di progettazione e iterare durante il ciclo di vita dello sviluppo.
- Coinvolgere team multidisciplinari: includere membri con prospettive diverse, come sviluppatori, professionisti della sicurezza, personale operativo e analisti aziendali.
- Utilizzare quadri e metodologie standard: applicare quadri di riferimento consolidati (come NIST, ISO o OCTAVE) e metodologie (come STRIDE o PASTA) per guidare il processo.
- Mantenere aggiornata la documentazione: assicuratevi che tutti i risultati e le azioni siano ben documentati e facilmente accessibili.
- Integrazione con il processo di sviluppo: incorporare la modellazione delle minacce e la valutazione dei rischi nel ciclo di vita dello sviluppo del software (SDLC) e renderlo parte delle normali pratiche di sviluppo.
- Educare e formare: fornire formazione a tutti gli individui coinvolti nel processo per garantire che comprendano l’importanza e i metodi di modellazione delle minacce e di valutazione del rischio.
- Rivalutare periodicamente: la sicurezza non è un impegno una tantum. Rivalutate regolarmente le minacce e i rischi in risposta a nuove vulnerabilità, cambiamenti nel sistema o minacce emergenti.
Test di sicurezza
I test di sicurezza sono una componente fondamentale del ciclo di vita dello sviluppo del software e della strategia generale di cybersecurity. Si tratta di valutare le caratteristiche di sicurezza di un sistema per garantire che proteggano i dati e mantengano la funzionalità prevista. Ecco una panoramica dei vari tipi di test di sicurezza e di come vengono generalmente condotti:
- Scansione delle vulnerabilità: strumenti automatizzati per la scansione di sistemi, reti e applicazioni alla ricerca di vulnerabilità note.
- Test di penetrazione (Pen Testing): i test di penetrazione simulano un attacco informatico per identificare e sfruttare le vulnerabilità di sistemi, reti e applicazioni. In genere viene eseguito da hacker etici che utilizzano le stesse tecniche degli aggressori malintenzionati, ma lo fanno in modo controllato e autorizzato.
- Audit di sicurezza: si tratta di una valutazione sistematica dei controlli e dei processi di sicurezza per garantire che siano implementati in modo corretto ed efficace.
- Valutazione della sicurezza: una valutazione più ampia che comprende la scansione delle vulnerabilità, i test di penetrazione, la verifica della sicurezza e la valutazione del rischio. Fornisce un quadro completo della posizione di sicurezza di un’organizzazione.
- Valutazione dei rischi: questo processo prevede l’identificazione, la quantificazione e la prioritizzazione dei rischi per le risorse dell’organizzazione.
- Hacking etico: simile ai test di penetrazione, l’hacking etico consiste nell’attaccare deliberatamente i sistemi di un’organizzazione per trovare le vulnerabilità dal punto di vista dell’attaccante.
- Revisione del codice: le revisioni del codice possono essere condotte manualmente o con strumenti automatici e sono una parte essenziale della sicurezza del processo di sviluppo del software.
- Revisione della gestione della configurazione: è fondamentale garantire che i sistemi e le applicazioni siano configurati in modo sicuro.
- Audit di conformità: verifica della conformità dei sistemi e dei processi agli standard e alle normative di sicurezza pertinenti (come GDPR, HIPAA, PCI DSS, ecc.).
- Red Teaming: una simulazione di attacco a più livelli che verifica la capacità delle persone, delle reti, delle applicazioni e dei controlli di sicurezza fisica di un’organizzazione di resistere a un attacco da parte di un avversario reale.
- Test di ingegneria sociale: verifica della sensibilità del personale di un’organizzazione alle tattiche di social engineering, come phishing, pretexting, baiting o tailgating.
- Valutazione dello stato di sicurezza (posture assessment): comporta l’analisi e la comprensione delle condizioni di sicurezza dei sistemi informatici, delle reti e di altre risorse informatiche per identificare le vulnerabilità della sicurezza.

Figura-6
(Risorsa: https://www.educba.com/security-testing/)
