Format string attack
Le format string attack (vulnerabilità di formato della stringa) sono una classe di vulnerabilità scoperte nel 1999.
Introduzione
Il tipo di attacco Format String è una classe di vulnerabilità scoperte nel 1999, presenti prevalentemente in linguaggi di programmazione imperativi come il C.
- per capire come fare un Format String Attack bisgona sapere da cosa è composto:
- 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 fprintf: per stampare la format string su file sprintf: per stampare una stringa dentro un buffer 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, ad esempio:
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. Ad esempio:
“%s”: per stampare una stringa “%d”: per stampare degli interi “%c”: per stampare dei caratteri “%x”: per stampare caratteri esadecimali
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.
#include <stdio.h>
void main(int argc , char* argv){
int A=3, B=5;
printf("Valore var. A: %d - Indirizzo var. A: %x\n", A, &A);
printf("Valore var. B: %d - Indirizzo var. B: %x\n", B, &B);
}
il programma stamperà:
Valore variabile A: 3 - Indirizzo var. A: 22ed7fdc
Valore variabile B: 5 - Indirizzo var. B: 22ed7fd8
Lo stack “cresce” verso indirizzi di memoria decrescenti, salvado le variabili del programma Se si passa a una funzione che stampa una stringa a schermo (un esempio classico è la funzione printf del 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
Text exampleText exampleprintf("%s",s)
e non scrivere
printf(s)
in quanto in questo modo l'input dell'utente non viene validato. La stringa StringPointer potrebbe contenere una serie di identificatori di formato. Questo tipo di attacco, comunque, diventa sempre più difficile grazie alla diffusione di una maggiore consapevolezza della necessità di gestire i rischi associati alla programmazione e alla conseguente diffusione di tecniche di programmazione sicura.
Voci correlate
Collegamenti esterni
- (EN) scut / team teso Come sfruttare le Format String Vulnerabilities v1.2 Sept 24, 2001
- (EN) CERT standard di programmazione sicura, su securecoding.cert.org.
- (EN) CERT iniziativa per la programmazione sicura, su cert.org.
- (EN) programmazione sicura in C e C++, su cert.org.