Nuova ricerca

Mauro ANDREOLINI

Ricercatore Universitario
Dipartimento di Scienze Fisiche, Informatiche e Matematiche sede ex-Matematica

Insegnamento: Sviluppo di software sicuro

Informatica (Offerta formativa 2024)

Obiettivi formativi

Il corso vuole essere una introduzione allo sviluppo sicuro del software. Al termine dell'insegnamento lo studente sarà in grado di:
- acuire la sensibilità ai rischi insiti in applicazioni non sicure;
- saper valutare il grado di sicurezza di una applicazione esistente;
- saper irrobustire una applicazione esistente;
- saper progettare ex-novo un software con caratteristiche di sicurezza (security/safety/privacy by design).

Prerequisiti

* Sistemi operativi: conoscenza delle funzionalità offerte da un sistema operativo moderno.
* Interfaccia a linea di comando: shell BASH, comandi di base di un sistema UNIX.
* Linguaggi: C ed uno tra Java, Python, Ruby o Perl.
* Sviluppo software: conoscenza funzioni di libreria di base (I/O, memoria, processi), strumenti di sviluppo e debugging UNIX.

Programma del corso

L'insegnamento si svolge nel I semestre del I anno, per un totale di 63 ore di didattica frontale suddivise in teoria (nelle quali vengono introdotti ed illustrati gli
argomenti del corso) e applicazioni pratiche della teoria (nelle quali vengono risolti esercizi in dettaglio). Le esercitazioni non sono formalmente separate dalla teoria, ma si integrano con essa.
La scansione dei contenuti in termini di ore è da intendere come puramente indicativa. Essa può
infatti subire modifiche nel corso dell’insegnamento alla luce dei riscontri e della partecipazione
degli studenti.

Introduzione (6 ore).
Introduzione al corso. Prospettiva storica.

Definizioni (2 ore).
Asset. Minaccia. Classificazione STRIDE. Classificazione degli utenti. Difetto. Bug. Debolezza. Vulnerabilità. Exploit. Vettore di attacco. Superficie di attacco. Politica di sicurezza. Meccanismi di sicurezza. Prevenzione, rilevazione, reazione. Confidenzialità, integrità, disponibilità.

Vulnerabilità software (12 ore).
Ciclo di vita di una vulnerabilità. Vulnerabilità 0-day. CVE. CVSS. CWE. CWSS. CPE. OVAL. ATT&CK.

Esecuzione con privilegi elevati (12 ore).
Elevazione manuale e automatica. I bit SETUID e SETGID. Evoluzione storica della gestione dei privilegi nei sistemi UNIX. Capability. Analisi del codice sorgente del comando ping.

Iniezione locale (6 ore).
Albero di attacco. Macchina virtuale Nebula. Path injection. Command injection. Library injection.

Iniezione remota (16 ore).
Command injection remota. Macchina virtuale Damn Vulnerable Web Application. SQL injection di base. Fuzzing. Cross Site Scripting. Cross Site Request Forgery.

Corruzione della memoria (14 ore).
Macchina virtuale Protostar. Stack based buffer overflow. Buffer overflow con shellcode. Buffer overflow basato su ret2libc.

Attacchi Web (7 ore).
Macchina virtuale Web for Pentester. SQL injection. File inclusion. Directory Traversal. File upload. Enumerazione del sistema vittima. Aggiramento delle difese. Hardening.

Metodi didattici

La didattica è basata, in via ordinaria(*), su lezioni frontali mediante presentazioni in formato elettronico, nelle quali la materia viene sviluppata nei dettagli formali e debitamente
commentata. Al termine di ciascun argomento descritto nella sezione "Contenuti del
corso" segue una serie di esercizi guidati per la verifica dei concetti appresi.
Le domande e gli interventi degli studenti sono graditi e incoraggiati. Per stimolare l'approfondimento alla materia, il docente propone settimanalmente esercizi facoltativi più complessi da risolvere tramite ricerche individuali.
La frequenza non è obbligatoria, ma fortemente consigliata.
Il corso è erogato in lingua italiana.
Tutte le informazioni tecniche e organizzative sull'insegnamento, nonché il materiale didattico,
saranno caricati sul sito del corso gestito dal docente, raggiungibile dalla piattaforma Dolly tramite link apposito. Si invita lo studente a consultare il sito del corso con regolarità.
(*) A causa della situazione sanitaria COVID19, nel presente anno accademico le lezioni potrebbero essere svolte in modalità a distanza su piattaforma Google Meet, tramite sessioni in diretta registrate e rese disponibili agli studenti.

Testi di riferimento

* Presentazioni in formato elettronico, pubblicate dal docente durante lo svolgimento della didattica.

Verifica dell'apprendimento

L'esame prevede una prova orale della durata di 30 minuti sugli argomenti definiti nella sezione
"Contenuti del corso", che mira all'accertamento sia di una conoscenza operativa ed approfondita di tutti gli aspetti teorici e pratici della materia sia della capacità di problem solving dello studente. Lo studente riceve tre domande in sequenza. La prima domanda è uno sbarramento; se lo studente non sa rispondere, viene respinto immediatamente. Per ogni domanda lo studente riceve al più 10 punti; ogni errore costa un punto. Il voto finale è la somma dei voti presi nelle domande, più eventuali punti bonus presi a lezione o con gli esercizi facoltativi.
Le prove potrebbero essere svolte in presenza o a distanza su piattaforma Meet a seconda
dell'evoluzione della situazione di emergenza sanitaria COVID19. La valutazione in trentesimi della prova viene resa nota allo studente al termine della prova stessa.

Risultati attesi

1) Conoscenza e capacità di comprensione.
- Comprendere l'evoluzione storica degli attacchi informatici.
- Comprendere le principali minacce a livello di progetto e di codice.
- Comprendere gli attacchi classici e le relative mitigazioni.

2) Conoscenza e capacità di comprensione applicate.
- Enumerare la superficie di attacco di un sistema informatico.
- Individuare, sfruttare, mitigare le vulnerabilità classiche di un sistema informatico.
- Individuare e mitigare le debolezze nel codice.

3) Autonomia di giudizio.
- Esprimere un giudizio critico sulla sicurezza di una applicazione esistente.
- Valutare il rischio di inserimento una vulnerabilità nel proprio codice.

4) Abilità comunicative.
- Discutere le proprie scoperte (ottenute grazie alla risoluzione degli esercizi facoltativi) nel gergo tecnico appropriato.
- Esprimere (tramite il colloquio finale) i concetti appresi con un linguaggio appropriato e sostenere una discussione in merito agli argomenti trattati.

5) Capacità di apprendimento.
- Sviluppare abilità di apprendimento autonomo tramite lo studio della letteratura, le discussioni con il docente, le esercitazioni mirate.