Format String Vulnerability

Похожие документы
Esercitazione di Reti degli elaboratori

Stack-based buffer overflow

Scrittura formattata - printf

Introduzione alla programmazione in linguaggio C

File e puntatori a file

I CARATTERI E LE STRINGHE

Variabili e Istruzioni

Appunti del corso di Informatica 1 (IN110 Fondamenti) 5 Rappresentazione delle informazioni

Il linguaggio C. Puntatori e dintorni

Lezione 6 Introduzione al C++ Mauro Piccolo

Informatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica

Primi passi col linguaggio C

LIBRERIE STANDARD in C. LIBRERIE STANDARD in C

File binari e file di testo

L AMBIENTE CODE BLOCKS E L IO

Spazio di indirizzamento virtuale

Processore Danilo Dessì. Architettura degli Elaboratori.

L AMBIENTE CODE BLOCKS E L IO

Caratteri e stringhe

Tipi di dati scalari (casting e puntatori) Alessandra Giordani Lunedì 10 maggio 2010

Informatica Generale Andrea Corradini I linguaggi di programmazione

Gestione dei file in C

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - Programma

Sommario PREFAZIONE...XI CAPITOLO 1: INTRODUZIONE AI COMPUTER, A INTERNET E AL WEB... 1 CAPITOLO 2: INTRODUZIONE ALLA PROGRAMMAZIONE IN C...

Esercitazioni su rappresentazione dei numeri e aritmetica dei calcolatori

La codifica binaria. Fondamenti di Informatica. Daniele Loiacono

Stringhe e tipi di dati strutturati

I/O da tastiera + Alessandra Giordani Lunedì 2 maggio

La protezione dai memory error exploit

Implementazione di DFA in C

C: panoramica. Violetta Lonati

Una stringa di caratteri in C è un array di caratteri terminato dal carattere '\0' a p e \0

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

Транскрипт:

Università degli Studi di Milano Facoltà di Scienze Matematiche, Fisiche e Naturali Corso di Laurea in Informatica April 15, 2005

Sommario 1 Format string Definizione Format function Componenti delle Format function Funzionamento delle Format function 2

Sommario 1 Format string Definizione Format function Componenti delle Format function Funzionamento delle Format function 2

Definizione Format function Componenti delle Format function Funzionamento delle Format function Introduzione Format string vs. Buffer Overflow La vulnerabilità del format string è stata pubblicata per la prima volta nel Giugno 1999. Mentre il buffer overflow fa la sua comparsa nelle prima metà anni 80. Il Format string è stato realizzato nel Giugno del 2000. Il buffer overflow si presenta prepotentemente negli anni 90. Il Format string è molto più semplice da ricercare rispetto alla vulnerabilità del buffer overflow.

Definizione Format function Componenti delle Format function Funzionamento delle Format function Definizione Format function Def. Format function Sono funzioni di conversione che sono usate per rappresentare i tipi di dati nel linguaggio C, in modo leggibile dall essere umano. Queste funzioni vengono usate per stampare informazioni, errori o per processare stringhe. fprintf: stampa su FILE stream. printf: stampa su stdout stream. sprintf: stampa all interno di una stringa snprintf: stampa all interno di una stringa con controllo della lunghezza....

Definizione Format function Componenti delle Format function Funzionamento delle Format function Format string Format function printf("il numero scelto e : %d\n", 1911); parametri output tipo di passaggio %d decimale per valore %u decimale senza segno per valore %x esadecimale per valore %s stringa per riferimento %n numero di byte scritti fin ora per riferimento

Definizione Format function Componenti delle Format function Funzionamento delle Format function Funzionamento delle Format function Format function printf("numero %d all indirizzo: %08x di lunghezza %d", i, &i, n); Il format string controlla il comportamento della funzione. specifica il tipo di parametri che devono essere stampati. i parametri sono salvati sullo stack.

(1) La vulnerabilità del format string può essere classificata, come channeling problem. Il channeling problem si può verificare quando informazioni di controllo e informazioni dati, coesistono nello stesso canale. L ipotesi di sfruttamento del channeling problem si ha quando l utente può specificare nello stesso canale di comunicazione sia dati che informazioni di controllo.

(2) Situazione Canali Dati Canali controllo Problemi Phone System Voce/dati Toni di contr. contr. can. Stack Dati Stack Ret contr. ret Malloc buffers dati Malloc Gestore info scri. in mem Format strings Stringa Out par. di formato contr func.

Esempio di vulenrabilità esempio vulnerabilità Codice contenente vulnerabilita int func(char * user) { printf(user) ; } Codice non contenente vulnerabita int func(char *user) { printf("%s", user) ; }

Attaco di tipo DoS Un semplice attacco che può essere portato a termine sfruttando la vulenrabilità del format string è quello di far terminare il processo vittima, causando di fatto un DoS (Esempio DNS spoofing). Per sfruttare l attacco si può utilizzare il formattatore %s: printf("%s%s%s%s%s%s%s%s%s%s") ;

Memoria stack del processo Memoria Stack del processo Un altro tipo di attacco che può essere portato a termine è rivolto all information gathering dei dati in memoria stack: Per portare a termine l attacco si può utilizzare il formattatore %x: printf("%08x.%08x.%08x.%08x.%08x.%08x") ;

