honggfuzz - 보안 지향 커버리지 기반 퍼저 치트시트
honggfuzz는 Google의 보안 지향, 피드백 기반 퍼저입니다. 이는 대상을 곧바로 가리키기가 간단하고, 즉시 멀티 프로세스 및 멀티 스레드 퍼징이 가능하며, 소프트웨어 계측 및 하드웨어 기반 커버리지 피드백 (Intel BTS/PT) 모두를 지원하는 것으로 알려져 있습니다 — 후자는 재컴파일할 수 없는 바이너리를 퍼징할 수 있습니다. 광범위하게 사용되는 소프트웨어에서 실제 취약점을 찾는 오랜 기록이 있습니다.
퍼징은 CPU와 디스크를 많이 소비할 수 있습니다. 전용 용량에서 실행하고 격리된 환경에서 실행합니다.
설치
| 플랫폼 | 명령어 |
|---|
| Debian/Ubuntu | sudo apt install honggfuzz |
| 소스에서 | git clone https://github.com/google/honggfuzz && make |
| macOS | brew install honggfuzz |
| 확인 | honggfuzz --help |
두 가지 모드
| 모드 | 사용 |
|---|
| 파일 기반 | 대상이 파일/stdin을 읽음; honggfuzz가 입력을 변경 |
| 영구 | 대상이 퍼즈 엔트리 포인트를 노출; 훨씬 더 빠름 |
파일 기반 퍼징
# 파일 인수를 취하는 프로그램을 퍼징
honggfuzz -i ./input_corpus -W ./workspace -- ./target ___FILE___
| 플래그 | 목적 |
|---|
-i DIR | 입력 코퍼스 디렉터리 |
-W DIR | 작업 공간 (충돌, 통계) |
-o DIR | 출력 코퍼스 |
___FILE___ | 입력 파일로 대체된 플레이스홀더 |
-s | stdin을 통해 입력 공급 |
-t SECS | 실행당 타임아웃 |
-n N | 동시 퍼징 스레드 수 |
영구 모드 (빠름)
#include <stdint.h>
#include <stddef.h>
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
parse_input(data, size); // 대상 함수
return 0;
}
# honggfuzz의 clang 래퍼로 컴파일, 그 후 퍼징
hfuzz-clang -fsanitize=address fuzz_target.c -o fuzz_target
honggfuzz -i corpus -P -- ./fuzz_target
| 요소 | 참고 |
|---|
LLVMFuzzerTestOneInput | libFuzzer와 같은 엔트리 포인트 — 대상은 휴대용 |
-P | 영구 모드 활성화 |
hfuzz-clang / hfuzz-gcc | 계측을 추가하는 컴파일러 래퍼 |
영구 모드는 입력당 프로세스 시작을 회피하며, 종종 초당 10-100배 더 많은 실행을 제공합니다.
커버리지 피드백 옵션
| 메커니즘 | 플래그 / 요구사항 |
|---|
| 소프트웨어 계측 | hfuzz-clang으로 컴파일 (기본값, 최선) |
| Intel BTS | --linux_perf_bts_edge (재컴파일 안 함) |
| Intel PT | --linux_perf_ipt_block (재컴파일 안 함) |
| 명령어/분기 개수 | --linux_perf_instr, --linux_perf_branch |
하드웨어 피드백은 폐쇄 소스 바이너리를 위한 탈출구입니다 — 소스 접근 없이 커버리지 안내를 얻습니다.
살균기
# ASan + UBSan으로 더 나은 충돌 감지를 위해 빌드
hfuzz-clang -fsanitize=address,undefined target.c -o target
| 살균기 | 캐치 |
|---|
| ASan | 버퍼 오버플로우, use-after-free |
| UBSan | 정의되지 않은 동작 |
| MSan | 초기화되지 않은 읽기 |
| LeakSanitizer | 메모리 누수 |
모니터링 및 출력
| 항목 | 곳 |
|---|
| 라이브 통계 | 터미널 UI (실행/초, 커버리지, 충돌) |
| 충돌 | WORKSPACE/*.fuzz 파일 |
| 보고서 | HONGGFUZZ.REPORT.TXT |
| 충돌 이름 | 신호 및 결함 주소 포함 |
| 플래그 | 효과 |
|---|
-N N | N 반복 후 중지 |
--exit_upon_crash | 첫 충돌에서 중지 |
-v | 상세 |
-Q | 조용히 |
심사 워크플로우
# 1) 충돌 재현
./target < WORKSPACE/SIGSEGV.PC.*.fuzz
# 2) 디버거 아래에서 스택 추적 받기
gdb --args ./target WORKSPACE/SIGSEGV.PC.*.fuzz
# 3) 입력을 최소화한 후 재현기와 함께 버그를 파일
honggfuzz vs 다른 퍼저
| 측면 | honggfuzz | AFL++ | libFuzzer | LibAFL |
|---|
| 설정 | 매우 쉬움 | 쉬움 | 쉬움 (프로세스 내) | 직접 구축 |
| 폐쇄 소스 대상 | 예 (Intel PT/BTS) | QEMU 모드 | 아니오 | 예 |
| 영구 모드 | 예 | 예 | 네이티브 | 예 |
| 최적 대상 | 빠른 시작, 하드웨어 피드백 | 광범위한 에코시스템 | 라이브러리 API | 사용자 정의 퍼저 |
AFL++와 비교하여 가장 광범위한 에코시스템, LibAFL 사용자 정의 퍼저 필요.
리소스