
LibAFL v0.16.0
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
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, kurzLLMP, ermöglichtLibAFL, nahezu linear über Kerne und über TCP auf mehrere Maschinen zu skalieren.anpassbar: Sie können jeden Teil vonLibAFLersetzen. Zum Beispiel istBytesInputnur eine mögliche Form von Eingabe: Sie können gerne eine AST-basierte Eingabe für strukturiertes Fuzzing hinzufügen und mehr.plattformübergreifend:LibAFLläuft unter Windows, macOS, iOS, Linux und Android und mehr.LibAFLkann imno_std-Modus erstellt werden, umLibAFLin 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, eine Bibliothek, die allgemeinen Code für die Zielinstrumentierung enthält, libafl_targets, und eine Bibliothek, die Werkzeuge zum Einwickeln von Compilern bereitstellt, libafl_cc. Es bietet Integrationen mit gängigen Instrumentierungs-Frameworks. Derzeit werden folgende Backends unterstützt:
SanitizerCoverage, in libafl_targetsFrida, in libafl_fridaQEMUim Benutzermodus und Systemmodus, einschließlich Hooks für Emulation, in libafl_qemuTinyInst, in libafl_tinyinst von 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.
-
Die minimal unterstützte Rust-Version ist definiert. Sie können die aktuell benötigte Version in LibAFLs 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:
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 zu installieren.
- Just:
- Wir verwenden just, um die Fuzzer im
fuzzers/-Verzeichnis zu bauen. Installationsanweisungen für Ihre Umgebung finden Sie im Just Programmer's Manual.
- Wir verwenden just, um die Fuzzer im
Klonen Sie das LibAFL-Repository mit
git clone https://github.com/AFLplusplus/LibAFL
Bauen Sie die Bibliothek mit
cargo build --release
Bauen Sie die API-Dokumentation mit
cargo doc
Durchsuchen Sie das LibAFL-Buch (WIP!) mit (erfordert mdbook)
cd docs && mdbook serve
Erste Schritte
Wir sammeln alle Beispiel-Fuzzer in ./fuzzers. Lesen Sie unbedingt deren Dokumentation (und Quellcode), das ist der natürliche Weg, um loszulegen!
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, ein Multicore-Fuzzer ähnlich wie libfuzzer, der LibAFL für ein libpng-Harness verwendet.
Ressourcen
- Installationsanleitung
- Online-API-Dokumentation
- Das
LibAFL-Buch (WIP) online oder im Repository - Unser Forschungspaper
- Unser RC3-Vortrag, der die Kernkonzepte erklärt
- Unser Fuzzcon Europe-Vortrag mit einer (etwas, aber nicht allzu veralteten) Schritt-für-Schritt-Anleitung zum Bauen einiger Beispiel-Fuzzer
- Die Fuzzing101-Lösungen und Blogserie von epi
- Blogbeitrag über die reine Binär-Fuzzing-Bibliothek
libaf_qemu, Hacking TMNF – Fuzzing the game server, von RickdeJager. - Ein Einführungsworkshop zu LibAFL, von Jordan Whitehead
Mitwirkende
LibAFL wird geschrieben und gewartet von
- Andrea Fioraldi [email protected]
- Dominik Maier [email protected]
- s1341 [email protected]
- Dongjia Zhang [email protected]
- Addison Crump [email protected]
- Romain Malmain [email protected]
Beitragen
Bitte lesen Sie CONTRIBUTING.md für die Richtlinien zum Beitragen.
Debugging
Funktioniert Ihr Fuzzer nicht wie erwartet? Lesen Sie 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:
@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
Lizenziert unter entweder der Apache License, Version 2.0 oder der MIT-Lizenz, je nach Ihrer Wahl.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.