Fuzzing con libFuzzer
Individui crash nei casi limite sottoponendo il codice a fuzzing con libFuzzer
Fuzzing con libFuzzer è una lezione C++ 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 C++ Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C++ Academy include 4 lezioni in totale.
Perché usare il fuzzing?
Il fuzzing genera input casuali per trovare crash, blocchi e vulnerabilità di sicurezza. I fuzzing moderni utilizzano il feedback sulla copertura per far evolvere gli input ed esplorare nuovi percorsi del codice.
libFuzzer
libFuzzer fa parte di LLVM e si integra con i sanitizer. Scriva una singola funzione che esegua il fuzzing di un punto di ingresso; il framework si occupa di generare gli input.
Scrivere un fuzz target
La firma è fissa: accetti un array di byte e restituisca 0.
#include <cstdint>
#include <cstddef>
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
parse_input(reinterpret_cast<const char*>(data), size);
return 0;
}Compilazione per libFuzzer
Utilizzi Clang con la combinazione -fsanitize=fuzzer,address. Esegua direttamente il linking: non è necessario alcun main.
clang++ -g -O1 -fsanitize=fuzzer,address fuzz.cpp parser.cpp -o fuzz_target
./fuzz_targetMutazione guidata dalla copertura
libFuzzer tiene traccia dei percorsi del codice eseguiti da ogni input. Modifica gli input promettenti per esplorare percorsi più profondi, in modo molto più efficiente rispetto alla generazione casuale senza guida.
Un corpus
Inizializzi il fuzzer con una directory contenente input noti e interessanti. Il fuzzer genera nuovi input modificando quelli esistenti.
./fuzz_target corpus/File di dizionario
Fornisca un dizionario di token comuni per velocizzare l'esplorazione di input conformi alla grammatica (HTML, JSON, messaggi di protocollo).
Combinazione con i sanitizer
L'esecuzione sotto AddressSanitizer trasforma le corruzioni silenziose in crash immediati che il fuzzer può rilevare.
Prestazioni
Un singolo core può eseguire decine di migliaia di esecuzioni al secondo su target di piccole dimensioni. Lo esegua per ore o giorni e lo lasci attivo in background nella CI.
Riproduzione dei crash
Quando libFuzzer trova un crash, salva l'input su disco. Potrà riprodurlo in seguito per eseguire il debug.
./fuzz_target crash-abc123OSS-Fuzz
OSS-Fuzz di Google esegue continuamente i fuzzer sui progetti open source e segnala i bug. Molte librerie importanti si integrano con questo servizio.
AFL e Honggfuzz
Esistono anche altri fuzzer:
- AFL/AFL++ — basato su processi, con accelerazione tramite fork server
- Honggfuzz — supporta i protocolli di rete
libFuzzer è l'integrazione più semplice per C++.
Quando usare il fuzzing
Applichi il fuzzing a qualsiasi codice che gestisca input non attendibili:
- Parser (JSON, XML, protobuf)
- Decoder (immagini, audio, video)
- Gestori di protocolli di rete
- Qualsiasi componente che legga dati esterni
Verifica rapida
Perché il fuzzing guidato dalla copertura è più efficace del fuzzing puramente casuale?
Riepilogo
libFuzzer è un fuzzer guidato dalla copertura e integrato con Clang. Scriva un piccolo punto di ingresso LLVMFuzzerTestOneInput, compili con -fsanitize=fuzzer,address e lo lasci cercare i crash. Lo combini con i sanitizer e i corpus; applichi il fuzzing a qualsiasi codice che gestisca input non attendibili.
Domande Frequenti
La lezione «Fuzzing con libFuzzer» è gratuita?
Sì — il testo completo di «Fuzzing con libFuzzer» è 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 C++ Academy, passa a CoddyKit PRO. Il corso C++ Academy include 4 lezioni in totale.
Cosa imparerò in «Fuzzing con libFuzzer»?
Individui crash nei casi limite sottoponendo il codice a fuzzing con libFuzzer Eserciti C++ 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 C++ Academy?
Non è richiesta alcuna esperienza precedente. C++ 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 «Fuzzing con libFuzzer»?
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 C++ Academy?
Sì. Ogni lezione C++ 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
- Strumenti di analisi statica: clang-tidy, cppcheck
- Sanitizer: Address, Thread e UB Sanitizer
- Fuzzing con libFuzzer
- Integrazione continua per progetti C++