Fuzzing con libFuzzer
Encuentre fallos en casos límite probando su código con fuzzing mediante libFuzzer.
Fuzzing con libFuzzer es una lección gratuita de C++ Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C++ Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C++ Academy incluye 4 lecciones en total.
¿Por qué hacer fuzzing?
El fuzzing genera entradas aleatorias para encontrar fallos, bloqueos y errores de seguridad. Los fuzzers modernos utilizan información de cobertura para desarrollar entradas que exploran nuevas rutas de código.
libFuzzer
libFuzzer forma parte de LLVM y se integra con los sanitizers. Escriba una sola función que someta a fuzzing un punto de entrada; el framework se encarga de generar las entradas.
Escritura de un objetivo de fuzzing
La firma es fija: recibe una matriz de bytes y devuelve 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;
}Compilación para libFuzzer
Use Clang con la combinación -fsanitize=fuzzer,address. Enlace directamente; no necesita una función main.
clang++ -g -O1 -fsanitize=fuzzer,address fuzz.cpp parser.cpp -o fuzz_target
./fuzz_targetMutación guiada por cobertura
libFuzzer registra las rutas de código que ejecuta cada entrada. Muta las entradas prometedoras para explorar rutas más profundas, de forma mucho más eficiente que la generación aleatoria a ciegas.
Un corpus
Proporcione al fuzzer un directorio con entradas interesantes conocidas. El fuzzer genera nuevas entradas al mutarlas.
./fuzz_target corpus/Archivos de diccionario
Proporcione un diccionario de tokens habituales para acelerar la exploración de entradas con una gramática (HTML, JSON y mensajes de protocolo).
Combine con sanitizers
Ejecutar el programa con AddressSanitizer convierte las corrupciones silenciosas en fallos inmediatos que el fuzzer puede detectar.
Rendimiento
Un solo núcleo puede realizar decenas de miles de ejecuciones por segundo en objetivos pequeños. Ejecútelo durante horas o días y déjelo funcionar en segundo plano en CI.
Reproducción de fallos
Cuando libFuzzer encuentra un fallo, guarda la entrada en el disco. Puede volver a reproducirla más tarde para depurarla.
./fuzz_target crash-abc123OSS-Fuzz
El OSS-Fuzz de Google ejecuta fuzzers continuamente sobre proyectos de código abierto e informa de los errores. Muchas bibliotecas destacadas se integran con él.
AFL y Honggfuzz
Existen otros fuzzers:
- AFL/AFL++ — basado en procesos, con aceleración mediante un servidor de bifurcación
- Honggfuzz — admite protocolos de red
libFuzzer es la integración más sencilla con C++.
Cuándo hacer fuzzing
Haga fuzzing sobre cualquier código que gestione entradas no confiables:
- Analizadores sintácticos (JSON, XML, protobuf)
- Decodificadores (imágenes, audio y vídeo)
- Controladores de protocolos de red
- Cualquier código que lea datos externos
Comprobación rápida
¿Qué hace que el fuzzing guiado por cobertura sea más eficaz que el fuzzing puramente aleatorio?
Resumen
libFuzzer es un fuzzer guiado por cobertura que se integra con Clang. Escriba un punto de entrada pequeño con LLVMFuzzerTestOneInput, compile con -fsanitize=fuzzer,address y deje que busque fallos. Combínelo con sanitizers y corpus; someta a fuzzing cualquier código que procese entradas no confiables.
Preguntas frecuentes
¿La lección «Fuzzing con libFuzzer» es gratis?
Sí — el texto completo de «Fuzzing con libFuzzer» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C++ Academy, actualiza a CoddyKit PRO. El curso de C++ Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Fuzzing con libFuzzer»?
Encuentre fallos en casos límite probando su código con fuzzing mediante libFuzzer. Practicas C++ Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar C++ Academy?
No se requiere experiencia previa. C++ Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Fuzzing con libFuzzer»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de C++ Academy?
Sí. Cada lección de C++ Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Herramientas de análisis estático: clang-tidy y cppcheck
- Sanitizers: AddressSanitizer, ThreadSanitizer y UBSan
- Fuzzing con libFuzzer
- Integración continua para proyectos C++