0Pricing
Cyber Security Academy · Lezione

Vulnerabilità di format string

Sfruttate le format string di printf per leggere aree di memoria arbitrarie e scrivere ad indirizzi arbitrari.

Vulnerabilità di format string è una lezione Cyber Security Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Cyber Security Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Cyber Security Academy include 4 lezioni in totale.

Che cos'è una vulnerabilità di format string?

Una vulnerabilità di format string si verifica quando l'input dell'utente viene passato direttamente come argomento della stringa di formato a printf() o a funzioni simili. L'attaccante può leggere la memoria, fare trapelare gli indirizzi dello stack e scrivere valori arbitrari.

Il pattern vulnerabile

Confronto tra versione vulnerabile e sicura:

// VULNERABLE - user controls the format string:
printf(user_input);
fprintf(stderr, user_input);

// SAFE - user input is a data argument:
printf("%s", user_input);

Leggere la memoria con %x e %p

Gli specificatori di formato senza argomenti corrispondenti leggono i valori dallo stack:

# Input: %p.%p.%p.%p.%p
# Output: 0x7ffd12345678.0x400580.0x0.0x1.0x7f3a...
# Each %p prints the next value off the stack - leaking addresses!

Eludere ASLR con i leak di format string

Lo stack contiene spesso puntatori a libc, allo stack e al binario. Facendoli trapelare con gli specificatori %p o %lx, l'attaccante può calcolare gli indirizzi di base ed eludere ASLR, anche senza altre vulnerabilità.

Leggere memoria arbitraria con %s

%s considera il valore nello stack un puntatore e stampa la stringa presente a quell'indirizzo. Posizionando l'indirizzo bersaglio nella posizione corretta dello stack e usando l'accesso ai parametri (%7$s), l'attaccante legge posizioni di memoria arbitrarie.

# Direct parameter access:
printf("%7$s")  # prints string at 7th stack parameter
# If 7th param is an address you control, reads that memory

Scrivere nella memoria con %n

%n scrive il numero di caratteri stampati fino a quel momento all'indirizzo indicato dall'argomento corrispondente. Ciò consente di scrivere valori controllati in indirizzi arbitrari, sovrascrivendo potenzialmente puntatori a funzioni o indirizzi di ritorno.

Tecnica pratica di scrittura

Per scrivere un valore specifico usando %n:

  1. Controllare un puntatore nello stack che punti all'indirizzo bersaglio
  2. Usare %Xc%N$n per scrivere X caratteri, quindi scrivere il conteggio nell'N-esimo parametro (l'indirizzo bersaglio)

Strumenti come pwntools automatizzano la costruzione di exploit di format string.

Trovare i bug di format string

Testare le vulnerabilità di format string:

# Test inputs:
%x.%x.%x
%p.%p.%p
%s%s%s
AAAA.%p.%p.%p.%p (looking for 0x41414141 in output)

# Automated testing with fuzzer:
python3 -c "print('%p.' * 20)" | ./vuln

Difesa: correggere il codice

La correzione è semplicissima: passare sempre l'input dell'utente come argomento dati, mai come stringa di formato.

// WRONG:
printf(buffer);

// RIGHT:
printf("%s", buffer);

// Compiler warning:
// gcc -Wformat-security will flag this

Format string in altri linguaggi

Le vulnerabilità di format string si verificano in molti linguaggi:

  • C: printf(input)
  • Python: non è la stessa cosa, ma la formattazione con % usando un input di tipo dict può esporre variabili
  • Java: String.format(input) — meno pericolosa, non consente l'accesso alla memoria

Esempi nel mondo reale

I bug di format string hanno interessato:

  • ProFTPD — ha consentito l'esecuzione di codice da remoto tramite comandi FTP
  • WU-FTPD — exploit per ottenere accesso root da remoto tramite format string
  • Vari demoni Linux precedenti agli anni 2000

I compilatori moderni e FORTIFY_SOURCE aiutano, ma non eliminano completamente questa classe di vulnerabilità.

Verifica rapida: format string

Quale specificatore di formato può essere usato per scrivere a un indirizzo di memoria arbitrario in un attacco di format string?

Riepilogo della lezione

Le vulnerabilità di format string si verificano quando l'input dell'utente viene usato direttamente come stringa di formato di printf. %p/%x fa trapelare la memoria dello stack; %s legge indirizzi arbitrari; %n scrive in indirizzi arbitrari. La correzione consiste nell'aggiungere un solo carattere: printf("%s", input). Abilitare -Wformat-security nei flag del compilatore consente di rilevare questi problemi.

Domande Frequenti

La lezione «Vulnerabilità di format string» è gratuita?

Sì — il testo completo di «Vulnerabilità di format string» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Cyber Security Academy, passa a CoddyKit PRO. Il corso Cyber Security Academy include 4 lezioni in totale.

Cosa imparerò in «Vulnerabilità di format string»?

Sfruttate le format string di printf per leggere aree di memoria arbitrarie e scrivere ad indirizzi arbitrari. Eserciti Cyber Security Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Cyber Security Academy?

Non è richiesta alcuna esperienza precedente. Cyber Security Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Vulnerabilità di format string»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Cyber Security Academy?

Sì. Ogni lezione Cyber Security Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Buffer overflow nello stack
  2. Return-Oriented Programming (ROP)
  3. Vulnerabilità di format string
  4. Sfruttamento dell'heap: use-after-free e heap spraying
← Torna a Cyber Security Academy