Hacker News보안

AFL++ 퍼즈 테스팅으로 버그 잡는 8가지 기법

원제 Tips for more effective fuzz testing with AFL++

100 포인트댓글 16
Key Point

퍼즈 테스팅은 복잡한 입력을 받는 모든 프로그램에서 버그를 드러낼 수 있지만 실제로는 거의 사용되지 않으므로, 이 기법들을 적용하면 기존 테스팅에서 놓친 결함을 발견할 수 있다.

핵심 요약

  • 6년간 약 1,000개 프로젝트를 퍼즈 테스팅한 경험에 바탕해 AFL++ 도구로 C/C++ 프로그램의 버그를 더 효과적으로 발견하는 기법 8가지를 소개한다.
  • 먼저 Address Sanitizer(ASan)와 Undefined Behavior Sanitizer(UBSan)를 활성화하되, ASan 옵션에서 detect_stack_use_after_return=1과 max_malloc_fill_size로 최대한 민감하게 설정해야 한다.
  • 지속 모드(persistent mode)를 사용하면 일반 모드보다 10배 빠르게 퍼즈 테스팅이 가능하며, 표준 템플릿이 아닌 개선된 fuzztmpl.c를 사용하는 것이 좋다.
  • 헤더 파일 대신 소스 파일을 직접 포함하면 빌드 설정을 단순화하고, 정적 함수를 포함한 임의의 함수를 테스트할 수 있다.
  • 각 테스트는 이전 테스트의 영향을 받지 않도록 전역 상태를 리셋해야 하며, 초기화되지 않은 메모리를 테스트에 직접 전달하면 안 된다.
  • AFL++ 버퍼를 직접 전달하지 말고 크기에 맞춰 복사본을 전달해야 한다. 이렇게 하지 않으면 버퍼 오버플로우를 감지하지 못한다.
  • 메모리를 해제할 필요 없이 AFL++이 프로세스를 리셋할 때까지 기다려도 되며, 대신 파일 디스크립터 같은 다른 자원은 정리해야 한다.
  • 경로 기반 입력만 받는 인터페이스를 테스트할 때는 memfd_create로 메모리 파일 디스크립터를 만들고 /proc/self/fd/N으로 접근하면 된다.
  • 고정 버퍼 크기 상수를 줄여서 정의하면 버그 발생 경로에 빠르게 도달할 수 있으며, 짧은 버퍼에서 발견한 충돌은 원본 크기로 재현하기 쉽다.
AI 요약 안내

AI가 한국어로 정리한 내용입니다. 정확한 정보는 원문을 확인해 주세요.

요약 원칙 ↗