[Fuzzer] What the Fuzz
Ref. https://labs.f-secure.com/blog/what-the-fuzz/
# 정의
- fuzzing이란 자동화된 소프트웨어 테스팅 기술로써 프로그램 내부에 존재할 수 있는 취약점을 찾아내는 것
- 단순화된 fuzzing은 브루트포스와 마찬가지로 무작위로 입력 값을 보내는 방식으로 진행할 수 있음
- but 발전된 fuzzing techniques 소스코드나 바이너리를 분석하여 입력 값을 생성
# 장점
- 자동화하여 버그를 찾을 수 있으므로 비용적으로 효율적임
- 수동 테스트는 분석자의 기술력에 굉장히 의존적
- fuzzing을 사용하면 서로 다른 종류의 버그를 찾을 수 있음 + 분석자의 손을 벗어나도 계속해서 분석이 가능하기 때문에 효율적임
# 이슈
- fuzzing은 훌륭하고 값싼 기술이지만 최적의 방안은 아님 → fuzzing을 하기 위한 토대를 만드는데도 많은 시간이 걸리기 때문
- fuzzing을 통해 많은 취약점을 발견하면 취약한 프로그램이라고 할 수 있으나, 취약점이 나오지 않는다고해서 취약점이 없는 프로그램은 아님. 즉, fuzzing만으로 보안성을 평가하기 어려움
- fuzzer는 무의미하고 익스플로잇터블하지 않은 많은 버그들을 만들 수 있음 → 따라서 검토 프로세스가 항상 필요하고, 수동으로 해야만 가장 정확한 검토가 가능
# 필요 조건
- 입력을 받는 타겟 프로그램이 필요
- 💡 프로그램이 복잡할 수록 더 많은 버그를 찾을 가능성이 높음
- 어떤 프로그램인지 어떤 버그를 찾을 것인지에 따라 어떤 퍼저를 사용할지 고민해야 함 → 그렇지 않으면 처음부터 작성해야 함
# 버그의 종류
- 이론적으로 fuzzing을 통해서는 모든 종류의 버그를 찾을 수 있음
- fuzzing을 할 때 프로그램의 행동이 의도된 것인지 잘못된 것인지 구별할 메카니즘이 필요함
- 메모리 corruption같은 경우 fuzzing을 통해 찾아내기 쉽지만, 논리 취약점의 경우에는 탐지하기 어려움
# Test case Generator
- 새로운 테스트케이스 작성을 담당
- 입력 값을 만들어 내는 곳
- smart fuzzer: 입력 값의 구조를 알고 test case를 만드는 것
- dumb fuzzer: 입력 값의 구조를 모르고 무작위로 test case를 만드는 것
- test case는 처음부터 생성되거나, 이미 존재하던 test case를 변조하여 생성됨
# Guided fuzzing
- 테스트 케이스 생성기를 이용하여 test case를 만드는 것에는 품질의 차이가 있음
- 따라서 어떤 test case에서 어떤 부분을 조작하여 입력값을 만들지에 대한 고민이 필요함
- 이에 대한 일반적인 지침은 code coverage임
- 이론적으로 code coverage가 클수록 더 많은 버그를 찾을 수 있음
# Dumb fuzzing
- 입력구조 모델이 필요없는 방식을 Dumb fuzzer라고 함
- 장점으로는 입력구조의 정보 없이 가능하기 때문에 많은 다른 프로그램들에 적용이 가능함
- 가장 큰 단점은 입력에 미리 정의된 구조가 필요하거나, 체크섬이 존재하는 경우 fuzzer가 유효한 입력 값을 만들어 내기까지 상당한 어려움이 존재
# Mutation based fuzzing
- 존재하는 test case를 변형하여 test case를 생성함
- 주로 bit flipping을 사용하며, 랜덤으로 bit flipping을 하고, 움직이거나, 지우거나 반복하는 형태로 진행됨
- 장점으로는 설정 작업이 많이 필요하지 않음
# Generation based fuzzing
- 처음부터 test case를 생성하며 입력 파일의 구조를 알고 있어야 함
- 한 번 실항하게 되면 Mutation based fuzzer보다 높은 coverage를 생성하는 경향이 있어서 고유한 버그를 발견할 가능성이 높음
# Test case minimization
- fuzzing이 진행될 수록 test case가 증가하고 복잡해지며 시간도 오래 걸리게 됨
'Hacking Tech > Fuzzer' 카테고리의 다른 글
[AFL fuzzer] AFL fuzzer 원리 (0) | 2022.11.08 |
---|---|
[firmadyne/Firm-AFL] firmadyne & FirmAFL 사용을 위한 지식 (0) | 2022.11.07 |
[Firm-AFL] FirmAFL 환경 셋팅 및 오류 해결 (3) | 2022.11.05 |