La protezione dai memory error exploit



Documenti analoghi
Stack-based buffer overflow

Buffer Overflow Attacchi ai servizi di rete

Corso di Sicurezza Informatica. Sicurezza del software. Ing. Gianluca Caminiti

Corso di Sicurezza Informatica

Reverse engineering: disassembly

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

MIPS Instruction Set 2

costruttori e distruttori

Allocazione dinamica della memoria - riepilogo

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

Funzioni. Il modello console. Interfaccia in modalità console

Esercizio sulla gestione di file in Unix

maurizio pizzonia sicurezza dei sistemi informatici e delle reti. esercizi su vulnerabilità del software e delle reti

Dott. Ing. Davide Maiorca

Lab. di Sistemi Operativi - Esercitazione n 9- -Thread-

Un modello integrato control-flow e data-flow per il rilevamento automatico di intrusioni

Introduzione a GCC: GNU Compiler Collection

Fondamenti di Informatica 2

Funzioni in C. Violetta Lonati

Reverse engineering: disassembly

Processi e thread. Dipartimento di Informatica Università di Verona, Italy. Sommario

LABORATORIO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO V Indice

Sicurezza dei Sistemi Informatici Esercitazioni OpenSSL

Terza Esercitazione. Unix - Esercizio 1. Unix System Call Exec Java Introduzione Thread

L ambiente di simulazione SPIM

Esercizio: gestione di un conto corrente

Linguaggio C - Stringhe

Introduzione al linguaggio C Gli array

Dynamic Linking. Introduzione Creazione di una libreria dinamica Uso di una libreria dinamica

Format String Vulnerability

AXO. Operativo. Architetture dei Calcolatori e Sistema. programmazione di sistema

VARIABILI LOCALI E GLOBALI (ESTERNE)

Uso avanzato dei puntatori Allocazione dinamica della memoria

La gestione della memoria

Fondamenti di Informatica e Laboratorio T-AB T-16 Progetti su più file. Funzioni come parametro. Parametri del main

Puntatori. Un puntatore contiene un numero che indica la locazione di memoria dove è presente la variabile puntata

Chiamate di sistema per la Gestione dei processi in POSIX. E.Mumolo, DEEI

DevC++ vers Manuale d uso

Thread: sincronizzazione Esercitazioni del 09 Ottobre 2009

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 18 31/03/2014

ESAME SCRITTO DI ELEMENTI DI INFORMATICA E PROGRAMMAZIONE. 9 Settembre 2015

Cognome: Nome: Matricola: Sicurezza dei sistemi informatici e delle reti 18 febbraio 2014

La gestione della memoria dinamica Heap

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

A#acchi Base: Buffer Overflow

Capire e sfruttare gli stack buffer overflows

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

GLUI: GLUT-based User Interface

Sistemi Operativi (M. Cesati)

Tecniche di traduzione da C ad assembly Note generali

10 - Programmare con gli Array

Sistemi Operativi (modulo di Informatica II) I processi

Il linguaggio C. Notate che...

CREARE UNA LIBRERIA IN C

Corso di Fondamenti di Informatica Algoritmi su array / 2

Transcript:

Università degli Studi di Milano

Sommario Introduzione 1 Stack Guard Terminator Canaries Random Canaries 2 3

Buffer Overflow Stack Guard Introduzione Buffer Overflow Condizione anomala. Memorizzazione di dati su buffer oltre i limiti della sua capienza. Sovrascrittura dati adiacenti.

Buffer Overflow [2] Introduzione Buffer Overflow [2] In determinate condizioni è possibile: Indurre un crash dell applicazione. Modificarne il comportamento. Forzare l esecuzione di codice arbitrario.

Indurre crash Stack Guard Introduzione Esempio #i n c l u d e <s t d i o. h> #i n c l u d e <s t r i n g. h> i n t f o o ( char i n ) { char buf [ 5 1 2 ] ; s t r c p y ( buf, i n ) ; } r e t u r n 0 ; i n t main ( i n t argc, char a r g v ) { r e t u r n f o o ( a r g v [ 1 ] ) ; }

Layout stack Stack Guard Introduzione 080483a0 <main>: <...> 80483b5: call 8048370 <foo> 80483ba: leave 80483bb: ret 08048370 <foo>: 8048370: push %ebp 8048371: mov %esp,%ebp 8048373: sub $0x218,%esp 8048379: mov 0x8(%ebp),%eax 804837c: mov %eax,0x4(%esp) 8048380: lea -0x208(%ebp),%eax 8048386: mov %eax,(%esp) 8048389: call 80482b8 <strcpy@plt> 804838e: leave 804838f: xor %eax,%eax 8048391: ret return address frame pointer buffer

Modificarne il comportamento Introduzione esempio [2] #i n c l u d e <s t d i o. h> #i n c l u d e <s t d l i b. h> i n t c h e c k u s e r ( v o i d ) { r e t u r n 0 ; } i n t main ( i n t argc, char a r g v ) { i n t admin ; char buf [ 5 1 2 ] ; } admin=check user ( ) ; s t r c p y ( buf, a r g v [ 1 ] ) ; i f ( admin == 1) system ( / b i n / sh ) ; e l s e r e t u r n 0 ;