Locazione arbitraria di memoria del processo (1) Locazione arbitraria di memoria L ipotesi per poter sfruttare questa tipologia d attacco sono due: formattatore che usa un indirizzo (per riferimento) come parametro dello stack, e visualizza la memoria dall indirizzo fornito. riuscire a fornire alla funzione format string l indirizzo da cui visualizzare la memoria.

Locazione arbitraria di memoria del processo (2) Locazione arbitraria di memoria La prima ipotesi, viene soddisfatta tramite il formattatore %s La seconda ipotesi, invece viene soddisfatta, fornendo l indirizzo come stringa alla format funcion. Esempio: address=0x08480110 printf("\x10\x01\x48\x08_%08x.%08x.%08x %s ") ;

(1) esempio di codice vulnerabile (QPOP 2.53) { char outbuf[512] ; char buffer[512] ; sprintf(buffer, "ERR Wrong command: %s", user) ; sprintf(outbuf, buffer) ; }

(2) Injection vector (QPOP 2.53) La dimensione del buffer user viene controllata, in modo che non ecceda i 512 byte. La vulnerabilità viene sfruttata attraverso il seguente injection vector: %497d\x3c\xd3\xff\xbf<nops><shellcode>

Esempio programmativo (wu-ftpd 2.6.0) { char buffer[512] ; snprintf( buffer, sizeof(buffer), user) ; buffer[sizeof(buffer) - 1] = \0 ; }

Sovrascrittura indirizzi (1) Sovrascrittura indirizzi in memoria Per poter sovrascrivere un indirizzo serve un formattatore in grado di poter scrivere in una cella di memoria (per riferimento). Si deve trovare un modo per poter scrivere nell indirizzo scelto un valore controllabile da noi.

Sovrascrittura indirizzi (2) Sovrascrittura indirizzi in memoria Per poter sovrascrivere un indirizzo si può utilizzare il formattatore %n, che scrive all indirizzo puntato dallo stack pointer, il numero di caratteri scritti fin ora. Per poter controllare quello che scriviamo, usiamo il padding presenti nei vari formattatori, per esempio %230u, esegue il padding della variabile a 230 caratteri.

Sovrascrittura indirizzi (3) Sovrascrittura indirizzi in memoria Esiste però un problema per la sovrascrittura: Non posso scrivere direttamente, per esempio, gli indirizzi dello stack, in quanto dovrei eseguire un padding di miliardi di caratteri (0xbfffffe2 = 3221225442). questo problema può essere risolto basandoci su una caratteristica dell architettura CISC, che permette di scrivere, indirizzi disallineati in memoria.

Sovrascrittura (4) Format string Sovrascrittura (4) {... printf("%16u%n", 7350, (int*) &foo[0]) ; printf("%32u%n", 7350, (int*) &foo[1]) ; printf("%64u%n", 7350, (int*) &foo[2]) ; printf("%128u%n", 7350, (int*) &foo[3]) ;... }

Algoritmo del calcolatore ad orologio (1) algoritmo dell orologio Quando sfruttiamo la vulnerabilità si deve tenere conto, che le scritture dell indirizzo avvengono sequenzialmente, quindi il numero di caratteri stampati si sommano ad ogni operazione. Quando scriviamo si deve tener conto di 2 parametri principali: byte scritti fin ora. valore da scrivere all indirizzo. nel caso che il valore da scrivere sia minore dei caratteri stampati fino a quell istante, si deve utilizzare l aritmetica in modulo, in particolare per scrivere all interno di byte (unsigned) aritmetica modulo 256.

Algoritmo del calcolatore ad orologio (2) algoritmo dell orologio if( already_written > write_byte ){ padding = 256 - ((already_written%256) - write_byte) ; if (padding < 4) padding += 256 ; } else if( already_written < write_byte ) { padding = write_byte - already_written; if (padding < 4) padding += 256 ; } already_written += padding ;

Parametri dell exploitation Parametri dell exploitation La prima informazione, che ci serve è il retloc, l indirizzo a cui è localizzato il return address. quante Word (32 bit) separano il puntatore del format string, relativo ai parametri della format function e il reale buffer contenuto in memoria. Indirizzo dello shellcode da eseguire.

Injection Vector Format string Injection vector dummy-addr-pair quattro coppie di interi dummy e indirizzi sui quale scrivere, gli indirizzi sono aumentati di 1 per ogni coppia. stackpop sequenza di stack popping che sposta il puntatore di riferimento ai parametri della format function. write-code parte della format string che esegue realmente la scrittura in memoria tramite i formattatori %nu%n. <dummy-addr-pair*4><stackpop><write-code>

Esempio Vulnerabilità Esempio programmativo int func(char *user, char *buffer, int len) { snprintf(buffer, len, user) ; buffer[len - 1] = \0 ; printf("%s\n", buffer) ; }/*endfunc*/

Link Utili Format string Link Utili http://www.team-teso.net/articles/formatstring/ http://www.0xdeadbeef.info/ http://idea.sec.dico.unimi.it/~andrew/