Format string attack: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
Etichette: Inserimento di parole incomprensibili Sequenze di caratteri ripetuti da parte di un nuovo utente o IP Modifica visuale: commutato |
|||
Riga 4:
== Introduzione ==
Il tipo di attacco Format String è una classe di vulnerabilità scoperte nel 1999, presenti prevalentemente in linguaggi di programmazione imperativi come il C. Un Format String Attack è formato da tre componenti fondamentali:
* Format Function: in ANSI C è una funzione che converte una variabile di tipo primitivo
▲* Format Function: in ANSI C è una funzione che converte una variabile di tipo primitivo, del linguaggio di programmazione, in una stringa user-friendly cioè leggibile dall’uomo. Alcune di queste sono:
printf: per stampare su stdout
Riga 14 ⟶ 12:
snprintf: per stampare esattamente 'n' caratteri della stringa in ingresso nella seconda
* Format String: è l’argomento della format function ed è una stringa ASCII che contiene sia testo che parametri di formato
printf(“The magic number is %d\n”, 3);
* Format String Parameter definiscono il tipo di conversione da effettuare in relazione alla variabile presente nella format string.
“%s”: per stampare una stringa
“%d”: per stampare degli interi
Riga 24 ⟶ 22:
== Funzionamento dello stack ==
Lo stack è un'area di memoria in cui vengono salvate le variabili locali e i parametri passati alla funzione. La sua gesitone è di tipo LIFO e cresce verso indirizzi bassi. Eseguendo questo semplice codice, ad esempio:
<source lang="c">
#include <stdio.h>
Riga 36 ⟶ 34:
il programma stamperà:
<source lang="c">
Valore
Valore
</source>
se invece la printf() riceve come parametro una stringa "maligna" (senza controllarne le caratteristiche) il risultato sarebbe proprio un attacco di tipo format string.
== Attacchi possibili ==
'''Crash del programma'''
Un modo molto semplice per mandare in crash un programma è passando alla funzione printf() una stringa formattata in questo modo: <source lang="c">printf("s%s%s%s%s%s%s%s%s%s%s");</source>
Ogni "%s" cerca di visualizzare il contenuto della memoria da un certo indirizzo presente sullo stack fino al carattere terminatore.
Inserendo quindi molti “%s”, la probabilità di andare a leggere da un “illegal address” (cioè un indirizzo non mappato per questa funzione) sono molto elevate e se succede, causeremmo l’errore “''segmentation fault”'' crashando quindi il programma.
Se si passa a una funzione che stampa una stringa a schermo (un esempio classico è la funzione [[printf]] del [[C (linguaggio)|linguaggio C]]) una stringa che in realtà contiene una serie di parametri di specifica dell'input (tipicamente si usano identificatori di formato ''%s'' e ''%x'' per esaminare il contenuto della memoria e ''%n'' per sovrascrivere parti della memoria, in particolare dello [[stack]]) si permette l'avvio di un attacco di tipo [[stack overflow]] e ''return to libc''. Per proteggersi da questo attacco, quando si vuole stampare una stringa ''s'' usando la printf() o una qualsiasi funzione C che accetti un numero illimitato di identificatori di formato, bisogna scrivere la funzione
|