Eseguire codice arbitrario Introduzione Tipico payload nop sled. shellcode. retaddress. <nop><nop><nop>... <shellcode><ret><ret><ret>..

Canarini Stack Guard Terminator Canaries Random Canaries Canarini Miniere di carbone fine 800 Evitare stragi in miniera sentono prima degli uomini le fughe di gas

Canarini digitali [1] Terminator Canaries Random Canaries #i n c l u d e <s t d i o. h> #i n c l u d e <s t d l i b. h> i n t main ( i n t argc, char a r g v ) { i n t c a n a r y ; canary = 0 x01010101 ; char buf [ 5 1 2 ] ; s t r c p y ( buf, a r g v [ 1 ] ) ; i f ( canary!= 0x01010101 ) e x i t ( EXIT FAILURE ) ; } r e t u r n 0 ;

Canarini digitali [2] Terminator Canaries Random Canaries #i n c l u d e <s t d i o. h> #i n c l u d e <s t d l i b. h> i n t main ( i n t argc, char a r g v ) { i n t c a n a r y ; canary = 0 x00010101 ; char buf [ 5 1 2 ] ; s t r c p y ( buf, a r g v [ 1 ] ) ; i f ( canary!= 0x00010101 ) e x i t ( EXIT FAILURE ) ; } r e t u r n 0 ;

Canarini digitali [3] Terminator Canaries Random Canaries #i n c l u d e <s t d i o. h> #i n c l u d e <s t d l i b. h> i n t main ( i n t argc, char a r g v ) { i n t c a n a r y ; canary = 0 x00010101 ; char buf [ 5 1 2 ] ; g e t s ( buf ) ; i f ( canary!= 0x00010101 ) e x i t ( EXIT FAILURE ) ; } r e t u r n 0 ;

scelta dei canarini Stack Guard Terminator Canaries Random Canaries valore del canarino ostacolo agli exploit maggior numero di funzioni bloccate strcpy, gets,... terminator canary: 0x000aff0d

prologo ed epilogo Stack Guard Terminator Canaries Random Canaries prologo 0804836b <foo>: 804836b: push $0x000aff0d 8048370: push %ebp 8048371: mov %esp,%ebp return address canary frame pointer epilogo 8048389: call 80482b8 <strcpy@plt> 804838e: leave 804838f: cmpl $0x000aff0d, (%esp) 8048396: jne canary_changed 8048398: xor %eax,%eax 804839a: ret buffer

Terminator canaries: problemi Terminator Canaries Random Canaries problemi canarino noto non blocca tutte le funzioni (read) frame pointer non protetto variabili locali non protette finestra di codice in cui agire

canarini random Stack Guard Terminator Canaries Random Canaries canarini random variabile globale inizializzata all avvio del processo xor con return address difficile da ricavare (a meno di casi particolari)

Random canaries: problemi Terminator Canaries Random Canaries risolvono: canarino noto non blocca tutte le funzioni (read) non risolvono: frame pointer non protetto variabili locali non protette finestra di codice in cui agire

esempio: Stack Guard Terminator Canaries Random Canaries codice vulnerabile int func(char *msg) { char buf[80]; } strcpy(buf, msg);... strcpy(msg, buf);

esempio: Stack Guard Terminator Canaries Random Canaries codice vulnerabile [2] #include <stdio.h> #include <string.h> void bar(void) { printf("hello World!\n"); } int foo(char *in) { volatile int canary; void (*f)(void); char buf[512]; canary = 0x000aff0d; f = bar; strcpy(buf, in); f(); if(canary!= 0x000aff0d) { printf("smash detected!\n"); exit(0); } return 0; } int main(int argc, char **argv) { return foo(argv[1]); }

Pro police (SSP) Pro police (SSP) Hiroaki Etoh (IBM, 2000) canarini random controllo piu granulare riordinamento variabili integrato in gcc 4

riordinamento variabili riordinamento variabili canarini posti dopo frame pointer array e strutture contenenti array posti in alto restanti variabili locali appena sotto gli array controllo canarini piu granulare

SSP layout SSP layout overflow non influenzano var locali frame pointer protetto ret addr protetto parametri protetti check dei canarini dopo operazioni su array parametri retaddr frame pointer canary arrays local vars

ASLR Stack Guard ASLR obiettivi: complicare lavoro attaccante difetti: indirizzi di shellcode difficili da indovinare overhead limitato non tutto e randomizzabile (plt e testo)

ASLR Stack Guard cosa si randomizza posizione dello stack posizione dello heap indirizzo di rilocazione librerie

Problemi risolti e non: Problemi risolti: esecuzione shellcode su stack o heap modifica GOT piu difficile (ret to libc) Non risolti: ret to libc ancora possibile non control data attacks format bugs