
LibAFL v0.16.0
고급 퍼징 라이브러리 - Rust로 퍼저를 조립하세요! 코어와 머신 간에 확장됩니다. Windows, Android, MacOS, Linux, no_std 등을 지원합니다.
LibAFL, 퍼저 라이브러리
고급 퍼징 라이브러리 - 자신의 퍼저를 조합하고 Rust를 사용하여 기능을 확장하세요.
LibAFL은 Rust로 작성된 재사용 가능한 퍼저 조각들의 모음으로, 기성 퍼저의 많은 장점을 제공하면서도 완전히 사용자 정의할 수 있습니다.
현재 주요 기능은 다음과 같습니다:
빠름: 컴파일 시간에 최대한 많은 작업을 수행하여 런타임 오버헤드를 최소화합니다. 사용자는 휴대폰에서 frida 모드(모든 코어 사용)로 초당 120,000회 실행에 도달합니다.확장 가능: 줄여서LLMP라고 하는저수준 메시지 전달을 통해LibAFL이 코어 간에 거의 선형적으로 확장되고 TCP를 통해 여러 머신으로 확장될 수 있습니다.적응 가능:LibAFL의 각 부분을 교체할 수 있습니다. 예를 들어BytesInput은 잠재적인 입력 형태 중 하나일 뿐입니다. 구조화된 퍼징을 위해 AST 기반 입력 등을 자유롭게 추가할 수 있습니다.다중 플랫폼:LibAFL은 Windows, macOS, iOS, Linux, Android 등에서 실행됩니다.LibAFL은no_std모드로 빌드하여 임베디드 장치나 하이퍼바이저와 같은 난해한 대상에 주입할 수 있습니다.자체 대상 가져오기: Frida-Mode와 같은 바이너리 전용 모드와 소스 기반 계측을 위한 여러 컴파일 패스를 지원합니다. 물론 사용자 정의 계측 백엔드를 쉽게 추가할 수 있습니다.
핵심 개념
LibAFL은 빠르고, 다중 플랫폼이며, no_std 호환이 가능하고 코어와 머신 간에 확장됩니다. 사용자 정의 퍼저를 위한 구성 요소를 제공하는 메인 크레이트 libafl, 대상 계측에 사용할 수 있는 공통 코드를 포함하는 라이브러리 libafl_targets, 그리고 컴파일러 래핑 기능을 제공하는 라이브러리 libafl_cc를 제공합니다. 널리 사용되는 계측 프레임워크와의 통합을 지원합니다. 현재 지원되는 백엔드는 다음과 같습니다:
SanitizerCoverage, in libafl_targetsFrida, in libafl_fridaQEMU사용자 모드 및 시스템 모드(에뮬레이션을 위한 후크 포함), in libafl_qemuTinyInst, elbiazo의 libafl_tinyinst
빌드 및 설치
의존성 설치
- Rust 개발 언어
-
예를 들어 Linux 배포판 패키지를 사용하지 않도록 강력히 권장합니다. 이는 구버전일 가능성이 높기 때문입니다. 대신 Rust를 직접 설치하세요. 설치 지침은 여기에서 확인할 수 있습니다.
-
최소 지원 Rust 버전이 정의되어 있습니다. 현재 필요한 버전은 LibAFL의 Cargo.toml에서 확인할 수 있습니다:
설치된 Rust 버전이 Cargo.toml에 나열된 버전보다 오래된 경우, 최신 안정 툴체인으로 업데이트하세요:
rustup update stable
-
- LLVM 도구
- LLVM 도구(clang, clang++ 포함)가 필요합니다(LLVM 15.0.0 이상 LLVM 18.1.3 이하). Debian/Ubuntu를 사용하는 경우, 여기에서 패키지를 설치할 것을 다시 한번 강력히 권장합니다.
- Just:
- 우리는 just를 사용하여
fuzzers/디렉토리의 퍼저를 빌드합니다. 설치 지침은 Just Programmer's Manual에서 확인할 수 있습니다.
- 우리는 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로, libpng harness를 위해 LibAFL을 사용하는 멀티코어 libfuzzer 방식 퍼저입니다.
리소스
- 설치 가이드
- 온라인 API 문서
LibAFL책(작성 중) 온라인 또는 저장소에서- 저희 연구 논문
- 핵심 개념을 설명하는 저희의 RC3 발표
- 일부 예제 퍼저를 구축하는 방법에 대한 (약간은 구식이지만 그리 많지는 않은) 단계별 논의가 포함된 저희의 Fuzzcon Europe 발표
- epi의 Fuzzing101 솔루션 및 블로그 게시물 시리즈
- RickdeJager의 바이너리 전용 퍼징 라이브러리
libaf_qemu에 관한 블로그 게시물, Hacking TMNF - Fuzzing the game server. - Jordan Whitehead의 LibAFL 입문 워크숍
기여자
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 license 중 하나에 따라 라이선스가 부여됩니다.명시적으로 달리 명시하지 않는 한, Apache-2.0 라이선스에 정의된 대로 귀하가 이 크레이트에 포함시키기 위해 의도적으로 제출한 모든 기여는 추가 약관이나 조건 없이 위와 같이 이중 라이선스가 부여됩니다.