목차



0. 서론

Fuzzing은 프로그램에 무작위의 데이터를 삽입하여 버그 및 취약점을 찾아주는 기술이다. 예를 들어, 프로그램에 들어가는 입력(표준입력 or 파일)을 변조시켜 정상적인 동작이 아닌, crash를 유발시키거나 메모리 corruption을 일으키는 테스트 사례를 찾는다. Fuzzing 기술은 여러 취약점을 찾는데 아주 유용한 툴로써 최근에 활발하게 연구개발이 진행되어 왔다. 이 프로젝트는 fuzzing 기술을 적용하여 전에 알려지지 않았던 여러 open-source 소프트웨어의 버그 및 실제 취약점을 찾고, 패치를 생성하여 community에 제출하는 과제를 수행한다.


1. AFL && AFL++

Fuzzing는 프로그램 혹은 메모리 스택에 자동으로 반무작위 데이터를 주입하고 버그를 탐지하는 Fuzzer라는 소프트웨어 테스트 도구로 수행된다. 이 중 주로 AFL++라는 Fuzzer를 활용하여 여러 오픈소스 소프트웨어를 Fuzz하여 버그를 찾아볼 계획이다. AFL++는 AFL의 확장판이므로 AFL를 먼저 알아볼 필요가 있다.


1) AFL

AFL은 a novel type of compile-time instrumentation and genetic algorithms 과 결합된 퍼저이다. 또한, 코드 커버리지 기반(edge coverage를 기반으로 feedback), 뮤테이션 기반 (Dumb fuzzer) 이다. 브루드포스로 입력을 받지만, 거기서 끝나는게 아니라 커버리지를 넓혀가며 프로그램 제어 흐름에 대한 변경사항을 기록하고, 이를 로깅하여 유니크한 크래시를 발견한다.

(1) AFL 특징

(2) Code Coverage (코드 커버리지)

코드 커버리지가 넓다는 의미는 바이너리 내부의 여러 로직이 존재하는데, 생성되는 testcase를 통해 많은 내부 로직을 거치게 하는 것을 뜻한다. 이론적으로 코드 커버리지가 넓을수록 더 많은 버그를 찾을 수 있다. edge coverage: 일반적인 코드 커버리지는 각각의 basic block이 실행이 되는지로 측정하나, edge code coverage는 basic block이 진화되는 것을 기반으로 측정 ⇒ 더욱 사소하게 다음 실행 추적이 가능하며, 기본 코드에서 미묘한 오류 조건을 발견하는데 도움이 됨 (보안 취약점은 예상치 못한 문제 또는 새로운 basic block에 잘못되게 전환되는 경우와 연관되는 경우가 더 많기 때문)

(3) 뮤테이션

뮤테이션 테스팅 절차