소프트웨어에 무작위, 유효하지 않은, 또는 예기치 않은 입력 데이터를 지속적으로 주입하여 시스템의 버그, 충돌, 또는 보안 취약점을 자동화된 방식으로 찾아내는 화이트박스/블랙박스 테스팅 기술
[관련 자료1](https://dhkstn.tistory.com/entry/Fuzzing-Study)
- 코드 커버리지가 뭔지도 다루니 과제할 때 참고할 것...
**입력 생성 방식 기준 분류**
- Mutation Based Fuzzing(Dumb Fuzzing)
- 입력 데이터를 특정하여, 그 입력 데이터에 대해 조금씩 변이(Mutation)를 주어 새로운 입력 데이터를 생성
- 특정한 입력 데이터를 "시드(seed)"라고 부르며, 여기서 변이를 준 데이터를 "test data"라고 함.
- Generation Based Fuzzing(Smart Fuzzing)
- 데이터의 구조 및 프로토콜을 이해하여 프로그램에 적합한 입력 데이터를 생성하는 기법
**피드백 활용 방식 분류**
- Guided fuzzing
- 실행 결과 보고 다음 입력 개선
- Unguided fuzzing
**질문드릴 내용**
1. Grammar-Based랑은 뭐가 다르지? 어떤 분류에 포함되지? → Generation-Based?
1. Grammar-based는 mutation/generation 둘 다 포함 가능
1. mutation: 입력을 grammar를 이용하여 AST 등의 형태로 변환, 입력의 일부를 문법에 맞게 변환
2. generation: 입력을 grammar로부터 생성하게 됨.
2. 추가 질문: generation의 경우 이미 나와 있는 어떤 grammar specification 을 기반으로 입력을 만들어내면 generation-based인 건지? -> specification이 있을 필요는 없는듯?
3. mutation은 '입력 데이터를 특정하고, 이후 변이를 주는 것'이라고 이해했는데, grammar + mutation이라고 하면 여기서 처음 특정하는 데이터는 무엇인지? 애초에 mutation 이해가 잘 안 된 듯함...
1. html fuzzer 예시 (grammar-based mutational fuzzer)
1. seed를 문법 기반으로 변경 - title 태그를 thead 태그로 교체 - 할 경우 test case가 됨. 이건 형태적으로는(syntatic) 옳은 구조지만, 의미적으로는 옳지 않으므로 브라우저가 다른 동작을 하게 됨.
2. AsFuzzer은 Grammer-Based + Guided?
1. grammar-based + generation-based + unguided
1. grammar 추론 (w. error-message *guided*)
1. 일반적으로는 grammar specification이 주어진 경우에서 하지만, 이런 식으로 접근이 불가능한 경우 grammar inference를 통해 grammar specification을 생성 - **합성(synthesis)** - 하여 진행. 여전히 grammar-based라고 칭하기는 함.
2. 추론된 Grammar를 사용해 fuzzing 진행
1. 이때는 unguided