
LibAFL v0.16.0
Biblioteca avanzada de fuzzing - ¡Conecta tu Fuzzer en Rust! Escala entre núcleos y máquinas. Para Windows, Android, MacOS, Linux, no_std, ...
LibAFL, la biblioteca de fuzzing
Biblioteca avanzada de fuzzing: ensamble sus propios fuzzers y amplíe sus funcionalidades usando Rust.
LibAFL es una colección de piezas reutilizables de fuzzers, escrita en Rust, que le brinda muchos de los beneficios de un fuzzer comercial, siendo completamente personalizable.
Algunas características destacadas incluyen actualmente:
fast: Hacemos todo lo posible en tiempo de compilación, minimizando la sobrecarga en tiempo de ejecución. Los usuarios alcanzan 120k ejecuciones/seg en modo frida en un teléfono (usando todos los núcleos).scalable: Elpaso de mensajes de bajo nivel, oLLMPpara abreviar, permite queLibAFLescale casi linealmente entre núcleos, y a través de TCP a múltiples máquinas.adaptable: Puede reemplazar cada parte deLibAFL. Por ejemplo,BytesInputes solo un posible formulario de entrada: siéntase libre de agregar una entrada basada en AST para fuzzing estructurado, y más.multi plataforma:LibAFLfunciona en Windows, macOS, iOS, Linux y Android, y más.LibAFLse puede compilar en modono_stdpara inyectarLibAFLen objetivos oscuros como dispositivos embebidos e hipervisores.traiga su propio objetivo: Admitimos modos solo binarios, como el modo Frida, así como múltiples pasos de compilación para instrumentación basada en código fuente. Por supuesto, es fácil agregar backends de instrumentación personalizados.
Conceptos principales
LibAFL es rápido, multiplataforma, compatible con no_std y escala entre núcleos y máquinas. Ofrece un crate principal que proporciona bloques de construcción para fuzzers personalizados, libafl, una biblioteca que contiene código común que se puede usar para la instrumentación de objetivos, libafl_targets, y una biblioteca que proporciona facilidades para envolver compiladores, libafl_cc. Ofrece integraciones con marcos de instrumentación populares. Actualmente, los backends compatibles son:
SanitizerCoverage, en libafl_targetsFrida, en libafl_fridaQEMUmodo usuario y modo sistema, incluidos hooks para emulación, en libafl_qemuTinyInst, en libafl_tinyinst por elbiazo
Compilación e instalación
Instalar las dependencias
- El lenguaje de desarrollo Rust
-
Recomendamos encarecidamente no usar, por ejemplo, el paquete de su distribución Linux, ya que probablemente esté desactualizado. Por lo tanto, instale Rust directamente, las instrucciones se pueden encontrar aquí.
-
La versión mínima de Rust compatible está definida. Siempre puede verificar la versión requerida actualmente en el Cargo.toml de LibAFL:
Si su versión instalada de Rust es anterior a la que aparece en Cargo.toml, actualice al último toolchain estable:
rustup update stable
-
- Herramientas LLVM
- Las herramientas LLVM (incluyendo clang, clang++) son necesarias (más nuevas que LLVM 15.0.0 hasta LLVM 18.1.3) Si usa Debian/Ubuntu, nuevamente, recomendamos encarecidamente que instale el paquete desde aquí
- Just:
- Usamos just para compilar los fuzzers en el directorio
fuzzers/. Puede encontrar instrucciones para instalarlo en su entorno en el Manual del programador de Just.
- Usamos just para compilar los fuzzers en el directorio
Clone el repositorio de LibAFL con
git clone https://github.com/AFLplusplus/LibAFL
Compile la biblioteca usando
cargo build --release
Compile la documentación de la API con
cargo doc
Navegue por el libro de LibAFL (¡en proceso!) con (requiere mdbook)
cd docs && mdbook serve
Comenzando
Recopilamos todos los fuzzers de ejemplo en ./fuzzers.
Asegúrese de leer su documentación (y código fuente), ¡esta es la forma natural de empezar!
just run
Puede ejecutar cada fuzzer de ejemplo con este comando, siempre que el directorio del fuzzer tenga un archivo Justfile. El fuzzer mejor probado es ./fuzzers/inprocess/libfuzzer_libpng, un fuzzer multinúcleo similar a libfuzzer que usa LibAFL para un harness de libpng.
Recursos
- Guía de instalación
- Documentación en línea de la API
- El libro de
LibAFL(en proceso) en línea o en el repositorio - Nuestro artículo de investigación
- Nuestra charla en RC3 explicando los conceptos centrales
- Nuestra charla en Fuzzcon Europe con una discusión paso a paso (un poco pero no tan desactualizada) sobre cómo construir algunos fuzzers de ejemplo
- Las soluciones de Fuzzing101 y la serie de publicaciones de blog por epi
- Publicación de blog sobre fuzzing solo binario
libaf_qemu, Hacking TMNF - Fuzzing del servidor del juego, por RickdeJager. - Un taller introductorio de LibAFL, por Jordan Whitehead
Contribuyentes
LibAFL está escrito y mantenido por
- Andrea Fioraldi [email protected]
- Dominik Maier [email protected]
- s1341 [email protected]
- Dongjia Zhang [email protected]
- Addison Crump [email protected]
- Romain Malmain [email protected]
Contribuir
Consulte CONTRIBUTING.md para la guía de contribución.
Depuración
¿Su fuzzer no funciona como esperaba? Intente leer DEBUGGING.md para entender cómo depurar sus problemas.
Citar
Si usa LibAFL para su trabajo académico, cite el siguiente artículo:
@inproceedings{libafl,
author = {Andrea Fioraldi and Dominik Maier and Dongjia Zhang and Davide Balzarotti},
title = {{LibAFL: A Framework to Build Modular and Reusable Fuzzers}},
booktitle = {Proceedings of the 29th ACM conference on Computer and communications security (CCS)},
series = {CCS '22},
year = {2022},
month = {November},
location = {Los Angeles, U.S.A.},
publisher = {ACM},
}
Licencia
Licenciado bajo Licencia Apache, Versión 2.0 o licencia MIT a su elección.A menos que indique explícitamente lo contrario, cualquier contribución enviada intencionalmente para su inclusión en este crate por usted, según lo definido en la licencia Apache-2.0, tendrá una licencia dual como se indica arriba, sin términos ni condiciones adicionales.