Format string attack: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Funzionamento dello stack: Errore di battitura
Etichette: Modifica da mobile Modifica da web per mobile
m Introduzione: Aggiunto il collegamento a "C (linguaggio di programmazione)"
 
(5 versioni intermedie di 5 utenti non mostrate)
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 (linguaggio di programmazione)|C]]. Un Format String Attack è formato da tre componenti fondamentali:
* Format Function: in ANSI C è una funzione che converte una variabile di tipo primitivo, in una stringa user-friendly cioè leggibile dall’uomo.
 
Riga 23:
== Funzionamento dello stack ==
Lo stack è un'area di memoria in cui vengono salvate le variabili locali e i parametri passati alla funzione. La sua gestione è di tipo LIFO e cresce verso indirizzi bassi. Eseguendo questo semplice codice, ad esempio:
<sourcesyntaxhighlight lang="c">
#include <stdio.h>
Riga 31:
printf("Valore var. B: %d - Indirizzo var. B: %x\n", B, &B);
}
</syntaxhighlight>
</source>
il programma stamperà:
<sourcesyntaxhighlight lang="c">
Valore var. A: 3 - Indirizzo var. A: 7fdc
Valore var. B: 5 - Indirizzo var. B: 7fd8
</syntaxhighlight>
</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.
 
Riga 43:
'''Crash del programma'''
 
Un modo molto semplice per mandare in crash un programma è passandopassare alla funzione printf() una stringa formattata in questo modo: <sourcesyntaxhighlight lang="c">printf("%s%s%s%s%s%s%s%s%s%s%s");</sourcesyntaxhighlight>
 
Ogni "%s" cerca di visualizzare il contenuto di un buffer di caratteri (una stringa) dall'indirizzo iniziale presente sullo stack fino al carattere terminatore ("0"). Inserendo quindi molti “%s", la funzione sposterà il puntatore in avanti fino ad aree di memoria non mappate nel frame dell'applicazione, così facendo cercherà di leggere da "indirizzi illegali", causando l'errore “''segmentation fault”'' che manda in crash il programma.
Riga 50:
 
Utilizzando sempre la printf(), è possibile leggere parte del contenuto dello stack, usando una format string di questo tipo:
<sourcesyntaxhighlight lang="c">printf("%08x-%08x-%08x-%08x-%08x\n");</sourcesyntaxhighlight>
l'output potrebbe essere il seguente:
<sourcesyntaxhighlight lang="c">4306ea40-43074920-0062de90-70706970-02000002</sourcesyntaxhighlight>
Questo perché essendo il numero degli argomenti della printf() variabili, questa utilizza la format string per sapere quanti gliene sono stati passati. In questo caso quindi crede (erroneamente) che siano cinque parametri, e andrà quindi a stampare i prossimi cinque indirizzi sullo stack, pensando siamosiano i parametri richiesti.
 
Il parametro di formato "%08x" è costituito dai seguenti componenti:
Riga 66:
La nostra format function mantiene all’interno dello stack il puntatore alla locazione di memoria del parametro di formato. Se fossimo in grado di far puntare quel puntatore all’area di memoria che ci interessa, potremmo dare quell’indirizzo al formato parametro "%s" così che, invocando la printf(), questa leggerà la memoria da quell’indirizzo fino a che non trova un carattere terminatore ‘0’.
 
Utilizzando ad esempio la seguenti stringa di formato:[[File:StackMemory.png|miniatura|446x446px|Salvataggio variabili sullo stack]]<sourcesyntaxhighlight lang="c"> printf ("\x10\x01\x48\x08_%08x-%08x-%08x-|%s|"); </sourcesyntaxhighlight>
la sequenza di "%08x" incrementa il puntatore interno della format function verso il top dello stack. Dopo alcuni di questi incrementi, lo stack pointer punterà esattamente all'indirizzo della nostra format string. Con il giusto numero di ‘%08x’ potremmo visualizzare la memoria (codificata in ASCII) da un qualsiasi indirizzo.
 
Riga 83:
 
La printf() ha un altro parametro di formato molto interessante: "%n".
<sourcesyntaxhighlight lang=c>int i;
printf ("12345%n", &i);</sourcesyntaxhighlight>
Con questo parametro il numero di caratteri scritti prima di lui verrà salvato nella variabile "i"!
Quindi usando lo stesso metodo implementato per visualizzare il contenuto della memoria, possiamo andare a scrivere un intero (praticamente) ovunque.
Riga 91:
== Voci correlate ==
* [[Cross Application Scripting]]
* [[Stack_overflowStack overflow]]
* [[C_(linguaggio)Linguaggio C]]
 
== Collegamenti esterni ==
* {{en}}scut / team teso [http://julianor.tripod.com/bc/formatstring-1.2.pdf Come sfruttare le Format String Vulnerabilities] v1.2 Sept 24, [[2001]]
* {{cita web|https://www.securecoding.cert.org|CERT standard di programmazione sicura|lingua=en}}
* {{cita web|httphttps://www.cert.org/secure-coding|CERT iniziativa per la programmazione sicura|lingua=en}}
* {{cita web|httphttps://www.cert.org/books/secure-coding|programmazione sicura in C e C++|lingua=en}}
 
{{Portale|sicurezza informatica}}