
LibAFL v0.16.0
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
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,LLMPpara abreviar, permite queLibAFLescale quase linearmente entre núcleos, e via TCP para várias máquinas.adaptável: Você pode substituir cada parte doLibAFL. 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:LibAFLroda em Windows, macOS, iOS, Linux e Android, e mais.LibAFLpode ser construído em modono_stdpara injetarLibAFLem 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, uma biblioteca contendo código comum que pode ser usado para instrumentação de alvos, libafl_targets, e uma biblioteca que fornece facilidades para envolver compiladores, libafl_cc. Ele oferece integrações com frameworks de instrumentação populares. No momento, os backends suportados são:
SanitizerCoverage, em libafl_targetsFrida, em libafl_fridaQEMUmodo usuário e modo sistema, incluindo hooks para emulação, em libafl_qemuTinyInst, em libafl_tinyinst por 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.
-
A versão mínima suportada do Rust está definida. Você pode sempre verificar a versão atualmente requerida no 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:
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
- Just:
- Usamos 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.
- Usamos just para construir os fuzzers no diretório
Clone o repositório LibAFL com
git clone https://github.com/AFLplusplus/LibAFL
Construa a biblioteca usando
cargo build --release
Construa a documentação da API com
cargo doc
Navegue pelo livro LibAFL (em andamento!) com (requer mdbook)
cd docs && mdbook serve
Primeiros passos
Coletamos todos os fuzzers de exemplo em ./fuzzers.
Certifique-se de ler a documentação (e o código fonte), esta é a maneira natural de começar!
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, um fuzzer multicore semelhante ao libfuzzer usando LibAFL para um harness libpng.
Recursos
- Guia de instalação
- Documentação da API online
- O livro
LibAFL(em andamento) online ou no repositório - Nosso artigo de pesquisa
- Nossa palestra no RC3 explicando os conceitos principais
- Nossa palestra 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 do Fuzzing101 & série de postagens no blog por epi
- Postagem no blog sobre fuzzing somente binário lib
libaf_qemu, Hacking TMNF - Fuzzing the game server, por RickdeJager. - Um Workshop Introdutório sobre LibAFL, por Jordan Whitehead
Contribuidores
LibAFL é escrito e mantido por
- Andrea Fioraldi [email protected]
- Dominik Maier [email protected]
- s1341 [email protected]
- Dongjia Zhang [email protected]
- Addison Crump [email protected]
- Romain Malmain [email protected]
Contribuindo
Por favor, consulte CONTRIBUTING.md para as diretrizes de contribuição.
Depuração
Seu fuzzer não funciona como esperado? Tente ler DEBUGGING.md para entender como depurar seus problemas.
Citar
Se você usar LibAFL para seu trabalho acadêmico, cite o seguinte artigo:
@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
Licenciado sob a Licença Apache, Versão 2.0 ou a licença MIT, à sua escolha.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.