15. Protezione e Sicurezza
Proprietà di sicurezza
- Integrità: garantire che il file non sia stato modificato in modo non autorizzato.
- Segretezza e confidenzialità: garantire che il dato possa essere letto solo da chi è autorizzato.
- Autenticità: che l’utente sia effettivamente chi dice di essere.
Primitive di crittografia
Hash crittografiche
Un’hash crittografica è una funzione con un output di lunghezza fissa che mappa stringhe di qualsiasi dimensione a stringhe di lunghezza fissa. Le funzioni di hash crittografiche devono essere di facile computazione, deve essere impossibile determinare la preimmagine e resistenti alle collisioni.
Esempi di hash sono SHA-512 e Keccak e vengono utilizzate nella distribuzione di software online per controllarne l’integrità.
Crittografia a chiave simmetrica
Sia E() la funzione di crittazione e D() la sua inversa funzione di decrittazione. Entrambe oltre al messaggio richiedono la stessa chiave segreta per cifrare e decifrare il messaggio.
Esistono due tipi di cifrari:
- a flusso (stream): si usa una chiave molto lunga univoca per il messaggio e E() è una XOR
- a blocco: E() prende in input una chiave di dimensione fissa di 56, 128 o 256 bit.
Alcuni esempi di cifrari moderni sono RC4, che viene usato in SSL/TLS e nei browser, A5/3 per proteggere la privacy delle comunicazioni telefoniche e AES è il cifrario a blocco standard.
In particolare, AES è utilizzato in diverse applicazioni, come la cifratura di file systems o per cifrare il traffico di rete in protocolli come SSL (Secure Sockets Layer), IPSEC (IP Security), e altri.
Crittografia a chiave pubblica (asimmetrica)
Viene inventata da Diffie e Hellman nel 1976. Ogni utente ha due chiavi diverse: una chiave pubblica per la cifratura e una privata (segreta) per la decrittazione. La chiave pubblica è costruita in modo per cui non si può derivare da essa la privata ed esiste una corrispondenza unica tra le due. Ogni utente ha una coppia di chiavi: privata e segreta, ogni utente conosce tutte le chiavi pubbliche e solo il proprietario conosce la sua chiave segreta. Viene utilizzato oltre al file cifrato una firma del file che determina il proprietario del file. Esempi di algoritmi a chiave pubblica sono RSA e DSA (basata sulle curve ellittiche per smartcard e ambienti embedded).
Certificato digitale
Un certificato digitale è un documento elettronico che certifica che una chiave pubblica appartiene ad una specifica entità, come una persona, un server, un sito web, etc. L'obiettivo principale dei certificati digitali è prevenire l'usurpazione di identità, garantendo l'autenticità delle informazioni.
Trusted boot
Si rende necessario essere sicuri dell’autenticità del kernel caricato in memoria al momento di avvio per garantire integrità ed autenticità.
BIOS
Il BIOS è il Basic Input-Output System. È un firmware in ROM che fornisce un gruppo di interfacce indipendenti dal sistema operativo per l’hardware. Alcuni esempi:
- Int10 per servizi video.
- Int13 per servizi di disco.
- Int16 per servizi di tastiera.
- Int18 il caricatore della ROM BIOS.
- Int19 per il caricatore del bootstrap.
UEFI & Secure UEFI Boot
Nelle nuove macchine il BIOS è stato sostituito da UEFI (Unified Extensible Firmware Interface), un'interfaccia tra il firmware e il sistema operativo che permette di avere molte funzioni aggiuntive rispetto al solo BIOS. Per esempio, fornisce una funzionalità importante di sicurezza chiamata Secure UEFI Boot. Essa fornisce un livello aggiuntivo di sicurezza durante il processo di avvio del sistema operativo, proteggendo il firmware e i componenti del sistema da manipolazioni non autorizzate e da software dannosi. Contribuisce a garantire un ambiente di avvio affidabile e sicuro per il sistema operativo e le applicazioni eseguite sul sistema.
Trusted platform module (TPM)
Il TPM è un chip sicuro integrato sulla scheda madre che fornisce la generazione e memorizzazione sicura delle chiavi crittografiche implementando le primitive. È un coprocessore trusted separato.
Cifratura disco
La partizione di sistema operativo cifrata contiene il sistema operativo, lo swap, i file temporanei, il file system e i file di ibernazione. La chiave di cifratura SRK (storage root key) è memorizzata nella TPM e viene usata per cifrare la chiave di cifratura dell’intero volume (FVEK: full volume encryption key) protetta da un PIN. La FVEK viene memorizzata cifrata sul disco nel volume del sistema operativo.
Login - autenticazione degli utenti
L’autenticazione si può basare su quello che l’utente conosce, come PIN o password, su quello che l'utente ha, come USB o smartcard o su quello che l’utente è o fa (biometrie fisiologiche o comportamentali).
L’autenticazione si svolge in due operazioni: l’identificazione in cui l’utente annuncia chi è e l’autenticazione vera e propria dove si verifica che è chi dice di essere.
Malware
Un malware è un software malevolo che intenzionalmente ha l’obiettivo di violare una o più proprietà di sicurezza.
Trojan horse
Sono programmi che replicano le funzionalità di programmi di uso comune o programmi dall’apparenza innocua ma che contengono codice malevolo. Tipicamente catturano informazioni e le inviano al creatore del programma come informazioni critiche per la sicurezza del sistema, private dell’utente e compromettono o distruggono informazioni importanti per il funzionamento del sistema.
Keylogger
Sono programmi che registrano ciò che l’utente scrive su tastiera e lo inviano al creatore del programma.
Ransomware
Sono programmi che bloccano l’accesso al computer o ai dati e l’utente deve pagare per il loro ripristino.
Rootkits
Sono programmi installati con privilegi di amministratore e inseriscono logica malevola modificando il sistema operativo host per non essere identificabili. Nascondono la loro esistenza modificando i normali meccanismi del sistema operativo come le tabelle dei processo, files, registry entries. Possono essere persistenti o caricati ogni volta in memoria come prima operazione al boot e girare in user o kernel mode. Sono installati tipicamente via Trojan o da intrusione fisica. Occorrono diverse contromisure per renderli innocui.
Vulnerabilità
Buffer overflow
Il buffer è un blocco di memoria che contiene una o più istanze di qualche dato, tipicamente associato ad un array. Tipicamente hanno dimensioni predefinite. Il buffer overflow accade quando il dato di input ha dimensioni maggiori rispetto alla dimensione del buffer. La vulnerabilità sfrutta il layout del programma in memoria e i registri della CPU.
Ricordiamo che la memoria viene divisa nel seguente modo:
-
Dati e Testo: la parte di dati referenzia informazioni su variabili definite a tempo di compilazione e il testo è il codice eseguibile del programma.
-
Stack: salva informazioni temporanee, è LIFO e cresce verso indirizzi più bassi e salva l’indirizzo di ritorno dove il programma deve andare finita la subroutine.
-
Heap: contiene dati allocati a run-time e cresce verso indirizzi di memoria più alti.
Quando chiamiamo le funzioni, esse sono appese allo stack di memoria creando un nuovo stack frame e i buffer sono aree di memoria che sono allocate per conservare dati di input. Un utente malevolo può scrivere come input una stringa che sovrascriva l’indirizzo di ritorno in modo che esegua codice che salti al proprio codice. Il codice dell'attaccante viene comunemente chiamato shellcode. Siccome non sappiamo esattamente dove si trova in memoria il codice contenente l'indirizzo di ritorno, aggiungiamo un po' di ridondanza, scrivendo più volte di ritornare l'indirizzo dove si trova il mio codice.