콘텐츠로 이동

LibAFL - 모듈식 퍼징 프레임워크 치트시트

LibAFL - 모듈식 퍼징 프레임워크 치트시트

LibAFL은 퍼징 프레임워크이며 퍼저가 아닙니다. AFL++ 팀이 Rust로 작성했으며 조합 가능한 빌딩 블록을 제공합니다 — 옵저버, 피드백, 변경자, 스케줄러, 단계, 실행기 — 당신의 대상에 맞춘 퍼저로 조합합니다. 동기는 단일 퍼저가 일반적인 대상에서 잘 작동하고 이상한 대상 (사용자 정의 프로토콜, 에뮬레이트된 펌웨어, 커널, 문법)에서 나쁘게 작동하므로 도구와 싸우게 됩니다. LibAFL로 대상이 정확히 필요로 하는 퍼저를 구축하고 멀티코어 스케일링을 무료로 얻습니다.

퍼저를 구축하는 것이 하나를 실행하는 것보다 더 많은 일입니다. 기성품 도구가 진정으로 맞지 않을 때만 LibAFL을 참고하십시오.

설정

단계명령어
새 프로젝트cargo new my_fuzzer && cd my_fuzzer
LibAFL 추가cargo add libafl libafl_bolts
대상 계측cargo add libafl_targets (또는 libafl_qemu, libafl_frida)
빌드cargo build --release

핵심 개념

구성 요소역할
입력퍼징되는 것 (바이트, 문법 트리, 시스콜)
옵저버실행 중 데이터 기록 (커버리지 맵, 타이밍)
피드백실행이 “흥미로운” 여부 결정
목표실행이 해결인 여부 결정 (충돌)
코퍼스흥미로운 입력 저장
변경자입력 변환
스케줄러다음 입력 선택
단계입력당 적용된 단계 (변경, 다듬기, 보정)
실행기대상을 입력으로 실행

최소한의 퍼저 (모양)

// 개념적 구조 — LibAFL 예제에서 완전한 코드 참조
let mut feedback = MaxMapFeedback::new(&edges_observer);
let mut objective = CrashFeedback::new();

let mut state = StdState::new(
    StdRand::with_seed(current_nanos()),
    InMemoryCorpus::new(),
    OnDiskCorpus::new("./crashes")?,
    &mut feedback,
    &mut objective,
)?;

let scheduler = QueueScheduler::new();
let mut fuzzer = StdFuzzer::new(scheduler, feedback, objective);

let mut executor = InProcessExecutor::new(
    &mut harness, tuple_list!(edges_observer), &mut fuzzer, &mut state, &mut mgr,
)?;

let mutator = StdScheduledMutator::new(havoc_mutations());
let mut stages = tuple_list!(StdMutationalStage::new(mutator));

fuzzer.fuzz_loop(&mut stages, &mut executor, &mut state, &mut mgr)?;

실행기 (대상이 어떻게 실행되는가)

실행기사용
InProcessExecutor가장 빠름; 같은 프로세스의 하네스
ForkserverExecutorAFL 스타일 포크서버 외부 바이너리용
CommandExecutor입력당 외부 명령 실행
libafl_qemu에뮬레이트된 대상 / 바이너리 만 퍼징
libafl_frida동적 계측 (바이너리 만)
libafl_nyx스냅샷 기반 VM 퍼징

피드백

피드백흥미로울 때
MaxMapFeedback새로운 커버리지 엣지 도달
TimeFeedback실행 시간 변경
CrashFeedback대상 충돌 (목표)
TimeoutFeedback대상 중단 (목표)
NewHashFeedback새로운 고유 충돌 스택
조합자feedback_or!, feedback_and! 조합

변경자

변경자수행
havoc_mutations()표준 AFL 스타일 무작위 변경
tokens_mutations()사전/토큰 삽입
문법 변경자구조 인식 생성
사용자 정의입력 타입에 대해 Mutator 특성 구현

사용자 정의 입력 타입 및 사용자 정의 변경자가 LibAFL을 선택하는 주요 이유입니다 — 바이트 플리핑보다 지능적으로 프로토콜 또는 AST를 퍼징합니다.

멀티코어 스케일링

메커니즘참고
LlmpRestartingEventManager코어 간 낮은 오버헤드 메시지 패싱
Launcher공유 코퍼스로 코어당 하나의 퍼저 생성
코퍼스 동기화흥미로운 입력이 인스턴스 간 전파
재시작퍼저 프로세스 충돌에서 생존

LibAFL vs 기성품 퍼저

측면LibAFLAFL++honggfuzz
모델직접 구축즉시 실행즉시 실행
노력높음낮음낮음
유연성전체설정 가능설정 가능
최적 대상이상한 대상, 연구표준 바이너리빠른 시작, 하드웨어 피드백

AFL++ 또는 honggfuzz로 시작합니다; 대상이 정말 맞지 않을 때 LibAFL로 이동합니다.

리소스