
LibAFL v0.16.0
Продвинутая библиотека для фаззинга - Соберите свой фаззер на Rust! Масштабируется на несколько ядер и машин. Для Windows, Android, MacOS, Linux, no_std, ...
LibAFL, библиотека для фаззинга
Продвинутая библиотека для фаззинга — собирайте собственные фаззеры и расширяйте их возможности с помощью Rust.
LibAFL — это набор переиспользуемых компонентов фаззеров, написанный на Rust, который предоставляет многие преимущества готового фаззера, оставаясь при этом полностью настраиваемым.
Некоторые ключевые особенности включают:
fast: мы делаем всё возможное на этапе компиляции, сводя к минимуму накладные расходы во время выполнения. Пользователи достигают 120k execs/sec в режиме frida на телефоне (используя все ядра).scalable:Low Level Message Passing(сокращённоLLMP) позволяетLibAFLмасштабироваться почти линейно на ядрах и через TCP на множество машин.adaptable: вы можете заменить любую частьLibAFL. Например,BytesInput— это лишь одна из возможных форм входных данных: не стесняйтесь добавлять входные данные на основе AST для структурированного фаззинга и многое другое.multi platform:LibAFLработает на Windows, macOS, iOS, Linux, Android и других платформах.LibAFLможет быть собран в режимеno_stdдля внедрения в редкие цели, такие как встраиваемые устройства и гипервизоры.bring your own target: мы поддерживаем режимы только с бинарными файлами, такие как Frida-Mode, а также несколько этапов компиляции для инструментирования на основе исходного кода. Конечно, легко добавить пользовательские бэкенды инструментирования.
Основные концепции
LibAFL быстрый, кроссплатформенный, совместимый с no_std и масштабируется на ядра и машины. Он предлагает основной крейт, предоставляющий строительные блоки для пользовательских фаззеров: libafl, библиотеку, содержащую общий код, который может использоваться для инструментирования целей: libafl_targets, и библиотеку, предоставляющую средства для обёртывания компиляторов: libafl_cc. Он предлагает интеграции с популярными фреймворками инструментирования. На данный момент поддерживаются следующие бэкенды:
SanitizerCoverage, в libafl_targetsFrida, в libafl_fridaQEMUв пользовательском и системном режиме, включая хуки для эмуляции, в libafl_qemuTinyInst, в libafl_tinyinst от elbiazo
Сборка и установка
Установка зависимостей
- Язык разработки Rust
-
Мы настоятельно рекомендуем не использовать, например, пакет из вашего дистрибутива Linux, так как он, скорее всего, устарел. Вместо этого установите Rust напрямую, инструкции можно найти здесь.
-
Минимальная поддерживаемая версия Rust определена. Вы всегда можете проверить текущую требуемую версию в Cargo.toml LibAFL:
rustup update stable
-
- Инструменты LLVM
- Инструменты LLVM (включая clang, clang++) необходимы (новее LLVM 15.0.0 до LLVM 18.1.3). Если вы используете Debian/Ubuntu, мы снова настоятельно рекомендуем установить пакет отсюда
- Just:
- Мы используем just для сборки фаззеров в каталоге
fuzzers/. Инструкции по установке в вашем окружении можно найти в руководстве программиста Just.
- Мы используем just для сборки фаззеров в каталоге
Клонирование репозитория LibAFL
git clone https://github.com/AFLplusplus/LibAFL
Сборка библиотеки с помощью
cargo build --release
Сборка документации API с помощью
cargo doc
Просмотр книги LibAFL (в разработке!) с помощью (требуется mdbook)
cd docs && mdbook serve
Начало работы
Мы собрали все примеры фаззеров в ./fuzzers. Обязательно прочитайте их документацию (и исходный код) — это естественный способ начать работу!
just run
Вы можете запустить каждый пример фаззера с помощью следующей команды, если в каталоге фаззера есть файл Justfile. Наиболее протестированный фаззер — ./fuzzers/inprocess/libfuzzer_libpng, многопоточный фаззер, похожий на libfuzzer, использующий LibAFL для обвязки libpng.
Ресурсы
- Руководство по установке
- Онлайн-документация API
- Книга
LibAFL(в разработке) онлайн или в репозитории - Наша исследовательская статья
- Наше выступление на RC3 talk с объяснением основных концепций
- Наше выступление на Fuzzcon Europe talk с (немного, но не слишком устаревшим) пошаговым обсуждением создания некоторых примеров фаззеров
- Решения Fuzzing101 и серия блог-постов от epi
- Пост в блоге о библиотеке для фаззинга только бинарников
libaf_qemu: Hacking TMNF - Fuzzing the game server, от RickdeJager - Вводный семинар по LibAFL, от Jordan Whitehead
Авторы
LibAFL написан и поддерживается
- Andrea Fioraldi [email protected]
- Dominik Maier [email protected]
- s1341 [email protected]
- Dongjia Zhang [email protected]
- Addison Crump [email protected]
- Romain Malmain [email protected]
Вклад в развитие
Пожалуйста, ознакомьтесь с CONTRIBUTING.md для получения руководства по внесению вклада.
Отладка
Ваш фаззер работает не так, как ожидалось? Попробуйте прочитать DEBUGGING.md, чтобы понять, как отлаживать ваши проблемы.
Цитирование
Если вы используете LibAFL в своей академической работе, пожалуйста, процитируйте следующую статью:
@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},
}
Лицензия
Лицензировано на условиях Apache License, Version 2.0 или лицензии MIT по вашему выбору.Если явно не указано иное, любой вклад, намеренно предоставленный вами для включения в этот крейт, как определено в лицензии Apache-2.0, будет двойным лицензирован, как указано выше, без каких-либо дополнительных условий.