7/29/2019 D12 Sicurezza Dei Sistemi Operativi
1/167
Sicurezza dei Sistemi Operativi
Luca Grilli
Fabrizio Montecchiani
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
2/167
Introduzione
Un SO (Sistema Operativo), o OS (Operating System), gestisce ilmodo in cui le applicazioni software accedono alle risorse hardwaredel calcolatore: CPU
memoria principale
memoria secondaria periferiche di I/O
interfacce di rete
Un OS fornisce uninterfaccia semplificata e consistente a utenti e
applicazioni al fine di interagire con i componenti hardware grazie a questa astrazione possibile sviluppare programmi software
senza preoccuparsi della particolare tipologia di hardware sul qualesaranno eseguiti
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
3/167
Introduzione
User ApplicationsUserland
Non-essential OS Applications
KernelO.S.
CPU Memory
I/O DevicesHardware
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
4/167
Introduzione
Gli OS svolgono numerose funzioni, alcune
delle quali strettamente legate a problemi di
sicurezza, in particolare vedremo:
meccanismi di autenticazione
sicurezza dei processi
sicurezza del filesystem
sicurezza della memoria
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
5/167
MECCANISMI DI AUTENTICAZIONE
Sicurezza dei Sistemi Operativi
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
6/167
Il Problema dellAutenticazione
Un OS deve poter identificare i propri utenti inmodo sicuro utenti diversi potrebbero avere permessi di accesso
alle risorse diversi
Un meccanismo di autenticazione standardampiamente usato consiste nellinserimento di unusername e di una password se la password inserita coincide con la password
memorizzata dallOS per il dato username alloralutente viene autenticato
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
7/167
Memorizzare le Password
Un OS deve dunque memorizzare la passworddi ogni utente che pu accedere al sistema
Generalmente gli OS memorizzano lepassword criptate attraverso funzioni hash inun file o in un apposito database
grazie alla propriet one-way delle funzioni hash,un attaccante che riesce ad accedere al file dovesono memorizzate le password non pu ricostruirefacilmente il loro valore
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
8/167
Windows e Linux
Windows (32 bit):
C:\WINDOWS\system32\config\SAM
Linux:
/etc/passwd
/etc/shadow (solo lutente root pu leggerle)
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
9/167
Possibili Attacchi
Brute Force: attacco offline, tutte le possibili password perun dato alfabeto vengono generate automaticamente,criptate con la funzione hash usata dal sistema diautenticazione e confrontate con le password memorizzate
Dizionario: attacco offline, liste di parole comuni (es: nomi)che vengono criptate con la funzione hash usata dalsistema di autenticazione e confrontate con le passwordmemorizzate
Rainbow tables
Tempo e spazio sono risorse limitate!
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
10/167
Password Robuste
Linee guida: evitare parole comuni (es: nomi)
evitare password brevi
usare caratteri maiuscoli E minuscoli
usare caratteri speciali (es: segni di punteggiatura) usare i numeri
Quando possiamo considerare una password robusta?
Roma P1er03
P@$$w0rd
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
11/167
Complessit della Password
Possibili password di lunghezza pari a 6 simboli solo numeri:
106 = 1,000,000
solo caratteri maiuscoli O minuscoli : 266 = 308,915,776
solo caratteri maiuscoli E minuscoli : 526 = 19,770,609,664
solo 32 caratteri speciali (&, %, $, , , |, ^, , etc.): 326 = 1,073,741,824
numeri + caratteri maiuscoli E minuscoli + caratteri speciali: 946 = 689,869,781,056
ASCII standard 7 bit, 27 =128 possibili simboli: 1286 = 4,398,046,511,104
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
12/167
Lunghezza della Password
Numeri + caratteri maiuscoli E minuscoli +caratteri speciali = 94 possibili simboli lunghezza 5:
945 = 7,339,040,224
lunghezza 6: 946 = 689,869,781,056
lunghezza 7: 947 = 64,847,759,419,264
lunghezza 8: 948 = 6,095,689,385,410,816
lunghezza 9: 949 = 572,994,802,228,616,704
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
13/167
Scadenza della Password
Es: scadenza password ogni 60 giorni
# PW/sec da testare con un attacco brute-force,
considerando un alfabeto di 94 simboli
lunghezza 5: 1,415 PW/sec
lunghezza 6: 133,076 PW/sec
lunghezza 7: 12,509,214 PW/sec
lunghezza 8: 1,175,866,008 PW/sec
lunghezza 9: 110,531,404,750 PW/sec
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
14/167
Esempio di Password Robusta
Voglio compr@re 11 Cani!
Per scoprire questa password con un
attacco brute-force in 60 giorni dovrei
disporre di un computer in grado digenerare circa 3,86 x 1044 PW/sec!!!
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
15/167
Password Salt
Salt: aggiunta di bit random allinput di unafunzione hash (o di un algoritmo di crittografia) alfine di aumentare la randomicit dellouput
Nel caso dellautenticazione possibile associareun numero random alluserID dellutente salt = numero random + userID
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
16/167
Password Salt
1. Lutente inserisce il suo userIDXe la password P
2. Il processo di autenticazione dellOS recupera il salt Sper luserIDXelhash H del salt concatenato alla password associata aX
3. OS verifica se HASH(S||P) == H
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
17/167
Benefici
Se lattaccante non pu trovare il salt
associato con luserID, allora lo spazio di
ricerca per un attacco con dizionario cresce
notevolmente:
2B x D
B = # bits del salt, D = dimensione dizionario (# parole)
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
18/167
Benefici
Anche se lattaccante fosse in grado di recuperareil salt memorizzato in forma criptata dallOS,questo meccanismo consente di rallentarenotevolmente lattacco con dizionario,rendendolo valido per un userID alla volta senza salt possibile crackare molte password nello
stesso momento, inquanto si ha solo bisogno dellhashdi ogni possibile password e di confrontarlo con tutti
gli hash memorizzati con il meccanismo di salt, ogni possibile password va
concatenata al salt ad essa associato prima dicalcolarne lhash
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
19/167
Benefici
E possibile che due utenti utilizzino la stessa password,o che lo stesso utente scelga di utilizzare la stessapassword per due account diversi
Senza il meccanismo di salt le due password hanno lostesso hash questo potrebbe rivelare il fatto che i due account hanno
la stessa password, permettendo a chiunque che conosceuna delle due password di accedere anche allaltro account
Grazie al meccanismo di salt gli hash delle duepassword risultano invece diversi
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
20/167
Keyloggers e Social Engineering
Crackare una password potrebbe non essere lunico modo perviolare un sistema di autenticazione
Un keylogger uno strumento (HW o SW) in grado di intercettaretutto ci che un utente digita sulla tastiera per proteggersi da un keylogger che invia le informazioni catturate in
remoto si pu utilizzare un firewall HW o SW per intercettare ebloccare la connessione del processo incriminato
inoltre possibile utilizzare tastiere virtuali sullo schermo, fornite damolti OS
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
21/167
LanManager Hash
LM Hash (Lan Manager Hash): algoritmo permemorizzare le password nei sistemi Windowsormai obsoleti (Win 95/98)
Tuttoggi mantenuto per problemi dicompatibilit (va attivato manualmente)
Utilizzabile per password di lunghezza nonsuperiore a 14 caratteri
No prevede lutilizzo del salt
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
22/167
LanManager Hash
1. Pwd convertita in UPPERCASE1. se la dimensione della pwd minore di 14B (1B per carattere)
viene eseguito un NULL padding
2. se la dimensione della pwd maggiore di 14B viene troncata
2. Password divisa in 2 chiavi da 7B, aggiungendo poi uno 0ogni 7 bit
3. Le due chiavi da 8B sono usate per criptare la parola
KGS!@#$% con DES
4. I due valori cifrati sono concatenati per formare un LMHash di 16B
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
23/167
LanManager Hash
UPPERCASE
+
NULL PADDING / TRUNCATING
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
24/167
LanManager Hash
Debolezze:
case insensitive
di 9514 possibili pwd (charset ASCII) ne restano 6914
le password pi lunghe di 7 caratteri sono divise
in 2 met trattate separatamente e crackabili
separatamente 697 = 7.4*1012 possibili pwd
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
25/167
NT Lan Manager Hash
NTLM Hash (NTLan Manager Hash): sostituisceLM Hash nei sistemi Windows NT moderni
Vero hash MD4
Supporta lintero charset Unicode
Lunghezza massima 127 caratteri (limite dellafinestra di Logon)
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
26/167
NT Lan Manager Hash
PWD MD4HASH NT
(16B)
Non prevede lutilizzo del salt
Output di 16B (come LM Hash)
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
27/167
NT Lan Manager Hash
Complessit password:
charset=65535 simboli
consideriamo una lunghezza pari a 14 caratteri
6553514 = 2.7*1067 possibili pwd
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
28/167
SICUREZZA DEI PROCESSI
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
29/167
Processi
Un processo unistanza di un programma in esecuzione il codice di un programma in esecuzione viene caricato dalla
memoria secondaria in cui memorizzato e passato allamemoria primaria
pi istanze di uno stesso programma possono essere eseguite
come processi diversi un processo pu controllare altri processi
unapplicazione pu essere composta da pi processi
i processi attivi vengono eseguiti parallelamente attraverso latecnica di time-sharing su ogni core della CPU
Ogni processo univocamente identificato da un interodetto PID (Process ID) e viene associato alluser (utente)che lo ha generato
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
30/167
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
31/167
Esempio di Codice C
int main()
{
printf("I'm the parent, my PID is %d, my parent is process %d\n",
getpid(), getppid());
fork();
printf("This sentence has been printed by process: %d my parent
is process %d\n", getpid(), getppid());
}
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
32/167
Istruzione fork()
Listruzionefork() crea una copia del processo corrente valore di ritorno
0 nel processo figlio
maggiore di 0 nel processo padre (il valore restituito
proprio il PID del figlio) minore di 0 nel caso in cui non sia stato possibile creare un
nuovo processo
viene creato uno address space (porzione di memoriadedicata) separato per il processo figlio, il quale eredita
una copia esatta di tutti i segmenti di memoria delprocesso padre (codice, stack, file descriptor, heap, variabiliglobali, e program counter)
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
33/167
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
34/167
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
35/167
Comunicazione tra Processi
Esistono diversi meccanismi per la comunicazione traprocessi: lettura/scrittura di files
semplice ma inefficiente (e poco sicuro)
porzione di memoria RAM condivisa veloce ed efficiente
il kernel deve gestire in maniera sicura la separazione tra porzioni dimemoria condivise e private
pipes e sockets oggetti in RAM condivisi che fungono da canale virtuale tra due
processi
signals notifiche asincrone, il processore interrompe il flusso del processo
ricevente e verifica se esiste un gestore per la notifica (routine daeseguire)
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
36/167
Demoni e Servizi
Linux: i daemons sono processi lanciati primadellautenticazione dellutente, tipicamente dalprocesso init possiedono permessi pi alti di qualsiasi utente
sopravvivono al termine delle sessioni utente sono indistinguibili dagli altri processi
Windows: esistono processi analoghi chiamati services
rispetto ai daemons sono distinguibili dagli altri processi sono monitorati in modo specifico allinterno del
TaskManger (esistono due tab separati, uno per i processie uno per i servizi)
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
37/167
Kernel
Il kernel il componente principale di un OS, inquantogestisce direttamente lhardware di basso livello (CPU,memoria, periferiche di I/O)
Le periferiche di I/O (tastiera, mouse, scheda direte,) sono pilotate attraverso drivers i drivers espongono alle applicazioni delle API
(Application Programmer Interface) al fine diconsentire lutilizzo della periferica ad alto livello
un driver specifico sia dal punto di vistadell'hardware che pilota, sia dal punto di vista delsistema operativo per cui scritto
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
38/167
System Call
I processi comunicano con il kernel per inoltrarele richieste verso lhardware. La comunicazioneavviene mediante librerie dette system call ad ogni system call segue generalmente un interrupt
che vincola il processore a fermare lesecuzionecorrente e a gestire la chiamata
Possibili attacchi:
contraffazione di una system call al fine di eseguirecodice malevolo ad ogni chiamata
danneggiamento di una system call al fine dicompromettere il funzionamento del sistema
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
39/167
System Call
Sempre pi spesso in realt, i programmatori nonusano direttamente le system call, ma delle APIche fungono da strato intermedio tra leapplicazioni e le system call, al fine di facilitare emigliorare la portabilit delle applicazioni
Esistono API per i vari sistemi operativi:
API Win32 per i sistemi Windows API POSIX per le varie versioni di Unix, Linux e Mac OS
X
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
40/167
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
41/167
System Call
Esistono tipi di System Call per ogni possibileoperazione:
controllo dei processi:
creazione, terminazione, esecuzione di codice specifico
prelievo degli attributi di un processo
attesa per un tempo indicato
sincronizzazione con altri processi
gestione dei file:
creazione, cancellazione, rinominazione
apertura, chiusura, lettura, scrittura
impostazione delle propriet
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
42/167
System Call
comunicazione fra processi:
creazione e chiusura del canale di comunicazione
invio e ricezione di messaggi
informazione sullo stato della comunicazione gestione dei dispositivi
gestione delle informazioni di sistema
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
43/167
Utenti
Ogni processo associato ad un utente
Utenti specifici possono avere permessi
maggiori rispetto agli utenti normali
installare o rimuovere programmi
modificare i permessi degli altri utenti
modificare la configurazione del sistema
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
44/167
Utenti
Nei sistemi Unix lutente root non ha alcuna restrizione
Nei sistemi Windows esistono diversi utenti speciali SYSTEM, LOCAL SERVICE e NETWORK SERVICE associati direttamente
al sistema operativo
SYSTEM non ha restrizioni LOCAL SERVICE e NETWORK SERVICE agiscono con permessi ridotti e specifici
per i loro scopi
uno o pi administrator(con permessi minori rispetto allutenteSYSTEM)
Lautenticazione come root/administrator pu essere rischiosa in caso di eliminazione accidentale di file di sistema
in caso di esecuzione accidentale di codice malevole che pu agire congli stessi permessi
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
45/167
Linux
Ad ogni processo sono associati 4 indici un uid (user ID) che identifica lutente che ha lanciato il processo
un gid (group ID) che identifica il gruppo a cui appartiene lutente
un euid (effective user ID) che pu differire dalluid e identificare lutenteproprietario del file eseguibile, il quale pu avere permessi maggiori
leuid prevale sulluid solo nel caso in cui settato il bit setuid
Un egid (effective group ID) che pu differire dallgid e identificare il gruppoproprietario dellapplicazione, il quale pu avere permessi maggiori
legid prevale sullgid solo nel caso in cui settato il bit setgid
Tramite questi id OS in grado di stabilire i permessi di un dato processosu una data risorsa
I permessi del processo figlio sono automaticamente ereditati dalprocesso padre
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
46/167
Linux
La decisione di attivare o meno il bit setuid/setgid dipende dalproprietario del file eseguibile (di default sono disattivati)
Comandi: chmod u+s : attiva setuid
chmod u-s : disattiva setuid chmod g+s : attiva setuid
chmod g-s : attiva setuid
Molti programmi che accedono risorse di sistema hanno il bit setuid
settato e sono detti setuid programs (es:passwd, su) Questo meccanismo pu essere soggetto ad attacchi di scalata dei
privilegi, che vedremo pi avanti
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
47/167
Linux Esempio 1/2
app: nome di un file eseguibile
userA e groupA: UID e GID dellutente proprietario del file app
userB e groupB: UID e GID dellutente che lancia app, producendo ilprocesso P
Se il bit SETUID di app attivo: l EUID di P userA, il EGID di P groupA
lUID di P userB, il GID di P groupB
Se il bit SETUID di app NON attivo: EUID e UID coincidono con userB
EGID e GID coincidono con groupB
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
48/167
Linux Esempio 2/2
Supponiamo ora che il processo P voglia accedere adun file di nome info1. se EUID di P coincide con il proprietario di info, il
processo acquisisce i diritti di accesso del proprietario diinfo
2. ALTRIMENTI se EGID di P e il gruppo di info coincidono, Pacquisisce i diritti di accesso del gruppo di utentiassociato a info
3. se NESSUNA delle due precedenti condizioni `e valida,valgono i normali diritti di accesso che vedremo piavanti (lettura/scrittura/esecuzione), laccesso sarconsentito o meno a seconda della categoria di utentinella quale ricadono UID e GID del processo P
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
49/167
Windows
WUAC (Windows User
Access Control):
permessi standard per luso
regolare possibilit di acquisire i
permessi da amministratore
solo temporaneamente, su
richiesta esplicita dei
programmi
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
50/167
Monitoraggio dei processi
Il monitoraggio dei processi in esecuzione purivelare la presenza di codice malevolo verificare il nome dei processi
opportuno conoscere il nome dei processi considerati
sicuri importante notare anche piccole differenze nei nomi
verificare inoltre (anche per i processi sicuri) user
attivit di rete (porte aperte, traffico,)
immagine (file eseguibile associato al processo) path del file
autore
firma digitale (se presente e verificabile)
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
51/167
Comandi Linux
pstree: mostra lalbero dei processiin esecuzione
ps: mostra i processi in esecuzionein forma tabulare ps -ef: tutti i processi
ps -u:solo iprocessi dellutente specificato
top: lista dei processi in esecuzioneordinati per consumo di CPU
kill: termina il processocon pid specificato
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
52/167
Strumenti Windows
TaskManager: applicazione standard
lista dei processi in esecuzione
informazioni base per ogni
processo
possibilit di terminare processi
ProcessExplorer: add-on gratuito
informazioni dettagliate per ogni
processo
visualizzazione albero dei processi funzionalit aggiuntive
scaricabile al seguente URL:
http://technet.microsoft.com/en-
us/sysinternals/bb896653
http://technet.microsoft.com/en-us/sysinternals/bb896653http://technet.microsoft.com/en-us/sysinternals/bb896653http://technet.microsoft.com/en-us/sysinternals/bb896653http://technet.microsoft.com/en-us/sysinternals/bb896653http://technet.microsoft.com/en-us/sysinternals/bb8966537/29/2019 D12 Sicurezza Dei Sistemi Operativi
53/167
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
54/167
Threads
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
55/167
Threads
I thread allinterno di un processo condividono: PID
address space
codice
variabili non locali
file descriptors aperti
user e group id
Mentre non condividono:
Thread ID (TID) linsieme dei registri, compresi program counter e stack pointer
stack per le variabili locali e record di attivazione
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
56/167
Threads
Operazioni comuni
create
exit
suspend
resume
sleep
wake
join
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
57/167
Threads
User-level threads implementati attraverso librerie ad alto livello che consentono la creazione, lo
scheduling, e la sincronizzazione dei thread
OS ignora la presenza dei thread
Vantaggi: non richiesto alcun supporto da parte del SO (maggiore portabilit) possono essere predisposte politiche di scheduling adeguate allapplicazione
le operazioni su thread sono efficienti perch non richiedono lesecuzione disystem call
la condivisione di memoria facile e veloce
Svantaggi: lintero processo si blocca quando si blocca un solo thread
gli accessi ai dati condivisi devono essere opportunamente sincronizzati perevitare errori
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
58/167
Logging
Un ulteriore tipo di analisi legato ai processi consiste nelmonitoraggio degli eventi registrati dallOS tentativi di login, attivit di rete,
Linux Logging
diversi tipi di log (boot, I/O errors,) salvataggio in files di testo semplici
diversi file di log in base alla distribuzione
Windows logging
eventi divisi in Sistema, Applicazioni e Sicurezza ogni evento ha un id univoco
visualizzazione possibile solo con Windows Event Viewer
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
59/167
Linux Logging
Formato standard linux File contenuto in /var/log/messages e accessibile
solo allutente root
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
60/167
Windows Event Viewer
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
61/167
Sequenza di Boot
La sequenza di boot o booting si riferisce alcaricamento del sistema operativo in memoria
1. inizialmente il processore esegue il codicememorizzato nel componente firmware chiamato
BIOS (Basic Input/Output System) in questa prima fase vengono eseguite vari attivit tra cui
un controllo dellhardware chiamato POST
2. viene richiamato un boot loader secondario (second-
stage boot loadero secondary loader) che a suavolta carica in memoria lOS
3. il controllo passa allOS
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
62/167
Sequenza di Boot
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
63/167
Sequenza di Boot
In molti casi il boot loader secondario consenteallutente di specificare il dispositivo da cui caricare ilsistema operativo (es: hard disk, DVD drive, USBcontroller)
Un possibile scenario di attacco consiste nel dirottare ilboot loader secondario verso un dispositivo esterno
Il processore carica lOS dellavversario che pu essere una
contraffazione dellOS della vittima Molti boot loader secondari richiedono una password al
fine di effettuare modifiche
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
64/167
Ibernazione
I calcolatori moderni offrono la possibilit di
passare in modalit di ibernazione, in cui il
consumo di energia elettrica interrotto
il contenuto della memoria primaria copiatonella memoria secondaria
tutte le informazioni sensibili (password, dati
personali,) sono memorizzate sul disco fisso
al riavvio i dati vengono nuovamente caricati sulla
memoria primaria
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
65/167
Vulnerabilit di Windows
Windows memorizza questi dati nel file C:\hiberfil.sys compresso alcuni ricercatori hanno dimostrato che possibile decomprimere
questo file al fine di ricreare unimmagine della memoria primaria almomento dellibernazione
Come ottengo una copia del file? possibile estrarre il disco fisso da un computer ibernato
ancora pi facilmente, Windows non elimina subito il file hiberfil.sysche pu restare salvato per diversi riavvii, permettendo una copia delfile in un secondo momento
come proteggersi? possibile utilizzare algoritmi di cifratura robusti per criptare i file
memorizzati sul disco rigido
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
66/167
SICUREZZA DEL FILESYSTEM
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
67/167
Filesystem
Il filesystem un altro componente fondamentale diun OS, in quanto fornisce unastrazionesullorganizzazione della memoria secondaria delcalcolatore
Gli OS organizzano tipicamente i file in una gerarchia
Ogni cartella pu contenere file e/o sottocartelle
In questo modo possibile rappresentare la memoriasecondaria attraverso una struttura ad albero radicato
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
68/167
Windows Explorer
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
69/167
Terminologia
Principal: utente o gruppo di utenti
Permission: azione possibile read
write
execute
list
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
70/167
Access Control Entries
ACE (Access Control Entry): tripla type pu avere due soli valori: ALLOW o DENY
definisce esplicitamente cosa possibile fare e cosa
non per una specifica risorsa e per un dato principal
ACL (Access Control List): lista ordinata di tripleACE
Ad ogni file e directory viene associata un ACLche definisce la politica di accesso alla risorsa
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
71/167
Discretionary Access Control
DAC (Discretionary Access Control): il creatore(owner) di un file o directory ha il potere di
modificare i permessi ad esso associati (ACE)
Closed policy o default sicuro: solo ACE di tipoallow, tutti i permessi non esplicitamente concessi
sono automaticamente negati
Open policy: ACE tipo sia ALLOW che DENY
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
72/167
Linux Access Control
DAC con default sicuro
Laccesso a un file dipende da ACL del file e di
tutte le directory antenate:
partendo dalla directory root
tutte le directory antenate devono avere il permesso
execute per lutente specificato il file deve avere il permesso per laccesso
richiesto (es. read) per lutente specificato
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
73/167
Permessi Linux
File permission matrix: matrice di permessiassociata ad ogni file e directory
standard per tutti i sistemi Unix
3 classi di permessi owner: permessi per lutente creatore del file
group: permessi per gli utenti appartenenti allo stesso
gruppo del file
others: permessi per gli utenti che non sono il creatore
del file n appartengono allo stesso gruppo
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
74/167
Permessi Linux
I permessi di ognuna delle 3 classi sono definiti da 3bit:
read bit: file: lutente pu leggere il file
directory: lutente pu leggere la lista dei file in essa contenuti
write bit: file: lutente pu modificare il contenuto del file
directory: lutente pu creare ed eliminare i file in essa contenuti
execute bit:
file: lutente pu eseguire il file come un programma
directory: pu cambiare la sua cartella corrente con essa
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
75/167
Esempi
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
76/167
Comandi Linux
ls l: restituisce la matrice dei permessi pertutti i file e le directory contenuti nella
directory di lavoro corrente
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
77/167
Permessi Speciali Linux
Set-user-ID (suid o setuid) bit su file eseguibili, causa lesecuzione del processo con i
diritti dellutente owner
Set-group-ID (sgid o setgid) bit su file eseguibili, causa lesecuzione del processo con i
diritti del gruppo del file
Sticky bit sulle directory, vieta a tutti gli utenti di eliminare o
rinominare file di cui non sono i creatori
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
78/167
Notazione Ottale
Permessi espressi con un numero di 3 o 4 cifre in base8
Cifre da sx a dx:
[special bits][user bits][group bits][others bits]
Bits speciali: 4 (se setuid) + 2 (se setgid) + 1 (se sticky)
User/Group/Others bits: 4 (se readable) + 2 (se writable) + 1 (se executable)
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
79/167
Esempi
l
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
80/167
Accesso Senza Privilegi
Il bit setuid risolve il problema dellaccesso senzaprivilegi
Esempio: sappiamo che un processo eredita i permessi dal
processo padre
se un utente volesse modificare la propria passwordattraverso il programma di sistemapasswdnon
potrebbe farlo inquanto non avrebbe i permessi peraccedere al file etc/passwd
In realtpasswdviene eseguito con i privilegidellutente root grazie al bit setuid
S l d i i il i
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
81/167
Scalata dei Privilegi
Se un attaccante riesce a forzare unprogramma setuid a eseguire codice arbitrario(ad esempio tramite un attacco di tipo bufferoverflow) pu compromettere il sistema,realizzando uno scenario di attacco chiamatoscalata dei privilegi (o privileges escalation)
Questo meccanismo va gestito attraversotecniche di programmazione sicura
E i di C di C
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
82/167
Esempio di Codice C#include
#include
#include #include
static uid t euid, uid;
int main(int argc, char * argv[ ])
{
FILE *file;
/* Store real and effective user IDs */
uid = getuid();
euid = geteuid();/* Drop priviliges */
seteuid(uid);
/* Do something useful */
/* . . . */
/* Raise privileges */
seteuid(euid);
/* Open the file */
file = fopen("/home/admin/log", "a");
/* Drop privileges again */
seteuid(uid);
/* Write to the file */
fprintf(file, "Someone used this program.\n");
/* Close the file stream and return */
fclose(file);
return 0;
}
N li
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
83/167
Nautlius
Nautilus il file manager
ufficiale dell'ambiente
desktop GNOME
Wi d A C l
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
84/167
Windows Access Control
DAC con open policy
Se non c una regola per un particolare principal opermesso allora laccesso negato di default
Se non c una regola per un particolare principal opermesso allora laccesso negato di default
A differenza di Linux, al fine di accedere ad un file o ad una
directory, sufficiente avere i permessi per lazionerichiesta sul dato file o directory in questo modo possibile negare laccesso ad una data
directory pur consentendo laccesso alle directory figlie
P i E li iti
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
85/167
Permessi Espliciti
Explicit permissions standard permissions
modify
read and execute
read write
full control
advanced permissions possibile comporre i permessi standard per creare
permessi pi complessi Es: read data, read attributes,
P i E dit ti
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
86/167
Permessi Ereditati
Inherited permissions: ogni permesso applicatoad una directory pu essere esteso alle directoryfiglie
Controllo dei permessi:
Il permesso DENY ha precedenza sul permesso ALLOW
I permessi espliciti hanno precedenza sui permessi
ereditati I permessi ereditati hanno precedenza tra di loro in
base alla distanza dalla risorsa
Wi d E l
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
87/167
Windows Explorer
NTFS
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
88/167
NTFS
NTFS (New Technology File System):sostituisce il filesystem FAT (File Allocation
Table) nei moderni OS Microsoft
Filesystem chiuso e proprietario, utilizzabile
solo dagli OS Microsoft
Supporta meccanismo ACL appena descritto
NTFS
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
89/167
NTFS
NTFS
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
90/167
NTFS
Fil D i t
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
91/167
File Descriptors
Un file descriptor o file handle un identificatore perun file o per una cartella
I file descriptor sono memorizzati in una tabella che li
mappa con il percorso del file a cui si riferiscono,chiamata file descriptor table
Operazioni possibili open: ritorna un file handle
read/write/execute file
close file: invalida il file handle
File Descriptors
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
92/167
File Descriptors
Quando un processo (programma) necessita di accedere adun file in lettura o scrittura: viene richiamata una open system call
il kernel verifica se il processo possiede i permessi necessari peraccedere al file con lazione richiesta
se la verifica positiva, il kernel crea un nuovo file descriptor euna nuova entry nella file descriptor table, quindi ritorna il filedescriptor al processo
il processo pu leggere/scrivere sul file richiamando le relativeread/write system call, il kernel (attraverso la file descriptortable) effettua le letture/scritture direttamente sul file originale
Al termine il processo dovrebbe richiamare una close system callper rimuovere il file descriptor
File Descriptors Leaks
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
93/167
File Descriptors Leaks
Quando un processo crea un processo figlio(forking), questultimo eredita una copia di tutti ifile descriptors aperti dal processo padre
LOS verifica i permessi soltanto al momento dellacreazione del file descriptor Al momento della lettura/scrittura sul file, i controlli
effettuati si basano sui permessi associati al file
descriptor (ad esempio un processo pu sfruttare unfile descriptor in lettura solo per leggere il file e nonper scrivere)
File Descriptors Leaks
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
94/167
File Descriptors Leaks
Scenario pericoloso: un processo con alti privilegi apre un file
descriptor per un file protetto
prima di chiudere il file descriptor crea un nuovoprocesso con privilegi minori, il quale ereditacomunque il file descriptor (inquanto ancoraaperto)
il processo figlio pu usare il file descriptor purnon avendo i permessi necessari per operare sulfile protetto!
Esempio di Codice C
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
95/167
Esempio di Codice C
#include #include
int main(int argc, char * argv[ ])
{/* Open the password file for reading */
FILE *passwords;
passwords = fopen("/home/admin/passwords", "r");
/* Read the passwords and do something useful */
/* . . . */
/* Fork and execute Joes shell without closing the file */
execl("/home/joe/shell", "shell", NULL);
}
Per rimuovere questa vulnerabilit la funzione fclose() varichiamata prima del comando execl()
Symbolic Links
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
96/167
Symbolic Links
Nei sistemi Unix un link simbolico (symlink) un file che contienele informazioni utili a referenziare un altro file presente nelfilesystem
Pi symlink possono essere concatenati (lultimo symlink dellacatena deve comunque puntare ad un file fisico)
Per le applicazioni un symlink trasparente compito dellOS risalire al file partendo dal symlink usato
dallapplicazione
Questo approccio pu creare problemi di sicurezza inquanto vano
verificati i permessi sia sul symlink (o sulla catena di symlink) sia sulfile che esso punta
Shortcuts
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
97/167
Shortcuts
I sistemi Windows utilizzano invece le shortcuts,che in maniera simile ai symlink puntano ad altrifile
Le shortcuts non sono trasparenti alleapplicazioni ma sono trattate come file normali
solo i programmi che le riconoscono come shortcuts
possono risalire al file puntato approccio pi sicuro
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
98/167
SICUREZZA DELLA MEMORIA
Address Space
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
99/167
Address Space
Un ulteriore servizio offerto dagli OS lorganizzazionee lallocazione della memoria primaria
Quando un processo viene lanciato lOS alloca una
regione di memoria detta address space del processo la gestione della memoria trasparente per il processo
il processo vede a sua disposizione lintera memoria
Generalmente un processo non pu avere accessoalladdress space di un altro processo, se non perrisorse esplicitamente condivise
Unix Address Space
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
100/167
Unix Address Space
Modello address space diviso in 5 settori: Text: memorizza il codice macchina del programma
Data: memorizza le variabili statiche del programmainizializzate prima dellesecuzione
BSS (Block Started By Symbol): memorizza le variabilistatiche del programma non inizializzate
Heap: settore dinamico, memorizza i dati generatidurante lesecuzione del programma (es: oggettiJava/C#/C++)
Stack: memorizza una struttura dati a pila, che tienetraccia delle chiamate a metodi e routine con i relativiargomenti e punti di ritorno
Unix Address Space
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
101/167
Unix Address Space
Lo stack cresce verso il basso
Unix Address Space
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
102/167
Unix Address Space
Ogni settore ha il suo set di permessi readable/writable/executable
il settore text read-only inquanto il codice
macchina del programma in esecuzione non deveessere modificato
gli altri settori necessitano di essere writable
inquanto i loro dati devono poter essere
modificati durante lesecuzione
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
103/167
Disassemblers e Decompilatori
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
104/167
Disassemblers e Decompilatori
Un disassembler un programma che traduce dal linguaggiomacchina al linguaggio assembly (operazione inversa di unassembler)
L'output di un disassembler (disassembly) spesso fatto in modo dapoter essere facilmente compreso dall'uomo piuttosto che peressere utilizzato come input per un assembler
I disassembler sono tra gli strumenti pi comunemente utilizzati peril reverse engineering del software
Un decompilatore traduce il linguaggio macchina in un linguaggioad alto livello
Disassemblers e Decompilatori
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
105/167
Disassemblers e Decompilatori
Le costanti simboliche e i commenti vengonogeneralmente rimossi dall'assembler la perdita di queste informazioni rende pi difficile la
comprensione del codice rispetto al codice sorgenteoriginario
Sulle piattaforme con le istruzioni CISC di larghezzavariabile, o in presenza di codice auto-modificante, possibile per un unico programma per avere due o piassembly plausibili determinare quali istruzioni si incontreranno durante
unesecuzione del programma si riduce al problema dellafermata (dimostrato irrisolvibile)
Interactive Disassembler
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
106/167
Interactive Disassembler
Interactive DisAssmbler (IDA) un disassemblerlargamente usato per il reverse engineering. Supportanumerosi formati di file eseguibili per diversi processorie OS
Caratterizzato soprattutto dall'interattivit un tipico utente di IDA inizier con un listato generato
automaticamente per poi rinominare, commentare, oaggiungere in altri modi informazioni al codicedisassemblato
Approfondimento: http://www.hex-rays.com/idapro/
Buffer Overflow
http://www.hex-rays.com/idapro/http://www.hex-rays.com/idapro/http://www.hex-rays.com/idapro/http://www.hex-rays.com/idapro/http://www.hex-rays.com/idapro/http://www.hex-rays.com/idapro/7/29/2019 D12 Sicurezza Dei Sistemi Operativi
107/167
Buffer Overflow
Buffer: blocco di memoria contiguo che contiene piistanze dello stesso tipo
in C e in molti altri programmi i buffer sono chiamati array
i buffer pi comuni sono gli array di caratteri (stringhe)
In C i buffer, come tutte le variabili, possono esseredichiarati statici o dinamici
le variabili statiche sono allocate al momento del
caricamento del programma sul segmento data le variabili dinamiche sono allocate in fase di esecuzione
sullo stack
Buffer Overflow
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
108/167
Buffer Overflow
Scenario: un programma alloca in memoria un buffer (array) di
dimensione fissata
nel buffer viene poi copiato un input proveniente dallutente
la dimensione di tale input non viene controllata prima
delloperazione di copia
Attacco: un attaccante pu confezionare un input malevolo di
dimensione superiore a quella del buffer
il programma copia linput e sovrascrive regioni di memoriaoltre al buffer
lattaccante riesce a eseguire codice malevolo (shellcode) con iprivilegi del programma attaccato
Shellcode
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
109/167
Shellcode
Codice malevolo iniettato sfruttando un attacco buffer overflow buffer riempito di codice malevolo = payload
Lattaccante solitamente inietta codice in grado di aprire unterminale (shell) attraverso cui eseguire altri comandi
Linux: /bin/sh Windows: command.com
Ad esempio in un sistema Linux possibile iniettare codice che richiama lafunzione setuid() per poi aprire un terminale
Il codice viene generalmente iniettato direttamente sullo stack osullheap e pertanto deve essere scritto in codice operativo(opcodes) specifico per larchitettura della CPU attaccata
Morris Worm
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
110/167
Morris Worm
Primo worm a sfruttare una vulnerabilit di tipo bufferoverflow scritto da Robert Morris nel 1988 allo scopo dichiarato di
valutare le dimensioni di Internet
autoinstallante e autoreplicante, si diffuso in maniera
estremamente veloce, oltre le aspettative di Morris
Il target la funzione gets() appartenente alle librerie Cstandard e utilizzata nel serviziofingerdellUniversit
di Berkley gets() legge una riga dallo standard input e la memorizza in
un buffer di 512 byte senza verificare le dimensionieffettive della riga letta
Morris Worm
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
111/167
Morris Worm
Attacco: input di dimensione pari a 536 byte che causa il
buffer overflow
indirizzo di ritorno della routine sovrascritto conlindirizzo dello shellcode (codice macchina per
architettura VAX)
lo shellcode lancia una shell e richiama il processo
di bootstrap della macchina al fine di installarsi
attacco di tipo Denial Of Service
Morris Worm
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
112/167
Morris Worm
Morris fu condannato ad unapena di tre anni di libertcondizionata, 400 ore di servizisocialmente utili e 10.050 dollaridi multa
Oggi insegna al MIT Lab forComputer Science
Nel 1998 ha venduto a Yahoo!, alprezzo di 49 milioni di dollari, unastart-up da lui fondata, ViawebInc. (oggi Yahoo! Store)
Arithmetic Overflow
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
113/167
Arithmetic Overflow
Caso pi semplice di attacco, sfrutta larappresentazione di numeri interi
La maggior parte delle architetture a 32 bit gli intericon segno sono rappresentati in
complemento a due il bit iniziale (pi a sinistra) del numero ha peso negativo opositivo: tutti i numeri che cominciano con un "1" sononumeri binari negativi, mentre tutti i numeri checominciano con uno "0" sono numeri binari positivi e se neottiene il valore assoluto invertendo il valore dei singoli bite aggiungendo 1 al numero binario risultante
un numero binario di n cifre pu rappresentare con questometodo i numeri compresi fra -2n-1 e +2n-1-1
Arithmetic Overflow
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
114/167
Arithmetic Overflow
In esadecimale gli interi con segno da0x00000000 a 0x7ffffff sono numeri positivi,mentre da 0x80000000 a 0xffffffff sono numerinegativi
La soglia tra questi due range consente situazionidi overflow e underflow
Es: la somma di numeri molto grandi pu portare adun overflow, dando come risultato un numeronegativo
Stack-Based Buffer Overflow
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
115/167
Stack Based Buffer Overflow
Perch viene usato lo stack?
I moderni computer sono progettati tenendo in mente la necessitdi poter usufruire di linguaggi di alto livello (come C e C++). la tecnica pi importante per la strutturazione dei programmi
introdotta dai primi linguaggi di alto livello la routine (function)
una chiamata a una procedura altera il flusso di controllo propriocome fa un salto, ma a differenza di un salto, al suo termine il controlloritorna alladichiarazione o istruzione successiva alla chiamata
questo alto livello di astrazione implementato con l'aiuto dello stack
Lo stack usato nellambito delle routine per allocaredinamicamente le variabili locali, per il passaggio dei parametri, eper la restituzione di valori
Stack-Based Buffer Overflow
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
116/167
Stack Based Buffer Overflow
Lo stack un settore delladdress space contenente dati. Lasua dimensione regolata dinamicamente dal kernelin fase di esecuzione politica LIFO (Last In First Out)
la CPU esegue le istruzioni di PUSH e POP
ogni chiamata ad una routine associata ad un frame chememorizza le variabili locali, gli argomenti, e lindirizzo di ritornoverso la chiamata padre
alla base dello stack c il frame relativo alla chiamata main()
Un buffer overflow che coinvolge una variabile locale pucausare la sovrascrittura di parte della memoria allocatanello stack, con conseguenze pericolose
Stack-Based Buffer Overflow
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
117/167
Stack Based Buffer Overflow
Return address: puntatore allindirizzo di memoria in cui laroutine in questione stata chiamata
Stack pointer (ESP): registro dedicato che contienel'indirizzo dell'ultima locazione di memoria occupata sullo
stack (ovvero il top dello stack vista la politica LIFO diinserimento) viene aggiornato continuamente vista la dinamicit dello stack
Frame pointer (EBP): registro per tenere traccia della primalocazione di memoria del record di attivazione di unaroutine
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
118/167
Esempio
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
119/167
Esempio
void function(int a, int b, int c)
{
char buffer1[5];
char buffer2[10];}
void main()
{
function(1,2,3);
}
c
b
aReturn Address
Frame Pointer
buffer1 (8 bytes)
buffer2 (12 bytes)
Esempio di Codice C (1/2)
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
120/167
Esempio di Codice C (1/2)
La funzione strcpy(dest,src) (appartenente alle librerie C standard)copia la stringa src in destsenza verificare se la dimensione di srceccede quella di dest
Main(int argc, char *argv[])
/* get user_input */{
char var1[15];
char command[20];
strcpy(command, whois ");
strcat(command, argv[1]);strcpy(var1, argv[1]);
printf(var1);
system(command);
}
Esempio di Codice C (2/2)
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
121/167
Esempio di Codice C (2/2)
La funzione strncpy(dest,src,n) consente di specificare il numero dicaratteri da copiare, se la lunghezza di src supera quella di desticaratteri in eccesso vengono scartati
Main(int argc, char *argv[])
/* get user_input */{
char var1[15];
char command[20];
strcpy(command, whois ");
strcat(command, argv[1]);strcpy(var1, argv[1]);
printf(var1);
system(command);
}
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
122/167
Stack Smashing Attack
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
123/167
g
Stack Smashing Attack
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
124/167
g
Al fine di confezionare un attacco efficacelattaccante deve:
assicurarsi che il codice malevolo iniettato risiedanelladdress space del processo attaccato
(altrimenti non sarebbe eseguito) il codice pu essere tenuto nel buffer stesso (payload)
Conoscere lindirizzo dello shellcode (buffer)
NOP Sledding
Trampolining
Return-to-libc
NOP Sledding
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
125/167
g
NOP (No-op): istruzione che non fa nulla, il processore eseguesemplicemente listruzione seguente
Lattaccante confeziona un input che contiene: una quantit di dati appropriata da eccedere le dimensioni del buffer
una stima dellindirizzo di ritorno
una grande quantit di istruzioni NOP
lo shellcode
Semplifica il problema di dover conoscere esattamente la posizionedello shellcode la dimensione del payload aumenta grazie al gran numero di istruzioni
NOP
NOP Sledding
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
126/167
g
Se lattacco funziona il processo salter al puntodi ritorno stimato (sovrascritto da qualche
istruzione NOP) e slitter verso il codice
malevolo attraverso la catena di istruzioni NOP
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
127/167
Trampolining
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
128/167
p g
Al momento della loro inizializzazione moltiprocessi caricano nel loro address space dellelibrerie esterne
Queste librerie sono caricate in zone protettedelladdress space e la loro locazione prevedibile
Un attaccante pu sfruttare la conoscenza di unalibreria di sistema per eseguire un attacco senzadover conoscere lindirizzo dello shellcode
Esempio
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
129/167
p
Un attaccante sa che una DLL di sistema di Windowsrichiede al processore di saltare allindirizzo del registroESP che punta ad un buffer
Lattaccante inserisce il codice malevolo nel bufferindirizzato dal registro e sovrascrive il punto di ritornodella funzione corrente con quello dellistruzione notadella DLL
Attacco difficile ma estremamente pericoloso inquantoautomatizzabile
Return-to-libc
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
130/167
Anche questa tecnica sfrutta librerie esternecaricate in fase di esecuzione
libc: librerie C
Un attaccante pu determinare lindirizzo di unafunzione presente nelle librerie C allinterno
delladdress space da colpire e forzare ilprogramma a chiamare questa funzione
Return-to-libc
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
131/167
Attacco: buffer overflow causa la sovrascrittura
dellindirizzo di ritorno con lindirizzo della
funzione C da richiamare (es: exec())
oltre allindirizzo di ritorno lattaccante sovrascrive
il buffer con gli argomenti per la funzione (es:
bin/sh)
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
132/167
Vantaggi
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
133/167
gg
Non viene eseguito alcun codice sullo stack attacco utilizzabile anche in caso di stack non
eseguibile
le librerie C offrono diverse funzioni target exec(),system()
Approfondimento
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
134/167
How To Write A Buffer Overflow http://insecure.org/stf/mudge_buffer_overflo
w_tutorial.html
Peiter C. Zatko, meglio conosciuto comeMudge (Boston, 1970), un hackerstatunitense nel 1995 scopre la vulnerabilit buffer
overflow
nel 2000 sviluppa un software per il crackingdelle password in ambiente Windows (lovedremo pi avanti)
Contromisure per Stack-Based BO
http://insecure.org/stf/mudge_buffer_overflow_tutorial.htmlhttp://insecure.org/stf/mudge_buffer_overflow_tutorial.htmlhttp://insecure.org/stf/mudge_buffer_overflow_tutorial.htmlhttp://insecure.org/stf/mudge_buffer_overflow_tutorial.htmlhttp://insecure.org/stf/mudge_buffer_overflow_tutorial.htmlhttp://insecure.org/stf/mudge_buffer_overflow_tutorial.html7/29/2019 D12 Sicurezza Dei Sistemi Operativi
135/167
Scrivere codice sicuro che verifica sempre le dimensioni dellinputproveniente dallutente
Utilizzare linguaggi di programmazione che non consentono questotipo di attacchi C,C++ sono suscettibili a questi attacchi
Java e C# (e altri) non lo sono inquanto gli oggetti vengono allocatidinamicamente sullo heap
Meccanismi di protezione a livello di OS NX bit
ASLR Stack-Smashing Protection
Canary
Canary
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
136/167
No eXecute Bit
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
137/167
NX (No eXecute) bit: bit che marca come noneseguibile i segmenti di memoria relativi allo
stack e allheap
In questo modo non possibile eseguire
shellcode direttamente sullo stack e sullheap
contromisura non efficace per attacco return-to-lib
Address Space Layout Randomization
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
138/167
ASLR (Address Space Layout Randomization): laddressspace di un processo viene arrangiato randomicamente
supportata dai sistemi Windows a partire da Vista (2007)
supportata anche dai sistemi Linux e Apple
Tecnica suscettibile ad attacchi brute-force: lattaccantepu sfruttare un generatore di numeri pseudo-randome ripetere lattacco pi volte
poco efficace in sistemi a 32 bit (pochi bit disponibili per larandomizzazione)
pi efficace per sistemi a 64 bit
Esempio
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
139/167
Due boot di Vista diversi portano a locazionidelle librerie in memoria diversi
Stack-Smashing Protection
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
140/167
Controllo in fase di esecuzione
Nel momento in cui una routine chiama lindirizzodi ritorno lOS verifica se lo stack sia stato
modificato rispetto al momento in cui la funzione stata chiamata
Se lo stack stato modificato viene lanciato un
errore di tipo segmentation faulte il programmatermina forzatamente
Canary
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
141/167
Controllo in fase di esecuzione
Canary: valore di controllo (spesso random)
inserito dallOS dopo un buffer o primadellindirizzo di ritorno
lOS verifica regolarmente lintegrit di questo valore
In caso di buffer overflow e di sovrascrittura
dellindirizzo di ritorno anche il canarino viene
sovrascritto
Heap-Based Buffer Overflow
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
142/167
I programmi possono allocare memoria dinamica epersistente sullheap possono verificarsi leak memory se questa memoria non
viene liberata in Java e C# esiste il Garbage Collector
Con un heap overflow non possibile alteraredirettamente lesecuzione del programma
Gli heap overflows sono invece sfruttati per manipolarele funzioni che gestiscono la memoria dellheap al finedi eseguire codice arbitrario
Esempio di Codice C
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
143/167
#include
#include #include
int main(int argc, char *argv[ ])
{
// Allocate two adjacent blocks on the heap
char *buf = malloc(256);
char *buf2 = malloc(16);// Does not check length of buffer before copying argument
strcpy(buf, argv[1]);
// Print the argument
printf("Argument: %s\n", buf);
// Free the blocks on the heap
free(buf);
free(buf2);return 1;
}
Esempio 1/2
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
144/167
La funzione malloc(), implementata dalle vecchieversioni del compilatore GNU (gcc), alloca blocchidi memoria sullheap
I blocchi sono mantenuti in una linked list, ogniblocco punta al blocco successivo e al precedente
Quando un blocco marcato come free, la
routine unlink() aggiorna i puntatori dei blocchiad esso adiacenti al fine di rimuoverlo dalla linkedlist
Esempio 2/2
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
145/167
Un attacante pu eseguire un overflow su un blocco
sovrascrivere il blocco successivo modificando i
suoi puntatori e marcandolo come free forzare la routine di unlink a scrivere lindirizzo
dello shellcode in una locazione di memoria che
determiner successivamente un salto verso il
codice malevolo
Format String Attack
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
146/167
printf: famiglia di funzioni C usate per gestireI/O (es: stampa a video di messaggi)
formati stringa (format strings): stringa chedenota come il messaggio dovr esserestampato
// Stampa la variabile messaggio come una stringa
printf(%s,message)
Format String Attack
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
147/167
I formati stringa possono anche scrivere inmemoria, ad esempio il formato %n specifica
che la funzione print dovrebbe scrivere il numero
di byte delloutput fin qui stampato sullindirizzo
di memoria del primo argomento della funzione
Quando non viene definito alcun formato per la
stringa, largomento in input alla funzione
definisce il formato delloutput
Format String Attack
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
148/167
Se questo argomento fornito dallutente allora unattaccante pu scrivere un input che utilizza formatistringa, incluso %n, per leggere e scrivere in zone dimemoria arbitrarie
ad esempio possibile sovrascrivere lindirizzo di ritornodella funzione e avviare un attacco di tipo return-to-libc
pi semplicemente possibile far crashare il programma(attacco DOS)
Contromisura: fornire un formato stringa (es: %s)
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
149/167
Race Conditions
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
150/167
Una race condition una situazione in cui il comportamento delprogramma (involontariamente) dipendente dalla tempistica incui si verificano certi eventi
Un classico esempio fa uso funzioni C access() e open() la funzione open() apre il file specificato utilizzando luserID effettivo
(piuttosto che luserID reale) del processo chiamante per verificarne ipermessi
in altre parole, se un programma setuid di propriet dell'utente root lanciato da un utente normale, il programma pu chiamare consuccesso open() sui file che solo l'utente root ha il permessodi accedere
la funzione access() controlla se l'utente reale (in questocaso l'utente che esegue il programma) ha permesso di accedere al filespecificato
Esempio 1/6
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
151/167
Supponiamo che un semplice programma: richiede il nome di un file come argomento
controlla se l'utente che esegue il programma ha ilpermesso di aprire il file
in caso affermativo legge i primi caratteri del file e li
stampa
C' una race condition in questa implementazione: vi un piccolissimo ritardo tra le chiamate access() e
open()
un utente malintenzionato potrebbe sfruttare questopiccolo ritardo, modificando il file in questione tra le duechiamate
Esempio 2/6
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
152/167
#include
#include #include
#include
#include
int main(int argc, char * argv[ ])
{
int file;
char buf[1024];
memset(buf, 0, 1024);
if(argc < 2) {
printf("Usage: printer [filename]\n");exit-1);
}
if(access(argv[1], R_OK) != 0) {
printf("Cannot access file.\n");
exit(-1);
}
file = open(argv[1], O_RDONLY);
read(file, buf, 1023);
close(file);
printf("%s\n", buf);return 0;
}
Esempio 3/6
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
153/167
Ad esempio, supponiamo che l'attaccante richieda/home/joe/dummy come argomento, un file di testo innocente cheil malintenzionato pu accedere
Dopo che la chiamata access() restituisce 0, indicando che lutentedispone dell'autorizzazione per accedere al file, l'utente
malintenzionato pu sostituire rapidamente /home/joe/dummycon un link simbolico a un file di cui non hal'autorizzazione in lettura, come /etc/passwd
Successivamente, il programma chiamer open() sul link simbolico,che avr successo perch il programma setuid ha come proprietarioroot
Esempio 4/6
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
154/167
Si noti che questo tipo di attacco non potrebbeessere fatto manualmente la differenza di tempo tra due chiamate di funzione
abbastanza piccolo che nessun essere umano sarebbein grado di modificare il file abbastanza velocemente!
E invece possibile avere un programma inesecuzione in background che scambia pi volte idue file, ed esegue il programma vulnerabile
finch lo scambio non siverifica esattamente trale due istruzioni open() e access()
Time of Check/Time of Use Problem
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
155/167
In generale, questo tipo di vulnerabilit conosciutocome Time of Check/Time of Use (TOCTOU) problem
Ogni volta che un programma controlla la validit e lale autorizzazioni per un oggetto, sia esso un file o di
qualche altra propriet, prima di eseguire un'azione sutale oggetto, occorre fare attenzione che queste dueoperazioni siano eseguite atomicamente (dovrebberoessere eseguite come una operazione unica) in caso contrario, l'oggetto pu essere modificato tra il
momento in cui viene controllato e il tempo vieneutilizzato
Esempio 5/6
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
156/167
Per rendere sicuro il codice dellesempio lachiamata di access() dovrebbe esserecompletamente evitata
Il programma dovrebbe invece ritirare i propriprivilegi usando seteuid () prima di chiamareopen()
In questo modo, se l'utente che esegue il programmanon ha il permesso di aprire il file specificato, lachiamata open() fallir
Esempio 6/6
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
157/167
#include
#include #include
#include
#include
int main(int argc, char * argv[ ])
{
int file;
char buf[1024];
uid t uid, euid;
memset(buf, 0, 1024);
if(argc < 2) {printf("Usage: printer [filename]\n");
exit(-1);
}
euid = geteuid();
uid = getuid();
/* Drop privileges */
seteuid(uid);
file = open(argv[1], O RDONLY);
read(file, buf, 1023);
close(file);
/* Restore privileges */
seteuid(euid);
printf("%s\n", buf);
return 0;
}
Memoria Virtuale
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
158/167
Teoricamente ogni address space dovrebbe essereallocato in una regione di memoria continua
il codice macchina deve poter eseguire dei salti del tiposalta in avanti di 10 istruzioni
gli array sono indicizzati come blocchi di memoriaadiacenti tra loro
In realt questo approccio risulta essere inefficiente eimpraticabile
in alcuni casi la memoria totale potrebbe non esserenemmeno sufficiente per ospitare tutti gli address space
Principi di Localit
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
159/167
Durante la loro esecuzione i programmi godonodi due importanti propriet:
Localit temporale: se un elementoxviene
referenziato allistante t, la probabilit chexvenga
referenziato anche allistante t+tcresce al tendere dit0
Localit spaziale: se un elementoxin posizione s
viene referenziato allistante t, la probabilit che
venga referenziato un elementoxin posizione s, con
|s-s| , allistante t+tcresce al tendere di t0
Principi di Localit
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
160/167
I principi di localit suggeriscono unimportante accorgimento nella gestione dellamemoria: non necessario caricare unprogramma interamente in memoria per
poterlo eseguire, sufficiente caricarlo localitper localit
memoria cache: velocizza esecuzione delprogramma
memoria virtuale: ottimizza la gestione dellamemoria
Memoria Virtuale
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
161/167
Meccanismo di mappatura di indirizzi dimemoria virtuali (virtual memory) in indirizzireali
I programmi continuano a vedere un regione di
memoria contigua
Un componente HW chiamato MMU
(Memory Management Unit) si occupa ditradurre gli indirizzi virtuali in indirizzi fisici
Memoria Virtuale
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
162/167
Paging
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
163/167
Attraverso questo meccanismo inoltre possibile mettere adisposizione dei programmi una quantit di memoriasuperiore alla reale capacit fisica del calcolatore infatti possibile sfruttare porzioni di memoria secondaria su
cui memorizzare dati attualmente non utilizzati dai processi (es:processi idle)
unarea della memoria primaria non acceduta per un certoperiodo di tempo pu essere spostata sulla memoria secondaria(paged out)
se un processo richiama un indirizzo di memoria inattivo (pagefault) il sistema provvede a recuperare il blocco di memoria
richiesto dalla memoria secondaria e, possibilmente, asostituirlo con unaltro
Page Fault
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
164/167
Indirizzo non in
memoria:PAGE FAULT
Paging Supervisor:
1 Richiama il blocco di memoria dallamemoria secondaria e lo carica sulla
memoria primaria
2 Aggiorna il mapping degli indirizzi fisici evirtuali
3 tenta di paginare una zona di memorianon utilizzata recentemente
Processo:
richiesta di un
indirizzo dimemoria
Linux e Windows
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
165/167
In Linux solitamente necessario destinareunintera partizione logica del disco fisso per
la memoria virtuale, chiamata swap partition
Windows memorizza i dati relativi alla
memoria virtuale in un file, chiamato page file
(C:\pagefile.sys)
Attacco alla Memoria Virtuale
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
166/167
Un attaccante pu: spengere brutalmente un calcolatore
effettuare il boot di un altro OS (attraverso unmedia esterno)
ricostruire la memoria virtuale accedendo airelativi file
Possibile contromisura: crittografare i datimemorizzati su hard disk
Fonti
7/29/2019 D12 Sicurezza Dei Sistemi Operativi
167/167
Introduction to Computer Security, Michael T.Goodrich and Roberto Tamassia, Addison Wesley,2011
www.cs.brown.edu/courses/csci1660/
www.wikipedia.org
Smashing the Stack for Fun and Profit Aleph
http://www.cs.brown.edu/courses/csci1660/http://www.wikipedia.org/http://www.wikipedia.org/http://www.cs.brown.edu/courses/csci1660/