Продвинутая библиотека для фаззинга - Соберите свой фаззер на Rust! Масштабируется на несколько ядер и машин. Для Windows, Android, MacOS, Linux, no_std, ...
# `LibAFL`, библиотека для фаззинга
<img align="right" src="https://raw.githubusercontent.com/AFLplusplus/Website/main/static/libafl_logo.svg" alt="Логотип LibAFL" width="250" heigh="250">
Продвинутая библиотека для фаззинга — собирайте собственные фаззеры и расширяйте их возможности с помощью 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](https://github.com/aflplusplus/libafl/blob/main/crates/libafl), библиотеку, содержащую общий код, который может использоваться для инструментирования целей: [libafl_targets](https://github.com/aflplusplus/libafl/blob/main/crates/libafl_targets), и библиотеку, предоставляющую средства для обёртывания компиляторов: [libafl_cc](https://github.com/aflplusplus/libafl/blob/main/crates/libafl_cc). Он предлагает интеграции с популярными фреймворками инструментирования. На данный момент поддерживаются следующие бэкенды:
- `SanitizerCoverage`, в [libafl_targets](https://github.com/aflplusplus/libafl/blob/main/crates/libafl_targets)
- `Frida`, в [libafl_frida](https://github.com/aflplusplus/libafl/blob/main/crates/libafl_frida)
- `QEMU` в пользовательском и системном режиме, включая хуки для эмуляции, в [libafl_qemu](https://github.com/aflplusplus/libafl/blob/main/crates/libafl_qemu)
- `TinyInst`, в [libafl_tinyinst](https://github.com/aflplusplus/libafl/blob/main/crates/libafl_tinyinst) от [elbiazo](https://github.com/elbiazo)
## Сборка и установка
#### Установка зависимостей
- **Язык разработки Rust**
- Мы настоятельно рекомендуем *не* использовать, например, пакет из вашего дистрибутива Linux, так как он, скорее всего, устарел. Вместо этого установите Rust напрямую, инструкции можно найти [здесь](https://www.rust-lang.org/tools/install).
- Минимальная поддерживаемая версия Rust определена. Вы всегда можете проверить текущую требуемую версию в [Cargo.toml](https://github.com/AFLplusplus/LibAFL/blob/main/crates/libafl/Cargo.toml) LibAFL:
```bash
rustup update stable
```
- **Инструменты LLVM**
- Инструменты LLVM (включая clang, clang++) необходимы (новее LLVM 15.0.0 до LLVM 18.1.3). Если вы используете Debian/Ubuntu, мы снова настоятельно рекомендуем установить пакет [отсюда](https://apt.llvm.org/)
- Just:
- Мы используем [just](https://github.com/casey/just) для сборки фаззеров в каталоге `fuzzers/`. Инструкции по установке в вашем окружении можно найти [в руководстве программиста Just](https://just.systems/man/en/packages.html).
#### Клонирование репозитория `LibAFL`
```sh
git clone https://github.com/AFLplusplus/LibAFL
```
#### Сборка библиотеки с помощью
```sh
cargo build --release
```
#### Сборка документации API с помощью
```sh
cargo doc
```
#### Просмотр книги `LibAFL` (в разработке!) с помощью (требуется [mdbook](https://rust-lang.github.io/mdBook/index.html))
```sh
cd docs && mdbook serve
```
## Начало работы
Мы собрали все примеры фаззеров в [`./fuzzers`](https://github.com/aflplusplus/libafl/blob/main/fuzzers). Обязательно прочитайте их документацию (и исходный код) — это *естественный способ начать работу!*
```sh
just run
```
Вы можете запустить каждый пример фаззера с помощью следующей команды, если в каталоге фаззера есть файл `Justfile`. Наиболее протестированный фаззер — [`./fuzzers/inprocess/libfuzzer_libpng`](https://github.com/aflplusplus/libafl/blob/main/fuzzers/inprocess/libfuzzer_libpng), многопоточный фаззер, похожий на libfuzzer, использующий `LibAFL` для обвязки libpng.
### Ресурсы
- [Руководство по установке](https://github.com/aflplusplus/libafl/blob/main/docs/src/getting_started/setup.md)
- [Онлайн-документация API](https://docs.rs/libafl/)
- Книга `LibAFL` (в разработке) [онлайн](https://aflplus.plus/libafl-book) или в [репозитории](https://github.com/aflplusplus/libafl/blob/main/docs/src)
- Наша исследовательская [статья](https://www.s3.eurecom.fr/docs/ccs22_fioraldi.pdf)
- Наше выступление на RC3 [talk](http://www.youtube.com/watch?v=3RWkT1Q5IV0 "Фаззеры как LEGO") с объяснением основных концепций
- Наше выступление на Fuzzcon Europe [talk](https://www.youtube.com/watch?v=PWB8GIhFAaI "LibAFL: Продвинутая библиотека для фаззинга") с (немного, но не слишком устаревшим) пошаговым обсуждением создания некоторых примеров фаззеров
- [Решения](https://github.com/epi052/fuzzing-101-solutions) Fuzzing101 и серия [блог-постов](https://epi052.gitlab.io/notes-to-self/blog/2021-11-01-fuzzing-101-with-libafl/) от [epi](https://github.com/epi052)
- Пост в блоге о библиотеке для фаззинга только бинарников `libaf_qemu`: [Hacking TMNF - Fuzzing the game server](https://blog.bricked.tech/posts/tmnf/part1/), от [RickdeJager](https://github.com/RickdeJager)
- [Вводный семинар по LibAFL](https://www.atredis.com/blog/2023/12/4/a-libafl-introductory-workshop), от [Jordan Whitehead](https://github.com/jordan9001)
## Авторы
`LibAFL` написан и поддерживается
- [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]>
## Вклад в развитие
Пожалуйста, ознакомьтесь с **[CONTRIBUTING.md](https://github.com/aflplusplus/libafl/blob/main/CONTRIBUTING.md)** для получения руководства по внесению вклада.
## Отладка
Ваш фаззер работает не так, как ожидалось? Попробуйте прочитать [DEBUGGING.md](https://github.com/aflplusplus/libafl/blob/main/docs/src/DEBUGGING.md), чтобы понять, как отлаживать ваши проблемы.
## Цитирование
Если вы используете `LibAFL` в своей академической работе, пожалуйста, процитируйте следующую статью:
```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},
}
```
## Лицензия
<sup>
Лицензировано на условиях <a href="https://github.com/aflplusplus/libafl/blob/main/LICENSE-APACHE">Apache License, Version 2.0</a> или <a href="https://github.com/aflplusplus/libafl/blob/main/LICENSE-MIT">лицензии MIT</a> по вашему выбору.
</sup>
<br>
<sub>
Если явно не указано иное, любой вклад, намеренно предоставленный вами для включения в этот крейт, как определено в лицензии Apache-2.0, будет двойным лицензирован, как указано выше, без каких-либо дополнительных условий.
</sub>