퍼징 Fuzzing에 대해서 간단히 알아보자
이번에 퍼징에 관한 논문 분석을 하는 프로젝트를 하게 되었는데,, 미리 개념이라도 공부를 해두면 좋을 것 같아 글을 써본다.
fuzzing = fuzz testing
컴퓨터 프로그램에 유효한 예상치 않은, 또는 무작위 데이터를 입력하는 것이다.
이후 프로그램이 충돌이나 코드검증 실패, memory leak 발견 등의 예외가 일어나는지 감시를 한다.
한마디로 정리하면 소프트웨어, 시스템에 보안문제가 있는지 없는지 확인하기 위해 무작위의 데이터를 넣어가며 감시를 하는 것을 말한다.
1990년대 초 이후 퍼징은 소프트웨어의 보안 취약성을 발견하기 위해 널리 보급된 기술중 하나이다.
이 퍼징은 공격자가 사용하기 시작하면서 방어자들도 사용하기 시작했다. 세계적인 IT/SW 기업에서는 보안개발을 할 때 퍼징을 채택하고 있다.
Fuzz Testing Algorithm
가장 일반적인 퍼즈 테스트의 알고리즘이라고 한다.
C는 퍼저의 전체적인 구성 세트, t(limit)은 타임아웃 시간이다. 이 두 변수를 입력으로 받고
B라는 버그 세트를 출력한다.
이제 함수들을 하나씩 소개하면, (모든 함수가 꼭 퍼저에서 쓰여야 하는 것은 아니다.)
- PREPROCESS(C) : 퍼즈 configuration이 수정될 가능성이 있는 것에 대해서 전처리를 수행한다. instrumentation code(coverage를 측정하는 코드, coverage는 얼마나 깊게 이 프로그램을 조사했는지를 측정하는 지표)를 넣거나 seed 파일(PUT에 넣기 좋은 일반적인 코드)의 속도를 측정하는 등 다양한 액션 수행이 가능하다.
- SCHEDULE(C, t(elapsed), t(limit)) -> conf : C, 현재시간, 타임아웃 시간을 입력해서 현재 퍼즈 반복에 사용할 설정을 선택한다.
- INPUTGEN(conf) -> tcs : 현재 설정을 가지고 테스트케이스(tcs)를 생성한다. 퍼저마다 conf에 사용되는 매개변수는 다르다.
- INPUTEVAL(conf, tcs, Obug) -> B', execinfos : conf, tcs, 오라클버그를 입력으로 받고 실행이 보안정책을 위반하는지 확인한다. 그리고 버그(B')와 퍼즈를 실행한 것에 대한 정보(execinfos)를 출력한다.
- CONFUPDATE(C, conf, execinfos) -> C : C, conf, execinfo를 가지고 새로 C를 업데이트한다.
- CONTINUE(C) : 새로운 퍼즈 반복을 할지 말지에 대한 boolean(T/F)를 출력한다.
퍼저 분류법
1. Black box fuzzer
퍼징에서 PUT의 입출력 동작만 관찰할 수 있고, 내부는 관찰할 수 없다.
보다 의미 있는 테스트 케이스 생성을 위해서 입력에 대한 구조정보를 고려한다.
대부분의 전통적인 퍼저가 블랙박스 퍼저이다.
2. White box fuzzer
PUT의 내부와 PUT 실행 시 수집된 정보를 해석함으로써 테스트 케이스를 생성한다.
taint analysis(외부 입력 영향으로부터 흐름을 파악하는데 쓰이는 분석) 설명에 화이트박스 퍼저 개념이 사용된다.
블랙박스 퍼징의 오버헤드보다 훨씬 높다.(DSE 시행이랑 dynamic instrumentation, SMT 때문)
3. Grey box fuzzer
화이트퍼저와 비슷하게 PUT 내부 정보를 얻을 수 있는데, 화이트퍼저처럼 전체적인 분석을 하기보다는 PUT에 대해 경량 정적 분석을 수행하거나 코드 커버리지 같은(소프트웨어 테스트 케이스가 얼마나 충족되었는지 나타내는 지표)실행에 대한 동적정보를 수집한다.