AFL++ 퍼징 체크리스트: ASan 할당 전체 채우기, persistent mode, 소스 파일 직접 include
- 6년간 약 1,000개 프로젝트를 퍼징한 저자가 공개한 AFL++ 팁 모음으로, sanitizer와 assertion을 최대한 켜두는 게 기본이며 ASAN_OPTIONS에 abort_on_error=1:halt_on_error=1:symbolize=0 설정을 요구함
- ASan 기본값은 새 할당의 앞 4KiB만 패턴으로 채워서 그 뒤 미초기화 메모리 버그를 놓쳤고, max_malloc_fill_size를 1<<30으로 올려 할당 전체를 채우면 잡힘
- detect_stack_use_after_return=1로 use-after-return 버그를 탐지하고, C++에서는 -D_GLIBCXX_DEBUG로 컨테이너 capacity 안쪽 범위 초과 접근까지 잡음
- persistent mode(afl-gcc-fast, afl-clang-fast)가 보통 모드보다 대략 10배 빠르며, __AFL_LOOP 기반 자체 템플릿 fuzztmpl.c를 공개함
- 헤더 대신 소스 파일을 직접 include하는 unity build로 번역 단위를 두 개로 줄이고, 그 덕에 static 함수까지 퍼징 대상으로 삼음
Hacker News 의견들
예전엔 C/C++에서 안전한 코드 짜는 게 실력 문제라고 생각했는데, FAANG에서 최고 직함 엔지니어가 쓴 코드에서 AFL로 문제를 여러 개 찾고 생각이 바뀜. 진짜 무서운 툴임.
그래도 실력 문제 맞음. 잘하는 사람은 피해야 할 패턴을 알고 기준도 높아서 평균적으로 버그를 덜 만듦. 누구도 100% 버그 없는 코드는 못 쓰고, 직함이 실력을 보장하진 않음.
실력보다 얼마나 신경 쓰느냐가 큼. 열정 있는 무경험자가 좋은 결과물 내는 경우도 있고, 유명한 사람이 대충 만든 코드를 내놓기도 함. FAANG 직함이 실력 지표가 된 지는 오래됐음.
정적 분석이나 퍼징을 제대로 쓰는 것도 디테일 챙기는 실력의 일부라고 봄.
AFL 나오기 전에도 퍼저 만들어봤는데, 코드 공간을 똑똑하게 탐색하는 방식이 나오고 판이 완전히 바뀜. 퍼징 붙인 코드베이스에서 버그 못 찾은 적이 없고, Go에 내장 퍼저가 들어간 것도 반가웠음. AI가 짠 코드는 유닛테스트를 그냥 pass로 만들 수 있으니 퍼징이 검증 수단으로 잘 맞고, 밤새 퍼징 돌리는 게 토큰 태우는 것보다 쌈.