Bibliothèque avancée de Fuzzing - Assemblez votre Fuzzer en Rust ! Passe à l'échelle sur plusieurs cœurs et machines. Pour Windows, Android, MacOS, Linux, no_std, ...
# `LibAFL`, la bibliothèque de fuzzing
<img align="right" src="https://raw.githubusercontent.com/AFLplusplus/Website/main/static/libafl_logo.svg" alt="Logo LibAFL" width="250" heigh="250">
Bibliothèque de Fuzzing Avancée - Assemblez vos propres fuzzers et étendez leurs fonctionnalités avec Rust.
`LibAFL` est une collection de morceaux réutilisables de fuzzers, écrite en Rust, qui offre de nombreux avantages d'un fuzzer prêt à l'emploi, tout en étant entièrement personnalisable.
Certaines fonctionnalités marquantes incluent actuellement :
- `rapide` : Nous faisons tout notre possible au moment de la compilation, minimisant la surcharge à l'exécution. Les utilisateurs atteignent 120k execs/sec en mode frida sur un téléphone (en utilisant tous les cœurs).
- `évolutif` : `Low Level Message Passing`, `LLMP` en abrégé, permet à `LibAFL` de s'adapter presque linéairement sur les cœurs, et via TCP à plusieurs machines.
- `adaptable` : Vous pouvez remplacer chaque partie de `LibAFL`. Par exemple, `BytesInput` n'est qu'une forme possible d'entrée :
n'hésitez pas à ajouter une entrée basée sur AST pour le fuzzing structuré, et plus encore.
- `multi-plateforme` : `LibAFL` fonctionne sur *Windows*, *macOS*, *iOS*, *Linux* et *Android*, et plus encore. `LibAFL` peut être compilé en mode `no_std` pour injecter `LibAFL` dans des cibles obscures comme les appareils embarqués et les hyperviseurs.
- `apportez votre propre cible` : Nous supportons les modes binaires uniquement, comme Frida-Mode, ainsi que plusieurs passes de compilation pour l'instrumentation basée sur le code source. Bien sûr, il est facile d'ajouter des backends d'instrumentation personnalisés.
## Concepts fondamentaux
`LibAFL` est rapide, multi-plateforme, compatible `no_std`, et s'adapte sur les cœurs et les machines. Il propose une crate principale qui fournit des blocs de construction pour des fuzzers personnalisés, [libafl](https://github.com/aflplusplus/libafl/blob/main/crates/libafl), une bibliothèque contenant du code commun pouvant être utilisé pour l'instrumentation de cibles, [libafl_targets](https://github.com/aflplusplus/libafl/blob/main/crates/libafl_targets), et une bibliothèque fournissant des outils pour encapsuler des compilateurs, [libafl_cc](https://github.com/aflplusplus/libafl/blob/main/crates/libafl_cc). Il offre des intégrations avec des frameworks d'instrumentation populaires. Actuellement, les backends supportés sont :
- `SanitizerCoverage`, dans [libafl_targets](https://github.com/aflplusplus/libafl/blob/main/crates/libafl_targets)
- `Frida`, dans [libafl_frida](https://github.com/aflplusplus/libafl/blob/main/crates/libafl_frida)
- `QEMU` en mode utilisateur et système, incluant des hooks pour l'émulation, dans [libafl_qemu](https://github.com/aflplusplus/libafl/blob/main/crates/libafl_qemu)
- `TinyInst`, dans [libafl_tinyinst](https://github.com/aflplusplus/libafl/blob/main/crates/libafl_tinyinst) par [elbiazo](https://github.com/elbiazo)
## Construction et installation
#### Installer les dépendances
- **Le langage de développement Rust**
- Nous recommandons vivement de *ne pas* utiliser par exemple le paquet de votre distribution Linux car il est probablement obsolète. Installez plutôt Rust directement, les instructions se trouvent [ici](https://www.rust-lang.org/tools/install).
- La version minimale supportée de Rust est définie. Vous pouvez toujours vérifier la version actuellement requise dans le [Cargo.toml](https://github.com/AFLplusplus/LibAFL/blob/main/crates/libafl/Cargo.toml) de LibAFL :
Si votre version installée de Rust est plus ancienne que celle listée dans Cargo.toml, mettez à jour vers la dernière toolchain stable :
```bash
rustup update stable
```
- **Outils LLVM**
- Les outils LLVM (incluant clang, clang++) sont nécessaires (plus récents que LLVM 15.0.0 jusqu'à LLVM 18.1.3). Si vous utilisez Debian/Ubuntu, encore une fois, nous recommandons vivement d'installer le paquet depuis [ici](https://apt.llvm.org/)
- Just :
- Nous utilisons [just](https://github.com/casey/just) pour construire les fuzzers dans le répertoire `fuzzers/`. Vous trouverez les instructions pour l'installer dans votre environnement [dans le Manuel du Programmeur Just](https://just.systems/man/en/packages.html).
#### Cloner le dépôt `LibAFL` avec
```sh
git clone https://github.com/AFLplusplus/LibAFL
```
#### Construire la bibliothèque avec
```sh
cargo build --release
```
#### Construire la documentation de l'API avec
```sh
cargo doc
```
#### Parcourir le livre `LibAFL` (en cours !) avec (nécessite [mdbook](https://rust-lang.github.io/mdBook/index.html))
```sh
cd docs && mdbook serve
```
## Pour commencer
Nous rassemblons tous les exemples de fuzzers dans [`./fuzzers`](https://github.com/aflplusplus/libafl/blob/main/fuzzers).
Assurez-vous de lire leur documentation (et leur code source), c'est *la manière naturelle de commencer !*
```sh
just run
```
Vous pouvez exécuter chaque exemple de fuzzer avec cette commande, tant que le répertoire du fuzzer contient un fichier `Justfile`. Le fuzzer le mieux testé est [`./fuzzers/inprocess/libfuzzer_libpng`](https://github.com/aflplusplus/libafl/blob/main/fuzzers/inprocess/libfuzzer_libpng), un fuzzer multicœur de type libfuzzer utilisant `LibAFL` pour un harnais libpng.
### Ressources
- [Guide d'installation](https://github.com/aflplusplus/libafl/blob/main/docs/src/getting_started/setup.md)
- [Documentation de l'API en ligne](https://docs.rs/libafl/)
- Le livre `LibAFL` (en cours) [en ligne](https://aflplus.plus/libafl-book) ou dans le [dépôt](https://github.com/aflplusplus/libafl/blob/main/docs/src)
- Notre article de recherche [papier](https://www.s3.eurecom.fr/docs/ccs22_fioraldi.pdf)
- Notre présentation RC3 [vidéo](http://www.youtube.com/watch?v=3RWkT1Q5IV0 "Fuzzers Like LEGO") expliquant les concepts fondamentaux
- Notre présentation Fuzzcon Europe [vidéo](https://www.youtube.com/watch?v=PWB8GIhFAaI "LibAFL: The Advanced Fuzzing Library") avec une discussion (un peu mais pas trop obsolète) étape par étape sur la construction de quelques exemples de fuzzers
- Les solutions Fuzzing101 [solutions](https://github.com/epi052/fuzzing-101-solutions) & série d'articles de blog [articles de blog](https://epi052.gitlab.io/notes-to-self/blog/2021-11-01-fuzzing-101-with-libafl/) par [epi](https://github.com/epi052)
- Article de blog sur le fuzzing binaire uniquement avec la lib `libaf_qemu`, [Hacking TMNF - Fuzzing the game server](https://blog.bricked.tech/posts/tmnf/part1/), par [RickdeJager](https://github.com/RickdeJager).
- [Un atelier d'introduction à LibAFL](https://www.atredis.com/blog/2023/12/4/a-libafl-introductory-workshop), par [Jordan Whitehead](https://github.com/jordan9001)
## Contributeurs
`LibAFL` est écrit et maintenu par
- [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]>
## Contribuer
Veuillez consulter **[CONTRIBUTING.md](https://github.com/aflplusplus/libafl/blob/main/CONTRIBUTING.md)** pour les directives de contribution.
## Débogage
Votre fuzzer ne fonctionne pas comme prévu ? Essayez de lire [DEBUGGING.md](https://github.com/aflplusplus/libafl/blob/main/docs/src/DEBUGGING.md) pour comprendre comment déboguer vos problèmes.
## Citation
Si vous utilisez `LibAFL` pour vos travaux académiques, veuillez citer l'article suivant :
```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},
}
```
## Licence
<sup>
Sous licence soit <a href="https://github.com/aflplusplus/libafl/blob/main/LICENSE-APACHE">Apache License, Version
2.0</a> soit <a href="https://github.com/aflplusplus/libafl/blob/main/LICENSE-MIT">licence MIT</a> à votre choix.
</sup>
<br>
<sub>
Sauf indication contraire explicite de votre part, toute contribution soumise intentionnellement
pour inclusion dans cette crate par vous, telle que définie dans la licence Apache-2.0, sera
double licenciée comme ci-dessus, sans aucune condition supplémentaire.
</sub>