Docente: Giuseppe Scollo
Università di Catania, sede di Comiso (RG)
Facoltà di Scienze Matematiche, Fisiche e Naturali
Corso di Studi in Informatica applicata, AA 2006-7
oggetto del resto del corso è la sicurezza del software, considerata:
nella lezione introduttiva, la sicurezza dei sistemi informatici è stata articolata nelle tre caratteristiche di: riservatezza, integrità, disponibilità
articolazioni più fini sono in pratica necessarie:
sicuroun determinato programma
le qualità di sicurezza di un programma dipendono dalle sue funzionalità
capacità di prevenire accessi non autorizzati alle informazioni e funzioni gestite dal prodotto
tradizionalmente, si ritiene sicuro
un
programma quando questo non contiene errori
errore?
occorre innanzitutto distinguere fra cause ed effetti, spesso confusi nello stesso termine:
subdoli, cioè più difficili da scoprire, sono quelli che danno luogo a malfunzionamenti solo in condizioni molto particolari (ingl. race conditions)
metodi tradizionali di risoluzione degli errori si basano sul collaudo di una squadra di esperti (ingl. tiger team), sfidata a tentare di penetrare nel sistema e violarne la sicurezza
purtroppo non c'è alcuna garanzia che la patch non sia fonte di altri errori!
una definizione del concetto di difetto di sicurezza di un programma:
valutazione critica:
attese di sviluppatori e utenti,
meglio assumere una
specifica di requisiti di sicurezza
per il programma
e quindi identificare i difetti di sicurezza con le
violazioni di tali requisiti
tassonomia di (Landwehr et al., 1993) dei difetti dei programmi:
intenzionali:
involontari:
vengono forniti nel seguito, e nella prossima lezione, alcuni esempi di difetti involontari
ecco un caso di errore di programmazione, sicuramente involontario, classificabile come errore logico secondo la tassonomia dei difetti vista sopra
l'errore è riscontrabile in un esempio di programmazione in C++ nel testo (Sedgewick, 2003), che a p. 41 propone due metodi simili, espressi da rispettive istruzioni C++, per il calcolo del più piccolo intero maggiore di lg N :
for (lgN = 0; N > 0; lgN++, N /= 2) ;
for (lgN = 0, t = 1; t < N; lgN++, t += t) ;
i due metodi non sono equivalenti
lgN
debba essere, all'uscita dal ciclo, il più piccolo intero
maggiore di lg N
, il secondo metodo
è erroneo
esercizio: trovare e correggere l'errore nel secondo metodo
un buffer è un'area di memoria di capacità finita, ad es. quella allocata a un array o a una stringa
si ha un overflow (trabocco) dal buffer quando si accede alla struttura dati, a cui esso è allocato, con un valore dell'indice esterno all'intervallo corrispondente a locazioni del buffer
la conseguenza del buffer overflow dipende dalla collocazione della locazione di memoria a cui si tenta l'accesso erroneo, che può trovarsi nell'area:
è difficile predisporre una protezione generale dal buffer overflow, perché:
ecco un esempio di buffer overflow sicuramente non intenzionale, che si manifesta solo al verificarsi di una condizione molto rara, tipico esempio di race condition :
il testo (Sedgewick, 2003) propone un programma per la simulazione del lancio di monete (Programma 3.7, p. 88), dove si considerano M esperimenti, ciascuno dei quali consta di N lanci
testain un esperimento, si incrementa f[k] di 1
testa