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
<img align="right" src="https://raw.githubusercontent.com/AFLplusplus/Website/main/static/libafl_logo.svg" alt="Logotipo de LibAFL" width="250" heigh="250">
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`: El `paso de mensajes de bajo nivel`, o `LLMP` para abreviar, permite que `LibAFL` escale casi linealmente entre núcleos, y a través de TCP a múltiples máquinas.
- `adaptable`: Puede reemplazar cada parte de `LibAFL`. Por ejemplo, `BytesInput` es solo un posible formulario de entrada: siéntase libre de agregar una entrada basada en AST para fuzzing estructurado, y más.
- `multi plataforma`: `LibAFL` funciona en *Windows*, *macOS*, *iOS*, *Linux* y *Android*, y más. `LibAFL` se puede compilar en modo `no_std` para inyectar `LibAFL` en 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](https://github.com/aflplusplus/libafl/blob/main/crates/libafl), una biblioteca que contiene código común que se puede usar para la instrumentación de objetivos, [libafl_targets](https://github.com/aflplusplus/libafl/blob/main/crates/libafl_targets), y una biblioteca que proporciona facilidades para envolver compiladores, [libafl_cc](https://github.com/aflplusplus/libafl/blob/main/crates/libafl_cc). Ofrece integraciones con marcos de instrumentación populares. Actualmente, los backends compatibles son:
- `SanitizerCoverage`, en [libafl_targets](https://github.com/aflplusplus/libafl/blob/main/crates/libafl_targets)
- `Frida`, en [libafl_frida](https://github.com/aflplusplus/libafl/blob/main/crates/libafl_frida)
- `QEMU` modo usuario y modo sistema, incluidos hooks para emulación, en [libafl_qemu](https://github.com/aflplusplus/libafl/blob/main/crates/libafl_qemu)
- `TinyInst`, en [libafl_tinyinst](https://github.com/aflplusplus/libafl/blob/main/crates/libafl_tinyinst) por [elbiazo](https://github.com/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í](https://www.rust-lang.org/tools/install).
- La versión mínima de Rust compatible está definida. Siempre puede verificar la versión requerida actualmente en el [Cargo.toml](https://github.com/AFLplusplus/LibAFL/blob/main/crates/libafl/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:
```bash
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í](https://apt.llvm.org/)
- Just:
- Usamos [just](https://github.com/casey/just) para compilar los fuzzers en el directorio `fuzzers/`. Puede encontrar instrucciones para instalarlo en su entorno [en el Manual del programador de Just](https://just.systems/man/en/packages.html).
#### Clone el repositorio de `LibAFL` con
```sh
git clone https://github.com/AFLplusplus/LibAFL
```
#### Compile la biblioteca usando
```sh
cargo build --release
```
#### Compile la documentación de la API con
```sh
cargo doc
```
#### Navegue por el libro de `LibAFL` (¡en proceso!) con (requiere [mdbook](https://rust-lang.github.io/mdBook/index.html))
```sh
cd docs && mdbook serve
```
## Comenzando
Recopilamos todos los fuzzers de ejemplo en [`./fuzzers`](https://github.com/aflplusplus/libafl/blob/main/fuzzers).
Asegúrese de leer su documentación (y código fuente), ¡esta es *la forma natural de empezar!*
```sh
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`](https://github.com/aflplusplus/libafl/blob/main/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](https://github.com/aflplusplus/libafl/blob/main/docs/src/getting_started/setup.md)
- [Documentación en línea de la API](https://docs.rs/libafl/)
- El libro de `LibAFL` (en proceso) [en línea](https://aflplus.plus/libafl-book) o en el [repositorio](https://github.com/aflplusplus/libafl/blob/main/docs/src)
- Nuestro [artículo](https://www.s3.eurecom.fr/docs/ccs22_fioraldi.pdf) de investigación
- Nuestra [charla](http://www.youtube.com/watch?v=3RWkT1Q5IV0 "Fuzzers como LEGO") en RC3 explicando los conceptos centrales
- Nuestra [charla](https://www.youtube.com/watch?v=PWB8GIhFAaI "LibAFL: La biblioteca avanzada de fuzzing") 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](https://github.com/epi052/fuzzing-101-solutions) de Fuzzing101 y la serie de [publicaciones de blog](https://epi052.gitlab.io/notes-to-self/blog/2021-11-01-fuzzing-101-with-libafl/) por [epi](https://github.com/epi052)
- Publicación de blog sobre fuzzing solo binario `libaf_qemu`, [Hacking TMNF - Fuzzing del servidor del juego](https://blog.bricked.tech/posts/tmnf/part1/), por [RickdeJager](https://github.com/RickdeJager).
- [Un taller introductorio de LibAFL](https://www.atredis.com/blog/2023/12/4/a-libafl-introductory-workshop), por [Jordan Whitehead](https://github.com/jordan9001)
## Contribuyentes
`LibAFL` está escrito y mantenido por
- [Andrea Fioraldi](https://twitter.com/andreafioraldi) <[email protected]>
- [Dominik Maier](https://bsky.app/profile/dmnk.bsky.social) <[email protected]>
- [s1341](https://twitter.com/srubenst1341) <[email protected]>
- [Dongjia Zhang](https://github.com/tokatoka) <[email protected]>
- [Addison Crump](https://github.com/addisoncrump) <[email protected]>
- [Romain Malmain](https://github.com/rmalmain) <[email protected]>
## Contribuir
Consulte **[CONTRIBUTING.md](https://github.com/aflplusplus/libafl/blob/main/CONTRIBUTING.md)** para la guía de contribución.
## Depuración
¿Su fuzzer no funciona como esperaba? Intente leer [DEBUGGING.md](https://github.com/aflplusplus/libafl/blob/main/docs/src/DEBUGGING.md) para entender cómo depurar sus problemas.
## Citar
Si usa `LibAFL` para su trabajo académico, cite el siguiente artículo:
```bibtex
@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
<sup>
Licenciado bajo <a href="https://github.com/aflplusplus/libafl/blob/main/LICENSE-APACHE">Licencia Apache, Versión
2.0</a> o <a href="https://github.com/aflplusplus/libafl/blob/main/LICENSE-MIT">licencia MIT</a> a su elección.
</sup>
<br>
<sub>
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.
</sub>