Biblioteca Avançada de Fuzzing - Monte seu Fuzzer em Rust! Escala em núcleos e máquinas. Para Windows, Android, MacOS, Linux, no_std, ...
# `LibAFL`, a biblioteca de fuzzing
<img align="right" src="https://raw.githubusercontent.com/AFLplusplus/Website/main/static/libafl_logo.svg" alt="LibAFL logo" width="250" heigh="250">
Biblioteca Avançada de Fuzzing - Monte seus próprios fuzzers e estenda seus recursos usando Rust.
`LibAFL` é uma coleção de peças reutilizáveis de fuzzers, escrita em Rust, que fornece muitos dos benefícios de um fuzzer pronto para uso, sendo completamente personalizável.
Algumas funcionalidades de destaque atualmente incluem:
- `rápido`: Fazemos tudo que podemos em tempo de compilação, mantendo a sobrecarga em tempo de execução mínima. Usuários atingem 120k execuções/seg em modo frida em um telefone (usando todos os núcleos).
- `escalável`: `Low Level Message Passing`, `LLMP` para abreviar, permite que `LibAFL` escale quase linearmente entre núcleos, e via TCP para várias máquinas.
- `adaptável`: Você pode substituir cada parte do `LibAFL`. Por exemplo, `BytesInput` é apenas uma forma potencial de entrada:
sinta-se à vontade para adicionar uma entrada baseada em AST para fuzzing estruturado, e mais.
- `multiplataforma`: `LibAFL` roda em *Windows*, *macOS*, *iOS*, *Linux* e *Android*, e mais. `LibAFL` pode ser construído em modo `no_std` para injetar `LibAFL` em alvos obscuros como dispositivos embarcados e hipervisores.
- `traga seu próprio alvo`: Suportamos modos somente binário, como Frida-Mode, bem como múltiplas passagens de compilação para instrumentação baseada em código-fonte. Claro que é fácil adicionar backends de instrumentação personalizados.
## Conceitos principais
`LibAFL` é rápido, multiplataforma, compatível com `no_std` e escala entre núcleos e máquinas. Ele oferece um crate principal que fornece blocos de construção para fuzzers personalizados, [libafl](https://github.com/aflplusplus/libafl/blob/main/crates/libafl), uma biblioteca contendo código comum que pode ser usado para instrumentação de alvos, [libafl_targets](https://github.com/aflplusplus/libafl/blob/main/crates/libafl_targets), e uma biblioteca que fornece facilidades para envolver compiladores, [libafl_cc](https://github.com/aflplusplus/libafl/blob/main/crates/libafl_cc). Ele oferece integrações com frameworks de instrumentação populares. No momento, os backends suportados são:
- `SanitizerCoverage`, em [libafl_targets](https://github.com/aflplusplus/libafl/blob/main/crates/libafl_targets)
- `Frida`, em [libafl_frida](https://github.com/aflplusplus/libafl/blob/main/crates/libafl_frida)
- `QEMU` modo usuário e modo sistema, incluindo hooks para emulação, em [libafl_qemu](https://github.com/aflplusplus/libafl/blob/main/crates/libafl_qemu)
- `TinyInst`, em [libafl_tinyinst](https://github.com/aflplusplus/libafl/blob/main/crates/libafl_tinyinst) por [elbiazo](https://github.com/elbiazo)
## Construindo e instalando
#### Instale as Dependências
- **A linguagem de desenvolvimento Rust**
- Recomendamos fortemente *não* usar, por exemplo, o pacote da sua distribuição Linux, pois provavelmente está desatualizado. Portanto, instale o Rust diretamente, instruções podem ser encontradas [aqui](https://www.rust-lang.org/tools/install).
- A versão mínima suportada do Rust está definida. Você pode sempre verificar a versão atualmente requerida no [Cargo.toml](https://github.com/AFLplusplus/LibAFL/blob/main/crates/libafl/Cargo.toml) do LibAFL:
Se a sua versão instalada do Rust for mais antiga que a listada no Cargo.toml, atualize para o toolchain estável mais recente:
```bash
rustup update stable
```
- **Ferramentas LLVM**
- As ferramentas LLVM (incluindo clang, clang++) são necessárias (mais recentes que LLVM 15.0.0 até LLVM 18.1.3). Se você está usando Debian/Ubuntu, novamente, recomendamos fortemente que instale o pacote a partir [daqui](https://apt.llvm.org/)
- Just:
- Usamos [just](https://github.com/casey/just) para construir os fuzzers no diretório `fuzzers/`. Você pode encontrar instruções para instalá-lo no seu ambiente [no Manual do Programador Just](https://just.systems/man/en/packages.html).
#### Clone o repositório `LibAFL` com
```sh
git clone https://github.com/AFLplusplus/LibAFL
```
#### Construa a biblioteca usando
```sh
cargo build --release
```
#### Construa a documentação da API com
```sh
cargo doc
```
#### Navegue pelo livro `LibAFL` (em andamento!) com (requer [mdbook](https://rust-lang.github.io/mdBook/index.html))
```sh
cd docs && mdbook serve
```
## Primeiros passos
Coletamos todos os fuzzers de exemplo em [`./fuzzers`](https://github.com/aflplusplus/libafl/blob/main/fuzzers).
Certifique-se de ler a documentação (e o código fonte), esta é *a maneira natural de começar!*
```sh
just run
```
Você pode executar cada fuzzer de exemplo com o seguinte comando, desde que o diretório do fuzzer tenha um arquivo `Justfile`. O fuzzer mais bem testado é [`./fuzzers/inprocess/libfuzzer_libpng`](https://github.com/aflplusplus/libafl/blob/main/fuzzers/inprocess/libfuzzer_libpng), um fuzzer multicore semelhante ao libfuzzer usando `LibAFL` para um harness libpng.
### Recursos
- [Guia de instalação](https://github.com/aflplusplus/libafl/blob/main/docs/src/getting_started/setup.md)
- [Documentação da API online](https://docs.rs/libafl/)
- O livro `LibAFL` (em andamento) [online](https://aflplus.plus/libafl-book) ou no [repositório](https://github.com/aflplusplus/libafl/blob/main/docs/src)
- Nosso [artigo](https://www.s3.eurecom.fr/docs/ccs22_fioraldi.pdf) de pesquisa
- Nossa [palestra](http://www.youtube.com/watch?v=3RWkT1Q5IV0 "Fuzzers Like LEGO") no RC3 explicando os conceitos principais
- Nossa [palestra](https://www.youtube.com/watch?v=PWB8GIhFAaI "LibAFL: The Advanced Fuzzing Library") no Fuzzcon Europe com uma discussão passo a passo (um pouco, mas não muito desatualizada) sobre como construir alguns fuzzers de exemplo
- As [soluções](https://github.com/epi052/fuzzing-101-solutions) do Fuzzing101 & série de [postagens no blog](https://epi052.gitlab.io/notes-to-self/blog/2021-11-01-fuzzing-101-with-libafl/) por [epi](https://github.com/epi052)
- Postagem no blog sobre fuzzing somente binário lib `libaf_qemu`, [Hacking TMNF - Fuzzing the game server](https://blog.bricked.tech/posts/tmnf/part1/), por [RickdeJager](https://github.com/RickdeJager).
- [Um Workshop Introdutório sobre LibAFL](https://www.atredis.com/blog/2023/12/4/a-libafl-introductory-workshop), por [Jordan Whitehead](https://github.com/jordan9001)
## Contribuidores
`LibAFL` é escrito e mantido por
- [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]>
## Contribuindo
Por favor, consulte **[CONTRIBUTING.md](https://github.com/aflplusplus/libafl/blob/main/CONTRIBUTING.md)** para as diretrizes de contribuição.
## Depuração
Seu fuzzer não funciona como esperado? Tente ler [DEBUGGING.md](https://github.com/aflplusplus/libafl/blob/main/docs/src/DEBUGGING.md) para entender como depurar seus problemas.
## Citar
Se você usar `LibAFL` para seu trabalho acadêmico, cite o seguinte artigo:
```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},
}
```
## Licença
<sup>
Licenciado sob a <a href="https://github.com/aflplusplus/libafl/blob/main/LICENSE-APACHE">Licença Apache, Versão 2.0</a> ou a <a href="https://github.com/aflplusplus/libafl/blob/main/LICENSE-MIT">licença MIT</a>, à sua escolha.
</sup>
<br>
<sub>
A menos que você declare explicitamente o contrário, qualquer contribuição intencionalmente submetida para inclusão neste crate por você, conforme definido na licença Apache-2.0, será licenciada duplamente como acima, sem quaisquer termos ou condições adicionais.
</sub>