D12 Sicurezza Dei Sistemi Operativi

  • Upload
    lezan

  • View
    219

  • Download
    0

Embed Size (px)

Citation preview

  • 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/bb896653
  • 7/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.html
  • 7/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/