Scarica Metodi e Strumenti della Sicurezza Informatica e più Appunti in PDF di Sicurezza Dei Sistemi Informativi solo su Docsity!
Introduzione alla Sicurezza Informatica
- Definizione di Sicurezza : La capacità di imporre una politica di sicurezza anche in presenza di avversari.
Componenti della Sicurezza
- Policy : Le regole che definiscono cosa è permesso e cosa non lo è all'interno di un sistema.
- Threat Model (Modello della Minaccia): Insieme di assunzioni riguardanti le capacità dell'avversario. Deve essere realistico per garantire un'efficace protezione.
- Mechanism (Meccanismo): Software o hardware che garantisce l'applicazione delle policy se il modello della minaccia è corretto.
Obiettivi delle Politiche di Sicurezza
- Confidenzialità : Proteggere l'accesso ai dati, limitandolo solo alle entità autorizzate (es. stato del conto corrente visibile solo al titolare).
- Integrità : Assicurare che solo le entità autorizzate possano modificare i dati (es. solo il titolare può autorizzare prelievi dal proprio conto).
- Disponibilità : Garantire che i sistemi siano sempre accessibili e funzionanti (es. un utente deve poter accedere al proprio conto in qualsiasi momento).
- Autenticità : Verifica corretta dell'identità di un'entità (es. accesso tramite login verificato).
- Accountability (Responsabilità): Tracciabilità delle azioni eseguite da un'entità (es. firme digitali, log delle attività).
Modello della Minaccia
- Assunzioni : Definire ciò che l'avversario può e non può fare, come non conoscere le password o non avere accesso fisico ai dispositivi. Tipologie di Utenti Malintenzionati :
- Network User : Utente anonimo connesso alla rete, capace di manipolare e misurare il traffico di rete.
- Snooping User : Utente che intercetta comunicazioni su una rete condivisa, come una rete Wi-Fi non protetta.
- Co-located User : Utente con accesso fisico o software al dispositivo, capace di leggere e scrivere su file e memoria del sistema.
Meccanismi di Sicurezza
- Autenticazione : Verifica dell'identità di un utente attraverso vari metodi (password, biometria, ecc.).
- Autorizzazione : Definisce quando e come un utente può eseguire determinate azioni su un sistema.
- Audit : Registrazione e analisi delle attività del sistema per rilevare violazioni o comportamenti anomali.
Perché i Sistemi sono spesso Compromessi?
- Mercato delle vulnerabilità : Esistono programmi di bug bounty e un mercato nero per la compravendita di vulnerabilità e macchine compromesse.
- Motivazioni : La maggior parte delle violazioni è motivata da scopi criminali, ma esistono anche ricercatori di sicurezza, hacktivisti, ecc.
Tipologie di Attacchi
- Eavesdropping : Intercettazione non autorizzata di comunicazioni, violando la confidenzialità.
- Modifica : L'attaccante modifica malevolmente le informazioni, compromettendo l'integrità.
- Interruzione : L'attaccante interrompe il flusso di informazioni, violando la disponibilità (es. attacchi DoS).
- Falsificazione : Creazione di informazioni false, violando autenticità e accountability.
Cosa può Andare Storto?
- Politiche : Problemi derivanti da politiche di sicurezza mal concepite o implementate (es. domande di recupero facilmente intuibili).
- Modelli di Minaccia : Errori nel definire le capacità dell'avversario, come sottovalutare attacchi fisici o malware.
- Meccanismi : Vulnerabilità derivanti da implementazioni difettose, come bug nei sistemi di autenticazione o falle come il buffer overflow.
Conclusioni
La sicurezza informatica è complessa e richiede un approccio sistematico che combini una corretta modellazione delle minacce, politiche solide e meccanismi affidabili.
- Taglio di connessioni di rete : L'attaccante potrebbe interrompere una connessione di rete cruciale, rendendo inaccessibili i servizi online. Modalità di attacco :
- Inondazione di traffico : Generare un volume massiccio di traffico di rete per saturare la banda disponibile.
- Disconnessione forzata : Interrompere le connessioni di rete o causare malfunzionamenti nei dispositivi di rete.
- Forging (Falsificazione) L'attaccante crea informazioni false o modifica le informazioni esistenti per farle sembrare legittime, compromettendo sia l'autenticità che l'accountability. Esempi :
- Falsificazione di firme digitali : Creare una firma digitale falsa utilizzando una vulnerabilità crittografica come collisioni in MD5, facendo sembrare che un documento provenga da una fonte legittima.
- Creazione di identità false : Un attaccante potrebbe creare credenziali false per accedere a un sistema, simulando l'identità di un utente legittimo. Modalità di attacco :
- Collisioni crittografiche : Sfruttare debolezze negli algoritmi di hashing per creare due diversi input che producono lo stesso hash, consentendo la falsificazione di firme.
- Phishing : Inviare e-mail o messaggi fraudolenti che sembrano provenire da fonti affidabili per ingannare le vittime e farle rivelare informazioni sensibili.
Sintesi delle Vulnerabilità e dei Rischi Associati agli Attacchi
- Confidenzialità : Violata attraverso attacchi come l'eavesdropping, dove l'attaccante ottiene informazioni riservate.
- Integrità : Compromessa da attacchi di modifica, dove i dati vengono alterati senza autorizzazione.
- Disponibilità : Minacciata dagli attacchi di interruzione, come i DoS, che rendono i servizi inaccessibili agli utenti legittimi.
- Autenticità e Accountability : Falsificate da attacchi come la forgery, dove l'attaccante crea o altera dati per sembrare legittimo.
Come Prevenire e Mitigare Questi Attacchi
- Crittografia : Proteggere i dati in transito e a riposo con forti algoritmi crittografici per prevenire l'eavesdropping e la modifica.
- Autenticazione Multi-Fattore (MFA) : Rafforzare il processo di autenticazione per ridurre il rischio di accesso non autorizzato e falsificazione.
- Monitoraggio e Logging : Implementare sistemi di monitoraggio e registrazione delle attività per rilevare e rispondere rapidamente agli attacchi.
- Firewall e IDS/IPS : Utilizzare firewall e sistemi di rilevamento/prevenzione delle intrusioni per proteggere le reti da attacchi DoS e altre minacce.
Buffer Overflow
Un buffer overflow si verifica quando un programma scrive più dati in un buffer (un'area di memoria predefinita per contenere dati) di quanti il buffer possa effettivamente contenere. Questo causa la sovrascrittura di aree di memoria adiacenti, che possono includere variabili importanti, indirizzi di ritorno della funzione, o persino il codice eseguibile stesso. Un attacco buffer overflow sfrutta questo comportamento per sovrascrivere indirizzi di ritorno e fare in modo che, una volta terminata la funzione, il controllo del programma venga "dirottato" verso codice malevolo iniettato dall'attaccante. Dettagli tecnici
- Un buffer è un'area di memoria riservata per contenere dati temporanei. Ad esempio, un array in C può fungere da buffer.
- Se il programma non verifica la dimensione dei dati che vengono scritti in questo buffer, può accettare più dati di quelli che il buffer può gestire, causando la sovrascrittura di altre aree di memoria.
- Gli attacchi di buffer overflow sono spesso sfruttati per eseguire codice arbitrario sull'applicazione vittima, tipicamente iniettato dall'attaccante. Esempio di Codice Vulnerabile void func(char *str) { char buf[128]; strcpy(buf, str); } In questo esempio, la funzione
func copia il contenuto della stringa str in un buffer di 128 byte (buf). Se str è più lungo di 128 byte, l'eccesso di dati verrà scritto oltre i limiti del buffer, sovrascrivendo altre aree di memoria come l'indirizzo di ritorno. Cosa Succede Durante l'Overflow Quando viene chiamata la funzione func, la struttura dello stack potrebbe essere simile a questa: - Indirizzo di ritorno
- Puntatore al frame dello stack
- Buffer
buf[128]
protocolli di comunicazione con pieno controllo delle proprie macchine. Questo modello è essenziale per comprendere come gli attacchi possano essere condotti e quali difese siano necessarie per mitigarli.
Problemi a Livello di Protocollo
- Difetti di progettazione (Design Flaws): Anche un protocollo implementato correttamente può contenere difetti di progettazione che lo rendono vulnerabile agli attacchi. Questi difetti possono derivare da una mancata considerazione della sicurezza durante la fase di progettazione. Se il protocollo non è progettato bene, le modifiche necessarie per correggerlo potrebbero richiedere l'adozione di nuove versioni incompatibili con i sistemi esistenti.
Attacchi di Predizione delle Sequenze
- Numeri di Sequenza a 32 bit: Utilizzati per garantire che i pacchetti vengano ricevuti nell'ordine corretto. Un attaccante che riesce a predire questi numeri può iniettare pacchetti malevoli in una connessione esistente. Esempio: Un attaccante può predire il numero di sequenza corrente in una connessione TCP (predizione SN basata sul tempo) tra un client e un server, inviare pacchetti di dati fasulli al server, e far credere al server che provengano dal client legittimo.
- Attacco Reset (Reset Attack): Sfrutta l'asimmetria delle risorse tra client e server. Un attaccante invia un pacchetto RST con un numero di sequenza predetto, causando la chiusura della connessione tra client e server, interrompendo il servizio legittimo. Esempio: Un attaccante può interrompere una connessione SSH tra un amministratore e un server inviando pacchetti RST con numeri di sequenza predetti, costringendo il server a chiudere la connessione.
Attacchi DNS
- DNS e UDP : Il DNS utilizza il protocollo UDP per trasmettere richieste e risposte, rendendolo vulnerabile a attacchi di spoofing. In un attacco di DNS spoofing, l'attaccante invia una risposta falsificata a una richiesta DNS prima che il server legittimo possa rispondere, reindirizzando il traffico a un server malevolo. Esempio: Un utente digita "www.banca.it" nel browser, ma a causa di un attacco DNS spoofing, viene reindirizzato a un sito di phishing che sembra identico al sito della banca, inducendolo a inserire le proprie credenziali.
- DNSSEC : DNSSEC introduce firme digitali per garantire l'autenticità delle risposte DNS. Tuttavia, la sua implementazione è complessa e richiede la gestione della distribuzione delle chiavi crittografiche e costi elevati. Esempio: DNSSEC garantisce che quando un utente risolve un dominio come "www.banca.it", la risposta provenga dal server DNS autentico, impedendo che un attaccante possa fornire risposte fasulle.
Attacchi SYN Flooding
Un attacco SYN Flooding sfrutta il meccanismo di handshake a tre vie di TCP, in cui il server mantiene lo stato delle connessioni parzialmente aperte in attesa del terzo pacchetto (ACK) dal client. Un
attaccante può inviare un numero elevato di pacchetti SYN senza mai completare l'handshake, saturando le risorse del server e impedendo nuove connessioni legittime. Esempio: Un attaccante invia migliaia di richieste di connessione SYN a un server web senza inviare l'ACK finale. Il server tenta di mantenere aperte tutte le connessioni parziali, esaurendo le risorse disponibili e impedendo agli utenti legittimi di accedere al sito web.
- Difesa: Utilizzare meccanismi come i SYN cookies, che permettono al server di non mantenere lo stato della connessione fino alla ricezione dell'ACK. Questo metodo rende più difficile per un attaccante saturare le risorse del server.
Attacchi di Amplificazione della Larghezza di Banda
In un attacco di amplificazione, l'attaccante invia una richiesta a un server utilizzando un indirizzo IP di origine falsificato (spoofed), che corrisponde all'indirizzo della vittima. Il server risponde con un pacchetto molto più grande rispetto alla richiesta originale, amplificando il volume del traffico diretto alla vittima e causando un DoS. Esempio: Un attaccante invia una richiesta DNS a un server utilizzando l'indirizzo IP della vittima come origine. Il server DNS risponde con un pacchetto molto più grande (ad esempio, 60 volte più grande della richiesta), che inonda la rete della vittima con traffico e la rende inaccessibile.
- Amplificazione DNS : Utilizzando query DNS, un attaccante può ottenere una risposta molto più grande rispetto alla richiesta originale, specialmente se si utilizzano estensioni come DNSSEC. Questo può inondare la vittima con traffico, rendendo il sistema inaccessibile.
Attacchi DHCP
DHCP sta per Dynamic Host Configuration Protocol. È un protocollo di rete utilizzato per assegnare automaticamente indirizzi IP e altre informazioni di configurazione di rete ai dispositivi su una rete, come router, server, computer, smartphone, ecc. DHCP assegna dinamicamente indirizzi IP e altre configurazioni di rete. Un attaccante può impersonare un server DHCP e rispondere alle richieste DHCP, fornendo indirizzi IP e configurazioni di rete malevoli, come server DNS che indirizzano il traffico verso siti controllati dall'attaccante. Esempio: Un attaccante collega un laptop alla rete di un ufficio e configura un server DHCP malevolo. Quando un dispositivo nuovo si connette alla rete, riceve un indirizzo IP e una configurazione DNS che reindirizzano tutto il traffico attraverso un server controllato dall'attaccante.
- Difesa: Gli switch di rete possono essere configurati per inoltrare le richieste DHCP solo a server legittimi, riducendo la probabilità che un attaccante possa impersonare un server DHCP. Tuttavia, questa configurazione è complessa e non sempre implementata.
ARP Spoofing
ARP sta per Address Resolution Protocol. È un protocollo di rete utilizzato per mappare (associare) un indirizzo IP a un indirizzo MAC (Media Access Control) su una rete locale, come una LAN (Local Area Network). ARP associa gli indirizzi IP agli indirizzi MAC su una rete locale. Poiché ARP non ha meccanismi di autenticazione, un attaccante può inviare risposte ARP falsificate, dichiarando di possedere un certo indirizzo IP e intercettando, modificando o bloccando il traffico di rete destinato a quell'IP.
VPN (Virtual Private Networks)
- Descrizione: Le VPN sono utilizzate per creare connessioni sicure attraverso reti non sicure come Internet. Utilizzano crittografia e autenticazione per proteggere la confidenzialità e l'integrità dei dati trasmessi. Esempio: Un'azienda può utilizzare una VPN per permettere ai dipendenti di accedere in modo sicuro alla rete aziendale quando lavorano da casa. La VPN cripta tutto il traffico tra il dispositivo del dipendente e la rete aziendale, proteggendo i dati da intercettazioni su reti pubbliche come il Wi-Fi di un caffè.
- Limitazioni: Sebbene le VPN proteggano il traffico dai punti di origine e destinazione, non proteggono contro le minacce interne alla rete aziendale una volta che il traffico è decriptato. Inoltre, l'uso della crittografia può introdurre overhead e rallentare le prestazioni della rete.
Intrusion Prevention Systems (IPS)
- Host-based (HIPS): Monitorano un singolo host e possono essere personalizzati per la piattaforma specifica. Possono sandboxare le applicazioni per monitorarne il comportamento e prevenire azioni malevole. Esempio: Un HIPS può rilevare un comportamento anomalo di un processo su un server e bloccarlo prima che possa eseguire azioni dannose, come la modifica non autorizzata di file di sistema.
- Signature-based: Rilevano modelli di attacco noti confrontando il traffico con un database di firme, efficace contro minacce conosciute ma vulnerabile a tecniche di evasione.
- Anomaly-based: Rilevano comportamenti anomali rispetto a un modello di utilizzo normale, efficace contro nuove minacce ma con limitata capacità di diagnosi e necessità di addestramento accurato.
Intrusion Prevention Systems (IPS) Signature-based
Gli Intrusion Prevention Systems (IPS) Signature-based sono una categoria di sistemi di sicurezza che rilevano e prevengono attacchi informatici analizzando il traffico di rete o il comportamento dei sistemi in base a modelli predefiniti, chiamati "signature" (firme). Queste firme sono essenzialmente modelli o sequenze di dati che corrispondono a comportamenti noti di attacchi. Funzionamento degli IPS Signature-based
1. Database di Firme: Gli IPS Signature-based utilizzano un database di firme che contiene le caratteristiche di attacchi noti. Questi possono includere modelli di byte specifici, sequenze di comando, o altri comportamenti che sono stati precedentemente identificati come parte di un attacco. 2. Analisi del Traffico: L'IPS monitora il traffico di rete in tempo reale, confrontando i dati che attraversano il sistema con le firme nel database. Ogni pacchetto di dati o sequenza di comandi viene analizzato per verificare se corrisponde a una firma nota. 3. Rilevamento e Prevenzione: Se l'IPS trova una corrispondenza tra il traffico di rete e una firma nel suo database, il sistema identifica questa attività come un potenziale attacco. A seconda delle impostazioni del sistema, l'IPS può:
o Bloccare il traffico: L'IPS può immediatamente interrompere il flusso di dati sospetti per prevenire che l'attacco raggiunga la sua destinazione. o Generare un avviso: L'IPS può inviare una notifica agli amministratori di rete o registrare l'attività per ulteriori indagini. o Modificare il traffico: In alcuni casi, l'IPS può alterare il traffico per neutralizzare l'attacco senza interrompere la connessione. Vantaggi degli IPS Signature-based
- Alta Precisione: Poiché le firme sono specifiche per attacchi noti, gli IPS Signature-based possono identificare con precisione le minacce, riducendo il numero di falsi positivi.
- Risposta Rapida: Gli IPS Signature-based sono in grado di rilevare e bloccare gli attacchi immediatamente, proteggendo i sistemi prima che il danno possa essere causato.
- Facile Aggiornamento: Le firme possono essere aggiornate regolarmente per includere nuovi attacchi man mano che vengono scoperti, mantenendo il sistema protetto dalle minacce più recenti. Limitazioni degli IPS Signature-based
- Dipendenza dalle Firme: Gli IPS Signature-based possono rilevare solo attacchi che sono già stati identificati e per i quali esiste una firma nel database. Attacchi nuovi o varianti sconosciute potrebbero non essere rilevati.
- Evasione: Gli attaccanti possono modificare leggermente le caratteristiche dei loro attacchi per evitare il rilevamento (ad esempio, cifrando il payload o alterando la sequenza di attacco), rendendo inefficaci le firme preesistenti.
- Falsi Negativi: Poiché il sistema si basa esclusivamente su firme conosciute, c'è un rischio significativo di falsi negativi, dove un attacco non viene rilevato perché non corrisponde esattamente a una firma esistente.
Esempio pratico di IPS Signature-based: Snort
Snort è uno dei più conosciuti strumenti di rilevamento delle intrusioni open-source, utilizzato sia come IDS (Intrusion Detection System) che come IPS. Snort utilizza un set di regole che descrivono pattern di attacco conosciuti, che agiscono come firme. Quando Snort rileva un traffico di rete che corrisponde a una delle sue regole, può bloccare il traffico e inviare un avviso agli amministratori di sistema. Esempio di Regola Snort: alert tcp any any - > 192.168.1.0/24 80 (msg:"HTTP GET Request"; flow:to_server,established; content:"GET"; http_method; sid:1000001; rev:1;) Questa regola fa in modo che Snort generi un avviso ogni volta che rileva una richiesta HTTP GET verso la sottorete 192.168.1.0/24 sulla porta 80. Strategie di Implementazione
- Signature aggiornate: È essenziale che il database di firme sia costantemente aggiornato per garantire la protezione contro le minacce più recenti.
alte prestazioni, sono scritti in C/C++, il che li rende potenziali bersagli per gli attacchi di buffer overflow.
- Casi famosi : o Morris Worm (1988) : Uno dei primi worm di rete, che sfruttava un buffer overflow per propagarsi tra le macchine. Ha causato danni stimati tra 10 e 100 milioni di dollari. o CodeRed (2001) : Ha sfruttato un overflow nel server MS-IIS, infettando 300. macchine in 14 ore. o SQL Slammer (2003) : Ha sfruttato un overflow nel server MS-SQL, infettando 75. macchine in 10 minuti.
- Corruzione dei Dati : Gli attacchi di buffer overflow non si limitano a manipolare gli indirizzi di ritorno; possono anche corrompere dati sensibili come chiavi crittografiche o variabili di stato, bypassando i controlli di autorizzazione. o Heartbleed : Un esempio di vulnerabilità di "read overflow" è Heartbleed, dove un bug in OpenSSL permetteva di leggere dati oltre il buffer previsto, esponendo informazioni sensibili come password e chiavi crittografiche.
- Memoria Stantia (Dangling Pointer) : Si verifica quando un puntatore continua a essere utilizzato dopo che la memoria a cui punta è stata liberata. Un attaccante può reindirizzare questo puntatore a una memoria controllata da lui, permettendo l'accesso e la manipolazione di dati sensibili.
Mitigazione degli Attacchi di Buffer Overflow
- Evitare i bug nel codice : o Pro : Evita i problemi alla radice. o Contro : È difficile garantire l'assenza di bug, specialmente in codici di grandi dimensioni.
- Costruire strumenti per trovare bug : o Esempio : L'analisi del programma può individuare problemi come variabili non inizializzate. o Fuzzing : Testare il codice con un grande numero di input casuali per scoprire vulnerabilità. Tuttavia, è difficile provare l'assenza totale di bug.
- Utilizzare linguaggi memory-safe : o Esempi : Java, C#, Python. Tuttavia, molti sistemi legacy non sono scritti in questi linguaggi, e le prestazioni possono essere un problema.
Tecniche di Mitigazione Specifiche
Stack Canaries
Un canarino (valore casuale) viene inserito nello stack tra il buffer e l'indirizzo di ritorno. Prima di eseguire un ritorno dalla funzione, il canarino viene verificato. Se è stato alterato, il programma viene terminato immediatamente, impedendo l'esecuzione del codice malevolo. Esempio : StackGuard e GCC con Stack Smashing Protector (SSP) utilizzano questa tecnica. Limitazioni : Non protegge contro tutti i tipi di overflow, come quelli che sovrascrivono puntatori utilizzati prima del ritorno, né contro l'accesso non autorizzato alla memoria che avviene senza sovrascrivere il canarino.
Bounds Checking
Obiettivo : Prevenire l'uso improprio dei puntatori controllando se si trovano entro i limiti validi. Questa tecnica verifica che i puntatori non eccedano i limiti stabiliti per evitare sovrascritture indesiderate. Tecniche :
- Electric Fences : Allineano ogni oggetto di heap con una "guard page". Se il buffer viene sovrascritto, il programma crasha immediatamente, segnalando un tentativo di overflow. Electric Fences è una tecnica di sicurezza utilizzata per rilevare buffer overflow, in particolare quelli che si verificano nell'heap, la parte della memoria utilizzata per l'allocazione dinamica. Questa tecnica funziona introducendo una "guard page" (pagina di protezione) non accessibile accanto ad ogni allocazione di memoria dinamica. Come Funziona Electric Fences 1. Allocazione della Memoria : Quando un programma richiede la memoria dinamica, ad esempio tramite la funzione malloc() in C, Electric Fences assegna non solo la quantità di memoria richiesta, ma anche una pagina di protezione aggiuntiva immediatamente adiacente alla memoria allocata. Questa pagina è marcata come non accessibile. 2. Guard Page : La "guard page" è una sezione della memoria che non può essere letta o scritta dal programma. Se il programma tenta di accedere a questa pagina, ad esempio a causa di un buffer overflow che scrive oltre i limiti della memoria allocata, il sistema operativo genera una violazione di accesso (segfault) e termina il programma. Questo comportamento segnala immediatamente un tentativo di overflow, facilitando l'individuazione del problema. 3. Determinazione del Problema : Quando il programma crasha a causa della violazione della guard page, diventa evidente che c'è un problema di gestione della memoria, in particolare un buffer overflow. Questo crash avviene immediatamente, permettendo agli sviluppatori di diagnosticare e correggere il bug prima che possa essere sfruttato. Vantaggi : ▪ Rilevamento Immediato : Electric Fences rileva buffer overflow al momento in cui si verificano, permettendo di identificare e risolvere rapidamente i problemi. ▪ Semplicità : Non richiede modifiche significative al codice sorgente, poiché viene applicato durante il runtime. Limitazioni :
▪ Overhead di Memoria : I fat pointers richiedono più spazio in memoria rispetto ai puntatori tradizionali. Un puntatore tradizionale potrebbe occupare 32 o 64 bit, mentre un fat pointer può richiedere tre volte tanto (ad esempio, 96 o 192 bit), includendo i limiti e l'indirizzo base. ▪ Overhead Computazionale : Ogni operazione che coinvolge un fat pointer, come l'incremento o la dereferenziazione, richiede controlli aggiuntivi, che possono introdurre un overhead computazionale e ridurre le prestazioni. ▪ Compatibilità del Codice : L'introduzione dei fat pointers richiede modifiche significative al codice esistente, inclusa la necessità di supporto da parte del compilatore e del runtime. La maggior parte del software esistente non è progettato per gestire puntatori così complessi.
- Shadow Data Structures : Memorizzano informazioni sui limiti per ogni puntatore e intercettano le operazioni aritmetiche e di dereferenziazione per verificare che i puntatori non eccedano i limiti. Questo approccio può essere più efficiente rispetto ai fat pointers, ma introduce comunque un overhead significativo. o Ogni puntatore o ogni regione di memoria ha associata una "struttura ombra" che contiene informazioni aggiuntive necessarie per verificare gli accessi alla memoria. Questa struttura ombra può memorizzare i limiti del buffer, l'indirizzo di partenza, i permessi di accesso, e altre proprietà di sicurezza. o Le strutture ombra non sono direttamente accessibili dal codice applicativo, ma sono gestite dal runtime o dal compilatore per assicurare che ogni accesso alla memoria sia sicuro. Associazione con i Puntatori : o Quando un puntatore viene creato o quando la memoria viene allocata, il sistema crea anche una corrispondente struttura ombra. Questa struttura ombra viene memorizzata in una tabella che il sistema può consultare ogni volta che il puntatore viene utilizzato. o La tabella delle strutture ombra viene utilizzata per mappare ogni puntatore ai suoi metadati associati. Verifica degli Accessi : o Ogni volta che un puntatore viene dereferenziato, il sistema controlla la struttura ombra associata per verificare che l'accesso alla memoria sia sicuro. Questo include controlli come: - Verifica che l'indirizzo sia compreso tra il base address e il bound. - Verifica dei permessi (ad esempio, se il puntatore ha i permessi per scrivere o eseguire codice nella regione di memoria associata). o Se un accesso non è valido (ad esempio, se esce dai limiti o viola i permessi), il sistema genera un'eccezione o termina il programma, prevenendo comportamenti imprevisti o pericolosi. Vantaggi : o Sicurezza Maggiore : Le shadow data structures offrono un elevato livello di sicurezza, poiché ogni accesso alla memoria viene verificato rispetto ai metadati associati. Questo rende molto più difficile per gli attaccanti sfruttare vulnerabilità legate alla memoria.
o Flessibilità : Le strutture ombra possono contenere vari tipi di metadati (limiti, permessi, ecc.), offrendo un controllo molto dettagliato su come la memoria può essere utilizzata. Limitazioni : o Overhead di Memoria : Le shadow data structures richiedono memoria aggiuntiva per memorizzare le informazioni di controllo. Questo può aumentare significativamente l'uso di memoria, soprattutto in applicazioni che utilizzano molti puntatori o allocano dinamicamente grandi quantità di memoria. o Overhead Computazionale : La necessità di consultare e gestire le strutture ombra introduce un overhead computazionale. Ogni accesso alla memoria richiede un controllo aggiuntivo, che può rallentare l'esecuzione del programma. o Compatibilità del Codice : L'introduzione delle shadow data structures può richiedere modifiche significative al codice esistente e al runtime, rendendole difficili da integrare in sistemi legacy.
- Baggy Bounds : Descrizione : Invece di allineare gli oggetti di heap a una pagina, li arrotonda a una potenza di 2 e utilizza un sistema di slot per allocare memoria in modo più efficiente, minimizzando lo spreco di spazio. Ogni allocazione ha una dimensione che è una potenza di 2, riducendo così il numero di verifiche necessarie per assicurare che l'accesso sia sicuro. Esempio : Se un programma richiede 20 byte, Baggy Bounds assegna 32 byte e utilizza i restanti per gestire il controllo dei limiti, riducendo la granularità del controllo rispetto a metodi più tradizionali.
Non-Executable Memory (NX Bit):
Protegge la memoria marcandola come non eseguibile, impedendo l'esecuzione del codice iniettato tramite buffer overflow. Questa tecnica è particolarmente efficace contro gli exploit basati su codice iniettato. Esempi : Windows utilizza la Data Execution Prevention (DEP), mentre AMD ha introdotto la tecnologia No Execution Bit (NX). Queste tecnologie impediscono l'esecuzione di codice da regioni di memoria che dovrebbero contenere solo dati. Limitazioni : Difficoltà nell'esecuzione dinamica di codice, come nei compilatori Just-In-Time (JIT), che devono eseguire codice generato dinamicamente, a meno che non venga attentamente gestito.
Randomizzazione degli Indirizzi di Memoria (ASLR: Address Space Layout
Randomization):
Randomizza l'intero spazio degli indirizzi, rendendo difficile per gli attaccanti indovinare l'ubicazione del codice o dei dati. Con ASLR, le posizioni delle stack, heap e delle librerie sono randomizzate ogni volta che un programma viene eseguito. Esempio : Linux e Windows implementano ASLR per mitigare gli attacchi basati su buffer overflow. Questa tecnica rende meno prevedibile per un attaccante l'esatta ubicazione in memoria del codice o delle variabili critiche.
Control Flow Integrity (CFI)
Control Flow Integrity (CFI) è una tecnica di sicurezza progettata per prevenire attacchi come il ROP garantendo che un programma segua solo percorsi di esecuzione legittimi, definiti in fase di compilazione. Tecniche :
- Control Flow Graph (CFG) : Il programma viene monitorato per assicurarsi che segua solo i percorsi di esecuzione consentiti dal CFG.
- In-Line Reference Monitor (IRM) : Etichetta le destinazioni di salti indiretti e verifica che ogni salto segua una destinazione legale.
- Grafo del Flusso di Controllo (CFG) : Il programma viene analizzato per creare un grafo che rappresenta tutti i possibili percorsi di esecuzione legittimi, chiamato Grafo del Flusso di Controllo (CFG). Questo grafo mostra quali funzioni possono invocare altre funzioni e quali salti sono legittimi.
- Monitoraggio del Flusso di Controllo : Durante l'esecuzione del programma, ogni salto o ritorno da una funzione viene confrontato con il CFG per assicurarsi che il flusso di controllo sia conforme alle regole stabilite. Se il programma tenta di eseguire un salto o un ritorno che non è previsto dal CFG, l'esecuzione viene interrotta.
- Salti Diretti e Indiretti : I salti diretti, come quelli da una funzione che chiama un'altra funzione specifica (ad esempio sort2 che chiama sort), sono facili da controllare. I salti indiretti, che possono dipendere da variabili o input esterni (come i salti a let e gt), sono più complessi da monitorare. CFI si concentra sui salti indiretti, inserendo etichette per assicurarsi che ogni salto avvenga solo verso destinazioni legittime.
- Inserzione di Etichette : Inserendo etichette su tutte le destinazioni di salti indiretti, CFI verifica che ogni salto punti solo a un'etichetta valida, prevenendo i salti arbitrari che potrebbero essere sfruttati da un attaccante.
TOCTOU (Time of Check to Time of Use) Attacks
TOCTOU (Time Of Check to Time Of Use) è una classe di vulnerabilità in cui un attaccante sfrutta una discrepanza temporale tra il momento in cui una condizione viene verificata (check) e il momento in cui l'operazione basata su quella condizione viene eseguita (use). Esempio di Attacco TOCTOU Supponiamo di avere un sistema che verifica i permessi di accesso a un file:
- Time of Check : Il programma verifica se l'utente ha i permessi necessari per accedere a un file specifico (ad esempio, per modificarlo o cancellarlo). Questo check potrebbe consistere nel controllare le autorizzazioni del file nel file system.
- Time of Use : Dopo il controllo dei permessi, il programma procede a eseguire l'operazione richiesta (ad esempio, apertura, modifica o cancellazione del file).
- Attacco : Tra il momento del controllo (check) e l'esecuzione (use), l'attaccante modifica il file o l'oggetto controllato, in modo che quando l'operazione viene eseguita, si riferisca a un file
diverso. Per esempio, l'attaccante potrebbe cambiare il file controllato con un link simbolico a un altro file a cui normalmente non avrebbe accesso.
- Esempio : Immagina che un programma verifichi che l'utente può cancellare un file specifico, /tmp/file1, e subito dopo esegue l'operazione di cancellazione. Se l'attaccante, nel breve lasso di tempo tra il controllo e l'uso, riesce a sostituire /tmp/file1 con un link simbolico a /etc/passwd, potrebbe far sì che il programma cancelli il file /etc/passwd invece di /tmp/file1, un'operazione che normalmente non sarebbe permessa. Conclusione
- ROP : Gli attacchi basati su ROP sfruttano piccoli frammenti di codice esistenti per eseguire operazioni malevoli, aggirando protezioni come NX. La randomizzazione dello stack e ASLR sono tecniche utilizzate per mitigare tali attacchi, mentre BROP rappresenta una minaccia avanzata capace di superare queste difese.
- CFI : La Control Flow Integrity protegge contro attacchi al flusso di controllo, assicurando che il programma esegua solo percorsi legittimi, prevenendo l'esecuzione di codice non previsto.
- TOCTOU : Gli attacchi TOCTOU sfruttano la finestra temporale tra il controllo e l'esecuzione di un'operazione, permettendo all'attaccante di manipolare il contesto e ottenere accessi non autorizzati. Esempi pratici come la modifica di file tra il controllo e l'uso illustrano l'importanza di gestire correttamente queste vulnerabilità.
Address leak in Flash's 'Dictionary' (hash table)
Si riferisce a una specifica vulnerabilità di sicurezza in Adobe Flash, dove un attaccante può ottenere l'indirizzo di memoria di oggetti critici attraverso un exploit che coinvolge la gestione delle tabelle hash (in Flash, chiamate "Dictionary"). In Adobe Flash, un Dictionary è una struttura dati simile a una tabella hash, utilizzata per mappare chiavi a valori. Questa struttura permette di cercare rapidamente valori associati a chiavi specifiche, migliorando l'efficienza di accesso ai dati. Un address leak è una vulnerabilità che consente a un attaccante di ottenere l'indirizzo di memoria di un oggetto o di una variabile in un programma. La vulnerabilità in Flash riguardava la gestione delle tabelle hash (Dictionary). Ecco come un attaccante poteva sfruttare questa vulnerabilità:
- Manipolazione della Hash Table : Un attaccante può manipolare la tabella hash per forzare il programma a esporre gli indirizzi di memoria. In una situazione normale, la tabella hash dovrebbe mappare chiavi a valori senza rivelare nulla sugli indirizzi di memoria in cui sono memorizzati.
- Exploit della Gestione della Memoria : A causa di bug nella gestione della memoria di Flash, un attaccante può creare condizioni in cui il programma restituisce o stampa indirizzi di memoria anziché i valori attesi. Questo può avvenire, ad esempio, quando la tabella hash è corrotta o quando vengono utilizzate chiavi o valori speciali che causano un comportamento anomalo.
- Ottenimento degli Indirizzi di Memoria : Quando l'attaccante ottiene l'indirizzo di memoria di un oggetto, può utilizzarlo per ulteriori attacchi. Per esempio, con l'indirizzo di un buffer, un attaccante può iniettare codice malevolo in quel buffer o manipolare i dati contenuti in esso.