Sicurezza e protezione nei sistemi operativi
In questa pagina 7
Questa nota riunisce la sicurezza (difendersi da chi attacca il sistema), la protezione (controllare chi accede a cosa) e la tolleranza ai guasti. Le basi di sicurezza di rete sono in Introduzione alla sicurezza delle retiUna minaccia è un evento o una sequenza di azioni che può violare uno o più obiettivi di sicurezza; la sua realizzazione è un attacco. Obiettivi: riservatezza, integrità, disponibilità, responsabilità (accountability), privacy. Minacce: intercettazione, analisi del traffico, falsificazione, mascheramento, ripudio, profilazione, fingerprinting, disturbo (jamming). Servizi (segretezza, protezione dell'integrità, autenticazione del messaggio e dell'entità, non ripudio, anonimizzazione, gestione delle chiavi, controllo degli accessi) e meccanismi (cifratura, firma digitale, rilevamento delle intrusioni, MAC, randomizzazione, accordo sulla chiave). Un protocollo di sicurezza di livello N protegge la PDU di livello N e superiori, non quelle sotto. Attacchi fisici, software e di rete; sniffing e spoofing alla base di DoS (esempio: Smurf con ICMP) e MITM (avvelenamento della cache ARP o DNS, ICMP redirect). Altri: sinkhole, wormhole, ping of death, DDoS con botnet.Introduzione alla sicurezza delle reti →, Funzioni hash e crittografia simmetricaLa crittografia trasforma un messaggio in chiaro (plaintext) in un testo cifrato (ciphertext) con una chiave: C = E_ke(P), P = D_kd(C); può dare riservatezza, integrità e autenticazione. Attacchi: solo testo cifrato, testo in chiaro noto, testo in chiaro scelto, forza bruta. Funzione hash: mappa dati di qualsiasi lunghezza in un digest di lunghezza fissa; one-way (dato h è difficile trovare m con hash(m) = h) e resistente alle collisioni; famiglie MD (MD5 rotto per le collisioni nel 2004) e SHA (SHA-0 e SHA-1 rotti, SHA-2 il più usato, SHA-3); costruzione di Merkle-Damgård; usi: integrità e password. Crittografia simmetrica: stessa chiave segreta per cifrare e decifrare; Cesare (E_n(x) = x + n mod 26), Vigenère, Enigma; DES (blocchi da 64 bit, chiave da 56) e AES (blocchi da 128 bit, chiavi da 128, 192, 256); modi ECB (insicuro), CBC, CFB, OFB, CTR. Scambio della chiave con Diffie-Hellman: K = g^(xy) mod p. MAC e HMAC: autenticazione con chiave condivisa.Funzioni hash e crittografia simmetrica → e Crittografia asimmetrica, RSA e TLSCrittografia asimmetrica (a chiave pubblica): chiave di cifratura pubblica v_B, chiave di decifratura privata s_B, matematicamente legate; C = E_vB(P), P = D_sB(C); dà riservatezza. I certificati digitali, emessi da una Certificate Authority e firmati con la sua chiave privata, legano un'identità a una chiave pubblica. Firma digitale: hash del messaggio cifrato con la chiave privata; garantisce autenticità, integrità e non ripudio. RSA: si scelgono due primi grandi p e q, N = pq, phi(N) = (p-1)(q-1), e coprimo con phi(N), d = e^(-1) mod phi(N); chiave pubblica (N, e), segreta (N, d); cifratura c = m^e mod N, decifratura m = c^d mod N con m < N (teorema di Eulero); sicura finché la fattorizzazione è difficile (N di almeno 2048 bit); il padding casuale (PKCS#1 v1.5: 00 02 [casuale] 00 [m]) difende da malleabilità e determinismo. La firma RSA è s = m^d mod N, verificata con s^e mod N. TLS (su TCP) autentica gli estremi con il certificato, cifra i dati con una chiave di sessione simmetrica e garantisce l'integrità con i MAC; da TLS 1.0 a 1.3 la chiave si ricava con Diffie-Hellman e l'handshake si accorcia. DTLS è la versione per UDP.Crittografia asimmetrica, RSA e TLS →; i permessi dei file sono in File system - interfaccia, directory e implementazioneUn file è uno spazio di indirizzi logici contigui con attributi (nome, identificatore, tipo, posizione, dimensione, protezione, date) e operazioni (create, read, write, seek, delete, truncate, open, close); il sistema tiene una tabella dei file aperti di sistema e una per processo; l'accesso è sequenziale o diretto; le directory si organizzano a livello singolo, a due livelli, ad albero, a grafo aciclico (hard link e link simbolici) o a grafo generale; i permessi UNIX rwx per proprietario, gruppo e altri (chmod 754); il file system è a strati (file system logico, organizzazione dei file, file system di base, controllo dell'I/O), con strutture su disco (boot block, superblock, directory, FCB o inode) e in memoria; i blocchi si allocano in modo contiguo (extent), concatenato (FAT) o indicizzato (inode con puntatori diretti e indiretti, ext4 con extent); lo spazio libero con bitmap, lista, raggruppamento o conteggio; mount, VFS, file system distribuiti (NFS) e semantiche di consistenza.File system - interfaccia, directory e implementazione →.
Minacce all'accesso
Le minacce all'accesso al sistema sono di due categorie generali: intrusi e software malevolo.
Intrusi
| tipo | chi è |
|---|---|
| masquerader (mascherato) | una persona non autorizzata che supera i controlli di accesso e sfrutta l'account di un utente legittimo |
| misfeasor | un utente legittimo che accede a dati, programmi o risorse per i quali non è autorizzato, oppure è autorizzato ma abusa dei suoi privilegi |
| clandestine user (clandestino) | chi prende il controllo di amministrazione del sistema e lo usa per eludere audit e controlli, o per sopprimere la raccolta di dati di audit |
Software malevolo (malware)
Programmi che sfruttano le vulnerabilità dei sistemi. Due categorie:
- parassiti: frammenti di programma che non esistono da soli, ma dentro un'applicazione, un'utilità o un programma di sistema: virus, logic bomb, backdoor;
- indipendenti: programmi completi, che il sistema operativo può schedulare ed eseguire (vedi Scheduling della CPU - FCFS, SJF, priorità e round robinLo scheduler della CPU sceglie tra i processi pronti quello a cui dare il core (il dispatcher esegue il cambio, con latenza di dispatch); lo scheduling è non preemptive (il processo tiene la CPU finché termina o si blocca) o preemptive (la CPU gli può essere tolta, con rischio di race condition); i criteri sono utilizzo della CPU e throughput (da massimizzare), tempo di attesa, di turnaround (completamento meno arrivo) e di risposta (da minimizzare); FCFS è semplice ma soffre dell'effetto convoglio (esempio 24, 3, 3: attesa media 17 contro 3); SJF è ottimo per l'attesa media ma richiede la lunghezza del prossimo burst, stimata con la media esponenziale tau(n+1) = alfa t(n) + (1-alfa) tau(n); SRTF è la versione preemptive (esempio con attesa media 6,5 contro 7,75); round robin dà a ciascuno un quanto q e nessuno attende più di (n-1)q; la priorità causa starvation, risolta con l'aging; code multilivello e a feedback (MLFQ) combinano le politiche.Scheduling della CPU - FCFS, SJF, priorità e round robin →): worm e bot.
Contromisure
Rilevamento delle intrusioni (IDS)
Secondo la RFC 4949 (glossario di sicurezza di Internet), il rilevamento delle intrusioni è un servizio di sicurezza che monitora e analizza gli eventi di sistema per trovare e segnalare, in tempo reale o quasi, i tentativi di accedere in modo non autorizzato alle risorse. Un IDS può essere:
- host-based: controlla le caratteristiche di un singolo calcolatore e gli eventi al suo interno;
- network-based: controlla il traffico di certi segmenti o dispositivi di rete e analizza i protocolli di rete, trasporto e applicazione.
Componenti:
- sensori: raccolgono i dati (pacchetti di rete, file di log, tracce delle system call);
- analizzatori: ricevono dati da uno o più sensori o da altri analizzatori e decidono se c'è stata un'intrusione, eventualmente suggerendo azioni;
- interfaccia utente: permette di vedere l'output o controllare il sistema (console o gestore).
Autenticazione
Nel sistema operativo l'autenticazione è l'elemento base e la prima linea di difesa. La RFC 4949 la definisce come il processo di verifica di un'identità dichiarata da o per un'entità del sistema. Ha due parti:
- identificazione: presentare un identificatore al sistema di sicurezza (il nome utente);
- verifica: presentare o generare informazioni che confermano il legame tra l'entità e l'identificatore (la password).
Si può verificare con:
| qualcosa che l'utente... | esempi |
|---|---|
| sa | password, PIN, risposte a domande prestabilite |
| possiede (token) | carta elettronica, smart card, chiave fisica |
| è (biometria statica) | impronta digitale, retina, volto |
| fa (biometria dinamica) | voce, scrittura a mano |
Controllo degli accessi
Il controllo degli accessi applica una politica di sicurezza che stabilisce chi (o cosa) può accedere a ogni risorsa e con quale tipo di accesso: permessi dei file, accesso sudo, SELinux. Un amministratore mantiene un database delle autorizzazioni con i tipi di accesso consentiti a ogni utente su ogni risorsa. Una funzione di auditing controlla e registra gli accessi alle risorse. Un firewall può bloccare il traffico in entrata e in uscita dalla rete locale, tranne quello autorizzato dalla politica locale (vedi FirewallUn firewall è un componente (hardware, software o entrambi) che blocca il traffico non autorizzato da una rete verso un'altra: filtra i dati, reindirizza il traffico, protegge dagli attacchi. Requisiti: tutto il traffico tra due zone di fiducia deve passare dal firewall, passa solo il traffico autorizzato, il firewall stesso deve essere immune alle intrusioni. L'amministratore configura le politiche (controllo di utente, di servizio, di direzione); un pacchetto può essere accettato, negato o rifiutato (negato più messaggio ICMP alla sorgente). Il firewall decide con le informazioni di intestazione dei livelli 2-4 (indirizzi, protocollo, porte, flag SYN/ACK/FIN). Packet filter: senza stato, filtra in ingresso e in uscita con regole su indirizzi, protocollo, porte, flag (esempi SMTP, Telnet, X11 e correzioni con porte sorgente e flag ACK). Stateful firewall: tiene traccia delle connessioni (NEW, ESTABLISHED, RELATED, INVALID), limita connessioni al secondo, timeout. Firewall applicativo/proxy: ispeziona il livello applicazione, apre una connessione separata verso la destinazione; sicuro ma lento. Linux: netfilter con 5 hook IPv4 e 5 verdetti, iptables (tabelle e catene), connection tracking nf_conntrack.Firewall →). Le ACL estendono i permessi UNIX (man acl). I permessi rwx e chmod sono in Esercizio - Permessi dei file con stat e chmod (laboratorio 9).
Buffer overflow
Definizione (buffer overflow). Secondo il glossario del NIST: una condizione, a un'interfaccia, in cui si può mettere in un buffer o in un'area di dati più input della capacità allocata, sovrascrivendo altre informazioni. Gli attaccanti la sfruttano per mandare in crash il sistema o per inserire codice costruito apposta che gli dia il controllo.
È uno dei più diffusi e pericolosi attacchi. Lo stack overflow ne è un caso particolare.
Organizzazione della memoria di un programma C
Lo spazio di un processo ha: codice, dati statici, heap (cresce verso l'alto), stack (cresce verso il basso) e, sopra lo stack, gli argomenti (argv) e l'ambiente. Nello stack, per ogni chiamata di funzione, c'è un record di attivazione (stack frame) con: argomenti, indirizzo di ritorno, registri salvati, variabili locali (compresi i buffer). Dettagli sul layout in Gestione della memoria in CSegmenti di memoria di un processo (codice, dati statici, stack, heap); durata delle variabili; allocazione dinamica con malloc, calloc, realloc e free; errori classici: memory leak, dangling pointer, double free, buffer overflow; strumenti di controllo.Gestione della memoria in C → e Puntatori in CUn puntatore contiene un indirizzo di memoria; operatori & e *, NULL, puntatori come parametri per modificare variabili del chiamante, aritmetica dei puntatori, legame tra array e puntatori, const, puntatori a puntatori.Puntatori in C →.
Stack overflow: il programma del corso
#include <stdio.h>
void fun1() {
char str1[8] = "1111111";
char str2[8] = "2222222";
puts(str1);
puts(str2);
for (int i = 0; i < 15; i++)
str2[i] = '3'; /* str2 ha 8 posti: le scritture 8..14 sforano */
puts(str1);
puts(str2);
}
int main() { fun1(); }Le due stringhe sono adiacenti. Un possibile layout dello stack (indirizzi crescenti, dipende dal compilatore):
| indirizzo basso | indirizzo alto | ||
|---|---|---|---|
str2[0..7] |
str1[0..7] |
registri salvati | indirizzo di ritorno |
Il ciclo scrive 15 byte '3' a partire da str2[0]: i primi 8 riempiono str2 (compreso il terminatore, che sparisce), gli altri 7 finiscono nei primi 7 byte di str1. Il secondo puts(str1) stampa allora 3333333 invece di 1111111: i dati sono corrotti, senza errori. Nell'esempio della slide, con str1 = "START" e un ingresso BADINPUTBADINPUT letto con gets(), la funzione che non controlla i limiti copia dati in eccesso: un overflow piccolo corrompe dati senza effetti visibili, uno più grande corrompe dati importanti (un problema non individuato). gets() legge da stdin fino all'a-capo senza nessun controllo del limite: non si usa mai. Il programma si compila senza protezioni con gcc -fno-stack-protector; con le opzioni predefinite di molti sistemi il canarino abortisce il programma. Una versione sicura, con i limiti controllati, è in Esercizio - Buffer overflow nello stack e versione sicura (slide di sicurezza, parte 1).
Iniezione di codice
Quando si chiama una funzione, si mette nello stack l'indirizzo di ritorno, poi le variabili dichiarate nello stack, buffer compresi. Se un attaccante riesce a sovrascrivere l'indirizzo di ritorno, alla fine della funzione il programma salta a un indirizzo arbitrario: per esempio a codice dell'attaccante che avvia una shell. Si chiama iniezione di codice (code injection) e il codice iniettato shellcode. Il caso più semplice: l'indirizzo di ritorno è fatto puntare dentro il buffer stesso, riempito con il codice nella stessa operazione che causa l'overflow. Primo documento: la rivista Phrack del 1996, "Smashing the Stack for Fun and Profit".
Per sfruttarlo l'attaccante deve: individuare una vulnerabilità che si possa attivare con dati esterni sotto il suo controllo; capire come il buffer è disposto nella memoria del processo e quindi come corrompere le posizioni adiacenti e alterare il flusso di esecuzione. Non servono grandi programmatori: chi scopre il bug scrive l'exploit, e chiunque (script kiddie) può usarlo.
Difese
A tempo di compilazione (rendere i programmi più resistenti):
- Scelta del linguaggio: linguaggi di alto livello con tipi forti e operazioni permesse controllate (Java, Python, C#); costo in risorse in compilazione e nel codice eseguito a runtime.
- Tecniche di codifica sicura: revisionare e riscrivere i costrutti pericolosi (il progetto OpenBSD fa un controllo estensivo del sistema, delle librerie e delle utilità; ha prodotto anche OpenSSH).
- Estensioni del linguaggio e librerie sicure: compilatori che inseriscono controlli di intervallo sui puntatori.
- Protezione dello stack: il codice di ingresso e uscita delle funzioni controlla se lo stack è stato corrotto. StackGuard (estensione di GCC) inserisce un valore sentinella (canary, canarino) prima dell'indirizzo di ritorno e lo controlla all'uscita.
A tempo di esecuzione (rilevare e fermare gli attacchi):
- Protezione dello spazio eseguibile: impedire l'esecuzione di codice nello stack, perché il codice eseguibile dovrebbe stare altrove. Estensioni a tutti i sistemi principali: il bit NX (no-execute).
- Randomizzazione dello spazio degli indirizzi (ASLR): spostare in modo casuale la posizione delle strutture dati chiave (stack, librerie); basta spostare lo stack di un megabyte per rendere quasi impossibile prevedere l'indirizzo del buffer, con poco effetto sui programmi.
- Guard pages: pagine di divieto tra le zone dello spazio degli indirizzi, marcate come illegali nella MMU: un accesso termina il processo. Si possono mettere anche tra i frame dello stack o tra le allocazioni dello heap. Vedi Memoria centrale - allocazione contigua, paginazione e segmentazioneUn programma deve stare in memoria centrale per girare; la MMU traduce a ogni accesso l'indirizzo logico (virtuale) in indirizzo fisico, sommando un registro di rilocazione e controllando il limite; con l'allocazione contigua (partizioni fisse o variabili, first/best/worst fit) si hanno frammentazione interna ed esterna e serve la compattazione; la paginazione divide memoria logica in pagine e memoria fisica in frame della stessa dimensione (potenza di 2), elimina la frammentazione esterna, traduce (p, d) con la tabella delle pagine (PTBR, PTLR) e riduce il costo dei due accessi con il TLB (EAT = h * t + (1 - h) * 2t); le tabelle grandi si dividono in gerarchiche, hash o invertite; lo swapping sposta intere pagine o processi su disco; la segmentazione usa blocchi di lunghezza variabile con coppia (base, limite), eventualmente paginati; Intel IA-32 usa segmentazione con paginazione a due livelli (10+10+12 bit) e IA-64 quattro livelli su 48 bit.Memoria centrale - allocazione contigua, paginazione e segmentazione → per il bit di validità e la protezione delle pagine.
Attacchi di rete
Dentro un solo calcolatore sorgente e destinazione dei messaggi sono noti e protetti: il sistema operativo crea, gestisce e protegge identificatori di processo e porte di comunicazione, spesso sicuri per default. Sulla rete invece mittente e destinatario non sono affidabili: l'indirizzo IP non basta per identificarli e i messaggi possono passare per macchine non autorizzate. Il sistema operativo controlla e limita gli attacchi nel proprio sistema, ma non ha controllo sulla rete. Attacchi:
- sniffing: l'attaccante resta passivo e intercetta il traffico, ricavando informazioni su tipo e contenuto delle sessioni;
- spoofing: finge di essere una delle parti, oppure diventa un man-in-the-middle (Attacco man-in-the-middleLaboratorio 7 (LAB7). Telnet trasmette utente e password in chiaro: chi può leggere il traffico le ruba. Con un hub (scenario 1) basta un
tcpdumpsull'attaccante, perché l'hub ripete ogni frame su tutte le porte. Con uno switch (scenario 2) l'attaccante non vede nulla: serve un attacco man-in-the-middle con avvelenamento della cache ARP (ARP spoofing): l'attaccante invia di continuo risposte ARP false, dicendo al client che l'IP del router corrisponde al proprio MAC e al router che l'IP del client corrisponde al proprio MAC; poi inoltra i pacchetti e legge tutto. Wireshark, con Follow TCP stream, ricostruisce la sessione telnet e le credenziali.Attacco man-in-the-middle →), intercettando ed eventualmente modificando le transazioni.
Crittografia
Definizione (crittografia). Metodo per limitare i possibili mittenti e destinatari dei messaggi: è lo strumento di sicurezza più generale. Si basa su chiavi segrete e consente di confermare la sorgente, di far ricevere il messaggio solo a certi destinatari, e di creare una relazione di fiducia tra mittente e destinatario.
Un algoritmo di cifratura è dato da: un insieme di chiavi, un insieme di messaggi, un insieme di testi cifrati, una funzione di cifratura e una di decifratura per ogni , calcolabili in modo efficiente. Proprietà essenziale: dato , un calcolatore può ricavare con solo se conosce . Poiché i testi cifrati sono di solito esposti (viaggiano in rete), deve essere praticamente impossibile ricavare da essi.
Cifratura simmetrica
La stessa chiave cifra e decifra, quindi va tenuta segreta. Si basa su trasformazioni semplici dei bit (sostituzioni, permutazioni). È veloce e adatta a grandi quantità di dati (Funzioni hash e crittografia simmetricaLa crittografia trasforma un messaggio in chiaro (plaintext) in un testo cifrato (ciphertext) con una chiave: C = E_ke(P), P = D_kd(C); può dare riservatezza, integrità e autenticazione. Attacchi: solo testo cifrato, testo in chiaro noto, testo in chiaro scelto, forza bruta. Funzione hash: mappa dati di qualsiasi lunghezza in un digest di lunghezza fissa; one-way (dato h è difficile trovare m con hash(m) = h) e resistente alle collisioni; famiglie MD (MD5 rotto per le collisioni nel 2004) e SHA (SHA-0 e SHA-1 rotti, SHA-2 il più usato, SHA-3); costruzione di Merkle-Damgård; usi: integrità e password. Crittografia simmetrica: stessa chiave segreta per cifrare e decifrare; Cesare (E_n(x) = x + n mod 26), Vigenère, Enigma; DES (blocchi da 64 bit, chiave da 56) e AES (blocchi da 128 bit, chiavi da 128, 192, 256); modi ECB (insicuro), CBC, CFB, OFB, CTR. Scambio della chiave con Diffie-Hellman: K = g^(xy) mod p. MAC e HMAC: autenticazione con chiave condivisa.Funzioni hash e crittografia simmetrica →).
Cifratura asimmetrica (a chiave pubblica)
Due chiavi: la pubblica (usata dal mittente per cifrare) e la privata (nota solo al destinatario, per decifrare). È uno schema che si può rendere pubblico senza rendere facile trovare lo schema di decifratura; si basa sui numeri primi.
- Il ricevente condivide la chiave pubblica con chiunque voglia mandargli qualcosa (per esempio
ssh-keygenper SSH). - Il messaggio cifrato con la chiave pubblica si decifra solo con la chiave privata del ricevente.
Formalmente (RSA): chiave pubblica, privata, con e due grandi primi scelti a caso; si cifra con e si decifra con , dove soddisfa . Ricavare da è computazionalmente impraticabile, quindi può essere diffusa in chiaro. Vedi Crittografia asimmetrica, RSA e TLSCrittografia asimmetrica (a chiave pubblica): chiave di cifratura pubblica v_B, chiave di decifratura privata s_B, matematicamente legate; C = E_vB(P), P = D_sB(C); dà riservatezza. I certificati digitali, emessi da una Certificate Authority e firmati con la sua chiave privata, legano un'identità a una chiave pubblica. Firma digitale: hash del messaggio cifrato con la chiave privata; garantisce autenticità, integrità e non ripudio. RSA: si scelgono due primi grandi p e q, N = pq, phi(N) = (p-1)(q-1), e coprimo con phi(N), d = e^(-1) mod phi(N); chiave pubblica (N, e), segreta (N, d); cifratura c = m^e mod N, decifratura m = c^d mod N con m < N (teorema di Eulero); sicura finché la fattorizzazione è difficile (N di almeno 2048 bit); il padding casuale (PKCS#1 v1.5: 00 02 [casuale] 00 [m]) difende da malleabilità e determinismo. La firma RSA è s = m^d mod N, verificata con s^e mod N. TLS (su TCP) autentica gli estremi con il certificato, cifra i dati con una chiave di sessione simmetrica e garantisce l'integrità con i MAC; da TLS 1.0 a 1.3 la chiave si ricava con Diffie-Hellman e l'handshake si accorcia. DTLS è la versione per UDP.Crittografia asimmetrica, RSA e TLS →.
Simmetrica o asimmetrica?
La simmetrica (trasformazioni di bit) è veloce, adatta ai grandi trasferimenti. L'asimmetrica (funzioni matematiche) è molto più costosa, quindi non adatta a grandi dati: si usa per l'autenticazione iniziale e poi si passa a una chiave simmetrica per lo scambio vero dei dati. Neppure l'asimmetrica è immune dal man-in-the-middle: A manda la sua chiave pubblica per ricevere un messaggio cifrato da B; un attaccante la intercetta e manda a B una chiave "cattiva" (corrispondente alla propria chiave privata); B cifra con quella; l'attaccante decifra il messaggio. Per questo servono certificati.
Tolleranza ai guasti
Guasti
Per lo standard IEEE un guasto (fault) è uno stato errato dell'hardware o del software dovuto a: guasto di un componente, errore dell'operatore, interferenza fisica dell'ambiente, errore di progetto, errore di programma, errore nelle strutture dati. Si manifesta come difetto di un dispositivo o passo, processo o definizione di dati errati in un programma.
| categoria | significato |
|---|---|
| permanente | sempre presente dopo che si verifica; dura finché il componente non è sostituito o riparato |
| temporaneo | non presente sempre, in tutte le condizioni di funzionamento |
| temporaneo transitorio | si verifica una sola volta |
| temporaneo intermittente | si verifica più volte in momenti imprevedibili |
Definizione (tolleranza ai guasti). La tolleranza ai guasti è la capacità di un sistema o componente di continuare a funzionare normalmente nonostante guasti hardware o software. Richiede in genere un certo grado di ridondanza, per aumentare l'affidabilità; ha un costo (economico o di prestazioni), e il grado va deciso in base a quanto è critica la risorsa.
Ridondanza
Affidabilità e disponibilità
- Affidabilità : probabilità di funzionamento corretto fino al tempo , dato che il sistema funzionava a .
- MTTF (mean time to failure) o MTBF: tempo medio di funzionamento prima di un guasto.
- MTTR (mean time to repair): tempo medio per riparare o sostituire un elemento guasto.
- Disponibilità (availability): frazione di tempo in cui il sistema può servire le richieste degli utenti: .
Esempio. MTTF h, MTTR h: (99,0%); in un anno ( h) il sistema è fuori servizio circa ore. Con 99,99% (quattro nove) si arriva a circa 53 minuti all'anno.
Metodi nel sistema operativo
- Isolamento dei processi: di memoria centrale, di accesso ai file e di flusso di esecuzione.
- Controlli di concorrenza: recupero da condizioni di guasto come il deadlock (Deadlock - condizioni, prevenzione, evitamento e rilevamentoUn deadlock (stallo) è una situazione in cui un insieme di processi attende all'infinito risorse possedute da altri processi dello stesso insieme; può verificarsi solo se valgono insieme quattro condizioni (mutua esclusione, hold and wait, assenza di prelazione, attesa circolare); il grafo di allocazione delle risorse (archi di richiesta P->R e di assegnazione R->P) senza cicli esclude lo stallo, con un ciclo lo implica se ogni risorsa ha una sola istanza, e lo rende solo possibile se ha più istanze; si può prevenire (negare una delle quattro condizioni, per esempio ordinare le risorse per negare l'attesa circolare), evitare (stato sicuro: esiste una sequenza sicura; algoritmo del grafo con archi di rivendicazione per istanza singola, algoritmo del banchiere con Available, Max, Allocation, Need = Max - Allocation e complessità O(m n^2) per istanze multiple), rilevare e ripristinare (grafo wait-for per istanza singola, algoritmo di rilevamento per istanze multiple; terminazione dei processi o prelazione delle risorse con scelta della vittima e rollback), oppure ignorare.Deadlock - condizioni, prevenzione, evitamento e rilevamento →).
- Virtualizzazione: maggiore isolamento tra applicazioni, quindi tra guasti; può dare ridondanza, con una macchina virtuale di riserva per un'altra.
- Checkpoint e rollback: per il recupero dopo un crash; per esempio il journaling dei file system ext3 e ext4.
Domande d'esame
- Cos'è un buffer overflow nello stack e come lo si previene? Scrittura oltre la capacità di un buffer locale che sovrascrive variabili vicine o l'indirizzo di ritorno (iniezione di codice, shellcode). Prevenzione: controllare i limiti (
fgets,snprintf), canarino (StackGuard), bit NX, ASLR, guard pages, linguaggi con controlli. - Differenza tra cifratura simmetrica e asimmetrica e perché si usano insieme. Simmetrica: una chiave segreta, veloce. Asimmetrica: coppia pubblica/privata, lenta. Si usa l'asimmetrica per autenticare e scambiare la chiave, poi la simmetrica per i dati.
- Disponibilità di un sistema con MTTF 500 h e MTTR 5 h. ; ridondanza spaziale (mirroring, macchine di riserva) per aumentarla.
Versione ripasso
Minacce all'accesso. Due categorie: intrusi e software malevolo.
| intruso | chi è |
|---|---|
| masquerader | non autorizzato che supera i controlli e usa l'account di un utente legittimo |
| misfeasor | utente legittimo che accede a ciò che non dovrebbe o abusa dei privilegi |
| clandestine user | prende il controllo di amministrazione, elude audit e controlli o sopprime i dati di audit |
Malware: parassita (non esiste da solo: virus, logic bomb, backdoor) o indipendente (programma schedulabile dal sistema: worm, bot).
Rilevamento delle intrusioni (IDS, RFC 4949). Monitora e analizza gli eventi per segnalare in tempo (quasi) reale accessi non autorizzati. Host-based (un solo calcolatore) o network-based (traffico di segmenti di rete e protocolli). Componenti: sensori (pacchetti, log, tracce delle system call), analizzatori (decidono se c'è intrusione), interfaccia utente.
Autenticazione. Prima linea di difesa. Identificazione (nome utente) verifica (password): qualcosa che si sa (password, PIN), possiede (smart card, token), è (impronta, retina, volto: biometria statica), fa (voce, scrittura: biometria dinamica).
Controllo degli accessi. Politica su chi accede a cosa e come (permessi dei file, sudo, SELinux), database delle autorizzazioni, auditing, firewall (FirewallUn firewall è un componente (hardware, software o entrambi) che blocca il traffico non autorizzato da una rete verso un'altra: filtra i dati, reindirizza il traffico, protegge dagli attacchi. Requisiti: tutto il traffico tra due zone di fiducia deve passare dal firewall, passa solo il traffico autorizzato, il firewall stesso deve essere immune alle intrusioni. L'amministratore configura le politiche (controllo di utente, di servizio, di direzione); un pacchetto può essere accettato, negato o rifiutato (negato più messaggio ICMP alla sorgente). Il firewall decide con le informazioni di intestazione dei livelli 2-4 (indirizzi, protocollo, porte, flag SYN/ACK/FIN). Packet filter: senza stato, filtra in ingresso e in uscita con regole su indirizzi, protocollo, porte, flag (esempi SMTP, Telnet, X11 e correzioni con porte sorgente e flag ACK). Stateful firewall: tiene traccia delle connessioni (NEW, ESTABLISHED, RELATED, INVALID), limita connessioni al secondo, timeout. Firewall applicativo/proxy: ispeziona il livello applicazione, apre una connessione separata verso la destinazione; sicuro ma lento. Linux: netfilter con 5 hook IPv4 e 5 verdetti, iptables (tabelle e catene), connection tracking nf_conntrack.Firewall →); ACL (File system - interfaccia, directory e implementazioneUn file è uno spazio di indirizzi logici contigui con attributi (nome, identificatore, tipo, posizione, dimensione, protezione, date) e operazioni (create, read, write, seek, delete, truncate, open, close); il sistema tiene una tabella dei file aperti di sistema e una per processo; l'accesso è sequenziale o diretto; le directory si organizzano a livello singolo, a due livelli, ad albero, a grafo aciclico (hard link e link simbolici) o a grafo generale; i permessi UNIX rwx per proprietario, gruppo e altri (chmod 754); il file system è a strati (file system logico, organizzazione dei file, file system di base, controllo dell'I/O), con strutture su disco (boot block, superblock, directory, FCB o inode) e in memoria; i blocchi si allocano in modo contiguo (extent), concatenato (FAT) o indicizzato (inode con puntatori diretti e indiretti, ext4 con extent); lo spazio libero con bitmap, lista, raggruppamento o conteggio; mount, VFS, file system distribuiti (NFS) e semantiche di consistenza.File system - interfaccia, directory e implementazione →).
Buffer overflow. Più input della capacità del buffer si sovrascrivono altre informazioni: crash o controllo del sistema. Nello stack ogni chiamata ha un record con argomenti, indirizzo di ritorno, registri salvati e variabili locali (buffer compresi) (Gestione della memoria in CSegmenti di memoria di un processo (codice, dati statici, stack, heap); durata delle variabili; allocazione dinamica con malloc, calloc, realloc e free; errori classici: memory leak, dangling pointer, double free, buffer overflow; strumenti di controllo.Gestione della memoria in C →, Puntatori in CUn puntatore contiene un indirizzo di memoria; operatori & e *, NULL, puntatori come parametri per modificare variabili del chiamante, aritmetica dei puntatori, legame tra array e puntatori, const, puntatori a puntatori.Puntatori in C →). Esempio: str1[8] e str2[8] adiacenti, 15 scritture in str2 7 byte in str1, che diventa 3333333 senza errori (il layout non è garantito). gets() non controlla la lunghezza. Iniezione di codice: si sovrascrive l'indirizzo di ritorno, al termine della funzione si salta a un punto scelto (di solito il buffer con lo shellcode, che avvia una shell). Serve: una vulnerabilità attivabile con dati esterni e la conoscenza del layout; basta chi scrive l'exploit, poi lo usa chiunque (script kiddie). Documento: Phrack 1996, "Smashing the Stack for Fun and Profit".
Difese.
- A compilazione: scelta del linguaggio (tipi forti: Java, Python, C#, con costo in risorse), codifica sicura (revisione, OpenBSD, OpenSSH), estensioni e librerie con controlli di intervallo, protezione dello stack (StackGuard: canarino prima dell'indirizzo di ritorno, controllato all'uscita).
- A esecuzione: bit NX (la pila non è eseguibile), ASLR (posizioni casuali di stack e librerie: basta spostare lo stack di un megabyte per renderne imprevedibile l'indirizzo), guard pages (pagine illegali nella MMU fra le zone o i frame, accesso processo terminato; vedi Memoria centrale - allocazione contigua, paginazione e segmentazioneUn programma deve stare in memoria centrale per girare; la MMU traduce a ogni accesso l'indirizzo logico (virtuale) in indirizzo fisico, sommando un registro di rilocazione e controllando il limite; con l'allocazione contigua (partizioni fisse o variabili, first/best/worst fit) si hanno frammentazione interna ed esterna e serve la compattazione; la paginazione divide memoria logica in pagine e memoria fisica in frame della stessa dimensione (potenza di 2), elimina la frammentazione esterna, traduce (p, d) con la tabella delle pagine (PTBR, PTLR) e riduce il costo dei due accessi con il TLB (EAT = h * t + (1 - h) * 2t); le tabelle grandi si dividono in gerarchiche, hash o invertite; lo swapping sposta intere pagine o processi su disco; la segmentazione usa blocchi di lunghezza variabile con coppia (base, limite), eventualmente paginati; Intel IA-32 usa segmentazione con paginazione a due livelli (10+10+12 bit) e IA-64 quattro livelli su 48 bit.Memoria centrale - allocazione contigua, paginazione e segmentazione →).
- Codice sicuro:
fgets,snprintf,sizeof, spazio per'\0'(Esercizio - Buffer overflow nello stack e versione sicura (slide di sicurezza, parte 1)).
Rete. Sulla rete mittente e destinatario non sono affidabili (l'IP non basta); il sistema controlla i propri attacchi, non la rete. Sniffing (passivo), spoofing, man-in-the-middle (Attacco man-in-the-middleLaboratorio 7 (LAB7). Telnet trasmette utente e password in chiaro: chi può leggere il traffico le ruba. Con un hub (scenario 1) basta un tcpdump sull'attaccante, perché l'hub ripete ogni frame su tutte le porte. Con uno switch (scenario 2) l'attaccante non vede nulla: serve un attacco man-in-the-middle con avvelenamento della cache ARP (ARP spoofing): l'attaccante invia di continuo risposte ARP false, dicendo al client che l'IP del router corrisponde al proprio MAC e al router che l'IP del client corrisponde al proprio MAC; poi inoltra i pacchetti e legge tutto. Wireshark, con Follow TCP stream, ricostruisce la sessione telnet e le credenziali.Attacco man-in-the-middle →).
Crittografia. Limita mittenti e destinatari, usa chiavi: conferma la sorgente, destinatari voluti, relazione di fiducia. Algoritmo: chiavi, messaggi, cifrati, , ; solo con . Simmetrica: stessa chiave (segreta), trasformazioni di bit, veloce (Funzioni hash e crittografia simmetricaLa crittografia trasforma un messaggio in chiaro (plaintext) in un testo cifrato (ciphertext) con una chiave: C = E_ke(P), P = D_kd(C); può dare riservatezza, integrità e autenticazione. Attacchi: solo testo cifrato, testo in chiaro noto, testo in chiaro scelto, forza bruta. Funzione hash: mappa dati di qualsiasi lunghezza in un digest di lunghezza fissa; one-way (dato h è difficile trovare m con hash(m) = h) e resistente alle collisioni; famiglie MD (MD5 rotto per le collisioni nel 2004) e SHA (SHA-0 e SHA-1 rotti, SHA-2 il più usato, SHA-3); costruzione di Merkle-Damgård; usi: integrità e password. Crittografia simmetrica: stessa chiave segreta per cifrare e decifrare; Cesare (E_n(x) = x + n mod 26), Vigenère, Enigma; DES (blocchi da 64 bit, chiave da 56) e AES (blocchi da 128 bit, chiavi da 128, 192, 256); modi ECB (insicuro), CBC, CFB, OFB, CTR. Scambio della chiave con Diffie-Hellman: K = g^(xy) mod p. MAC e HMAC: autenticazione con chiave condivisa.Funzioni hash e crittografia simmetrica →). Asimmetrica: chiave pubblica (cifra) e privata (decifra), basata sui primi; RSA: , , , ; costosa, si usa per autenticare e per scambiare la chiave, poi si passa alla simmetrica (Crittografia asimmetrica, RSA e TLSCrittografia asimmetrica (a chiave pubblica): chiave di cifratura pubblica v_B, chiave di decifratura privata s_B, matematicamente legate; C = E_vB(P), P = D_sB(C); dà riservatezza. I certificati digitali, emessi da una Certificate Authority e firmati con la sua chiave privata, legano un'identità a una chiave pubblica. Firma digitale: hash del messaggio cifrato con la chiave privata; garantisce autenticità, integrità e non ripudio. RSA: si scelgono due primi grandi p e q, N = pq, phi(N) = (p-1)(q-1), e coprimo con phi(N), d = e^(-1) mod phi(N); chiave pubblica (N, e), segreta (N, d); cifratura c = m^e mod N, decifratura m = c^d mod N con m < N (teorema di Eulero); sicura finché la fattorizzazione è difficile (N di almeno 2048 bit); il padding casuale (PKCS#1 v1.5: 00 02 [casuale] 00 [m]) difende da malleabilità e determinismo. La firma RSA è s = m^d mod N, verificata con s^e mod N. TLS (su TCP) autentica gli estremi con il certificato, cifra i dati con una chiave di sessione simmetrica e garantisce l'integrità con i MAC; da TLS 1.0 a 1.3 la chiave si ricava con Diffie-Hellman e l'handshake si accorcia. DTLS è la versione per UDP.Crittografia asimmetrica, RSA e TLS →). Anche l'asimmetrica soffre del man-in-the-middle (chiave "cattiva" intercettata).
Tolleranza ai guasti. Guasto stato errato dovuto a componente, operatore, ambiente, progetto, programma o strutture dati. Permanente (finché non si ripara) o temporaneo (transitorio una volta, intermittente più volte). Tolleranza continuare nonostante i guasti, con ridondanza (costo e prestazioni), in proporzione a quanto è critica la risorsa. Ridondanza spaziale (componenti multipli o di riserva, mirroring), temporale (ripetere l'operazione: solo guasti temporanei), informativa (parità, ECC). probabilità di funzionare fino a ; MTTF/MTBF; MTTR; disponibilità (1000 h e 10 h , circa 87 ore all'anno fuori servizio; 99,99% circa 53 minuti). Metodi del sistema operativo: isolamento dei processi, controlli di concorrenza (deadlock, Deadlock - condizioni, prevenzione, evitamento e rilevamentoUn deadlock (stallo) è una situazione in cui un insieme di processi attende all'infinito risorse possedute da altri processi dello stesso insieme; può verificarsi solo se valgono insieme quattro condizioni (mutua esclusione, hold and wait, assenza di prelazione, attesa circolare); il grafo di allocazione delle risorse (archi di richiesta P->R e di assegnazione R->P) senza cicli esclude lo stallo, con un ciclo lo implica se ogni risorsa ha una sola istanza, e lo rende solo possibile se ha più istanze; si può prevenire (negare una delle quattro condizioni, per esempio ordinare le risorse per negare l'attesa circolare), evitare (stato sicuro: esiste una sequenza sicura; algoritmo del grafo con archi di rivendicazione per istanza singola, algoritmo del banchiere con Available, Max, Allocation, Need = Max - Allocation e complessità O(m n^2) per istanze multiple), rilevare e ripristinare (grafo wait-for per istanza singola, algoritmo di rilevamento per istanze multiple; terminazione dei processi o prelazione delle risorse con scelta della vittima e rollback), oppure ignorare.Deadlock - condizioni, prevenzione, evitamento e rilevamento →), virtualizzazione, checkpoint e rollback (journaling di ext3/ext4).
Domande tipiche. Che cos'è un buffer overflow e come si previene; simmetrica contro asimmetrica; disponibilità con MTTF e MTTR; differenza tra i tipi di intruso.
Errori tipici. Credere che il canarino impedisca di scrivere (rileva soltanto) o protegga le variabili vicine; gets e strcpy senza limite; confondere identificazione e verifica; asimmetrica creduta immune dal man-in-the-middle; ridondanza temporale per guasti permanenti.
Collegamenti: Introduzione alla sicurezza delle retiUna minaccia è un evento o una sequenza di azioni che può violare uno o più obiettivi di sicurezza; la sua realizzazione è un attacco. Obiettivi: riservatezza, integrità, disponibilità, responsabilità (accountability), privacy. Minacce: intercettazione, analisi del traffico, falsificazione, mascheramento, ripudio, profilazione, fingerprinting, disturbo (jamming). Servizi (segretezza, protezione dell'integrità, autenticazione del messaggio e dell'entità, non ripudio, anonimizzazione, gestione delle chiavi, controllo degli accessi) e meccanismi (cifratura, firma digitale, rilevamento delle intrusioni, MAC, randomizzazione, accordo sulla chiave). Un protocollo di sicurezza di livello N protegge la PDU di livello N e superiori, non quelle sotto. Attacchi fisici, software e di rete; sniffing e spoofing alla base di DoS (esempio: Smurf con ICMP) e MITM (avvelenamento della cache ARP o DNS, ICMP redirect). Altri: sinkhole, wormhole, ping of death, DDoS con botnet.Introduzione alla sicurezza delle reti →, Crittografia asimmetrica, RSA e TLSCrittografia asimmetrica (a chiave pubblica): chiave di cifratura pubblica v_B, chiave di decifratura privata s_B, matematicamente legate; C = E_vB(P), P = D_sB(C); dà riservatezza. I certificati digitali, emessi da una Certificate Authority e firmati con la sua chiave privata, legano un'identità a una chiave pubblica. Firma digitale: hash del messaggio cifrato con la chiave privata; garantisce autenticità, integrità e non ripudio. RSA: si scelgono due primi grandi p e q, N = pq, phi(N) = (p-1)(q-1), e coprimo con phi(N), d = e^(-1) mod phi(N); chiave pubblica (N, e), segreta (N, d); cifratura c = m^e mod N, decifratura m = c^d mod N con m < N (teorema di Eulero); sicura finché la fattorizzazione è difficile (N di almeno 2048 bit); il padding casuale (PKCS#1 v1.5: 00 02 [casuale] 00 [m]) difende da malleabilità e determinismo. La firma RSA è s = m^d mod N, verificata con s^e mod N. TLS (su TCP) autentica gli estremi con il certificato, cifra i dati con una chiave di sessione simmetrica e garantisce l'integrità con i MAC; da TLS 1.0 a 1.3 la chiave si ricava con Diffie-Hellman e l'handshake si accorcia. DTLS è la versione per UDP.Crittografia asimmetrica, RSA e TLS →, FirewallUn firewall è un componente (hardware, software o entrambi) che blocca il traffico non autorizzato da una rete verso un'altra: filtra i dati, reindirizza il traffico, protegge dagli attacchi. Requisiti: tutto il traffico tra due zone di fiducia deve passare dal firewall, passa solo il traffico autorizzato, il firewall stesso deve essere immune alle intrusioni. L'amministratore configura le politiche (controllo di utente, di servizio, di direzione); un pacchetto può essere accettato, negato o rifiutato (negato più messaggio ICMP alla sorgente). Il firewall decide con le informazioni di intestazione dei livelli 2-4 (indirizzi, protocollo, porte, flag SYN/ACK/FIN). Packet filter: senza stato, filtra in ingresso e in uscita con regole su indirizzi, protocollo, porte, flag (esempi SMTP, Telnet, X11 e correzioni con porte sorgente e flag ACK). Stateful firewall: tiene traccia delle connessioni (NEW, ESTABLISHED, RELATED, INVALID), limita connessioni al secondo, timeout. Firewall applicativo/proxy: ispeziona il livello applicazione, apre una connessione separata verso la destinazione; sicuro ma lento. Linux: netfilter con 5 hook IPv4 e 5 verdetti, iptables (tabelle e catene), connection tracking nf_conntrack.Firewall →.