Erweiterte Fuzzing-Bibliothek - Stecken Sie Ihren Fuzzer in Rust zusammen! Skaliert über Kerne und Maschinen hinweg. Für Windows, Android, macOS, Linux, no_std, ...
# `LibAFL`, die Fuzzer-Bibliothek
<img align="right" src="https://raw.githubusercontent.com/AFLplusplus/Website/main/static/libafl_logo.svg" alt="LibAFL logo" width="250" heigh="250">
Erweiterte Fuzzing-Bibliothek – Setzen Sie Ihre eigenen Fuzzer zusammen und erweitern Sie ihre Funktionen mit Rust.
`LibAFL` ist eine Sammlung wiederverwendbarer Fuzzer-Komponenten, geschrieben in Rust. Es bietet Ihnen viele Vorteile eines vorgefertigten Fuzzers, ist aber gleichzeitig vollständig anpassbar.
Einige derzeitige Highlights sind:
- `schnell`: Wir tun alles, was wir zur Kompilierzeit können, um den Laufzeit-Overhead minimal zu halten. Benutzer erreichen 120k Execs/Sek. im Frida-Modus auf einem Telefon (alle Kerne).
- `skalierbar`: `Low Level Message Passing`, kurz `LLMP`, ermöglicht `LibAFL`, nahezu linear über Kerne und über TCP auf mehrere Maschinen zu skalieren.
- `anpassbar`: Sie können jeden Teil von `LibAFL` ersetzen. Zum Beispiel ist `BytesInput` nur eine mögliche Form von Eingabe: Sie können gerne eine AST-basierte Eingabe für strukturiertes Fuzzing hinzufügen und mehr.
- `plattformübergreifend`: `LibAFL` läuft unter *Windows*, *macOS*, *iOS*, *Linux* und *Android* und mehr. `LibAFL` kann im `no_std`-Modus erstellt werden, um `LibAFL` in obskure Ziele wie eingebettete Geräte und Hypervisoren zu injizieren.
- `eigenes Ziel mitbringen`: Wir unterstützen reine Binärmodi wie den Frida-Modus sowie mehrere Kompilierdurchgänge für quellbasierte Instrumentierung. Natürlich ist es einfach, benutzerdefinierte Instrumentierungs-Backends hinzuzufügen.
## Kernkonzepte
`LibAFL` ist schnell, plattformübergreifend, mit `no_std` kompatibel und skaliert über Kerne und Maschinen. Es bietet eine Haupt-Crate, die Bausteine für benutzerdefinierte Fuzzer bereitstellt, [libafl](https://github.com/aflplusplus/libafl/blob/main/crates/libafl), eine Bibliothek, die allgemeinen Code für die Zielinstrumentierung enthält, [libafl_targets](https://github.com/aflplusplus/libafl/blob/main/crates/libafl_targets), und eine Bibliothek, die Werkzeuge zum Einwickeln von Compilern bereitstellt, [libafl_cc](https://github.com/aflplusplus/libafl/blob/main/crates/libafl_cc). Es bietet Integrationen mit gängigen Instrumentierungs-Frameworks. Derzeit werden folgende Backends unterstützt:
- `SanitizerCoverage`, in [libafl_targets](https://github.com/aflplusplus/libafl/blob/main/crates/libafl_targets)
- `Frida`, in [libafl_frida](https://github.com/aflplusplus/libafl/blob/main/crates/libafl_frida)
- `QEMU` im Benutzermodus und Systemmodus, einschließlich Hooks für Emulation, in [libafl_qemu](https://github.com/aflplusplus/libafl/blob/main/crates/libafl_qemu)
- `TinyInst`, in [libafl_tinyinst](https://github.com/aflplusplus/libafl/blob/main/crates/libafl_tinyinst) von [elbiazo](https://github.com/elbiazo)
## Bauen und Installieren
#### Abhängigkeiten installieren
- **Die Rust-Entwicklungssprache**
- Wir empfehlen dringend, *nicht* z.B. das Paket Ihrer Linux-Distribution zu verwenden, da dieses wahrscheinlich veraltet ist. Installieren Sie Rust daher direkt; Anweisungen finden Sie [hier](https://www.rust-lang.org/tools/install).
- Die minimal unterstützte Rust-Version ist definiert. Sie können die aktuell benötigte Version in LibAFLs [Cargo.toml](https://github.com/AFLplusplus/LibAFL/blob/main/crates/libafl/Cargo.toml) überprüfen:
Wenn Ihre installierte Rust-Version älter ist als die in Cargo.toml aufgeführte, aktualisieren Sie auf die neueste stabile Toolchain:
```bash
rustup update stable
```
- **LLVM-Werkzeuge**
- Die LLVM-Werkzeuge (einschließlich clang, clang++) werden benötigt (neuer als LLVM 15.0.0 bis LLVM 18.1.3). Wenn Sie Debian/Ubuntu verwenden, empfehlen wir auch hier dringend, das Paket von [hier](https://apt.llvm.org/) zu installieren.
- Just:
- Wir verwenden [just](https://github.com/casey/just), um die Fuzzer im `fuzzers/`-Verzeichnis zu bauen. Installationsanweisungen für Ihre Umgebung finden Sie [im Just Programmer's Manual](https://just.systems/man/en/packages.html).
#### Klonen Sie das `LibAFL`-Repository mit
```sh
git clone https://github.com/AFLplusplus/LibAFL
```
#### Bauen Sie die Bibliothek mit
```sh
cargo build --release
```
#### Bauen Sie die API-Dokumentation mit
```sh
cargo doc
```
#### Durchsuchen Sie das `LibAFL`-Buch (WIP!) mit (erfordert [mdbook](https://rust-lang.github.io/mdBook/index.html))
```sh
cd docs && mdbook serve
```
## Erste Schritte
Wir sammeln alle Beispiel-Fuzzer in [`./fuzzers`](https://github.com/aflplusplus/libafl/blob/main/fuzzers). Lesen Sie unbedingt deren Dokumentation (und Quellcode), das ist *der natürliche Weg, um loszulegen!*
```sh
just run
```
Sie können jeden Beispiel-Fuzzer mit dem folgenden Befehl ausführen, solange das Fuzzer-Verzeichnis eine `Justfile`-Datei enthält. Der am besten getestete Fuzzer ist [`./fuzzers/inprocess/libfuzzer_libpng`](https://github.com/aflplusplus/libafl/blob/main/fuzzers/inprocess/libfuzzer_libpng), ein Multicore-Fuzzer ähnlich wie libfuzzer, der `LibAFL` für ein libpng-Harness verwendet.
### Ressourcen
- [Installationsanleitung](https://github.com/aflplusplus/libafl/blob/main/docs/src/getting_started/setup.md)
- [Online-API-Dokumentation](https://docs.rs/libafl/)
- Das `LibAFL`-Buch (WIP) [online](https://aflplus.plus/libafl-book) oder im [Repository](https://github.com/aflplusplus/libafl/blob/main/docs/src)
- Unser Forschungs[paper](https://www.s3.eurecom.fr/docs/ccs22_fioraldi.pdf)
- Unser RC3-[Vortrag](http://www.youtube.com/watch?v=3RWkT1Q5IV0 "Fuzzers Like LEGO"), der die Kernkonzepte erklärt
- Unser Fuzzcon Europe-[Vortrag](https://www.youtube.com/watch?v=PWB8GIhFAaI "LibAFL: The Advanced Fuzzing Library") mit einer (etwas, aber nicht allzu veralteten) Schritt-für-Schritt-Anleitung zum Bauen einiger Beispiel-Fuzzer
- Die Fuzzing101-[Lösungen](https://github.com/epi052/fuzzing-101-solutions) und Blog[serie](https://epi052.gitlab.io/notes-to-self/blog/2021-11-01-fuzzing-101-with-libafl/) von [epi](https://github.com/epi052)
- Blogbeitrag über die reine Binär-Fuzzing-Bibliothek `libaf_qemu`, [Hacking TMNF – Fuzzing the game server](https://blog.bricked.tech/posts/tmnf/part1/), von [RickdeJager](https://github.com/RickdeJager).
- [Ein Einführungsworkshop zu LibAFL](https://www.atredis.com/blog/2023/12/4/a-libafl-introductory-workshop), von [Jordan Whitehead](https://github.com/jordan9001)
## Mitwirkende
`LibAFL` wird geschrieben und gewartet von
- [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]>
## Beitragen
Bitte lesen Sie **[CONTRIBUTING.md](https://github.com/aflplusplus/libafl/blob/main/CONTRIBUTING.md)** für die Richtlinien zum Beitragen.
## Debugging
Funktioniert Ihr Fuzzer nicht wie erwartet? Lesen Sie [DEBUGGING.md](https://github.com/aflplusplus/libafl/blob/main/docs/src/DEBUGGING.md), um zu verstehen, wie Sie Ihre Probleme debuggen können.
## Zitieren
Wenn Sie `LibAFL` für Ihre akademische Arbeit verwenden, zitieren Sie bitte das folgende Paper:
```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},
}
```
## Lizenz
<sup>
Lizenziert unter entweder der <a href="https://github.com/aflplusplus/libafl/blob/main/LICENSE-APACHE">Apache License, Version 2.0</a> oder der <a href="https://github.com/aflplusplus/libafl/blob/main/LICENSE-MIT">MIT-Lizenz</a>, je nach Ihrer Wahl.
</sup>
<br>
<sub>
Sofern Sie nicht ausdrücklich etwas anderes angeben, wird jeder von Ihnen absichtlich zur Aufnahme in diese Crate eingereichte Beitrag, wie in der Apache-2.0-Lizenz definiert, wie oben dual lizenziert, ohne zusätzliche Bedingungen.
</sub>