1 minute read

요약

퍼징은 강력한 컴퓨팅 파워를 기반으로 수많은 입력을 자동으로 생성하여 프로그램을 테스트하는 기법이다. 따라서 어떻게 보면 가장 동적인 프로그램 테스트 방식이라고 볼 수 있다. 하지만 최근, 특히 지향성 퍼징에서 정적 분석 정보를 활용한 방식들이 큰 성과를 거두고 있다.

본문

퍼징은 다양한 입력을 무수히 생성하여 프로그램을 자동으로 테스트하는 기법이다. 이 때, 강력한 컴퓨팅 파워가 뒷받침해준다면 퍼징은 굉장히 효과적으로 프로그램의 결함을 잡아낼 수 있다. 특히 구글은 현재도 실시간으로 OSS-FUZZ 라는 프로젝트를 운영하여 퍼징을 통해 수많은 오픈소스프로젝트에서 다양한 결함을 찾아내는 중이다.

퍼징은 어떻게 보면 가장 동적인 프로그램 테스트 기법이다. 입력을 생성함에 있어 중요한 철학이 “질보다 양”이기 때문이다. 물론 입력의 품질을 완전히 포기할 수는 없어 커버리지 정보를 활용한다거나(Greybox Fuzzing) 문법구조를 참고하기는 하지만(Grammar-based Fuzzing), 여전히 생성하는 입력의 양이 절대적으로 중요한 것은 사실이다.

하지만 최근, 이러한 퍼징에 정적분석 정보를 활용한 방식들이 두각을 드러내고 있다. 정적분석 정보는 특히 지향성 퍼징에서 많이 활용되는데, 프로그램에서 집중하는 지점이 더 좁혀지는 그 특성 때문에 정적분석의 부담이 비교적 줄어들기 때문이다.

지향성 퍼징에서 정적 분석 정보의 활용은 다양하게 이루어진다. 각 입력이 실행흐름그래프 상에서 목표 지점에 얼마나 가까운지를 통해 더 좋은 입력을 선별하거나, 목표지점에 도달 할 수 있는 조건을 미리 분석한 후 가능성이 없는 입력을 조기에 쳐내기도 한다. 특히 내가 현재 진행중인 연구는 목표 지점과 의미있게 연관된 프로그램 지점을 지나는 입력만 고려하는 접근을 취하고 있다.

이렇듯 가장 동적으로 보이던 퍼징 기법에서도 정적분석 기술이 활발히 활용되고 있다. 물론 퍼징을 할 때, 언제나 정적분석이 만능 열쇠가 되지는 않을 것이다. 그러나 지향성 퍼징의 경우처럼 조건이 맞아떨어질 때는 동적 세상에 정적 분석이 들어와 굉장한 시너지를 발휘하게 된다. 각 기술의 장점과 단점, 그리고 해결하고자 하는 문제의 특징을 잘 파악하고 있다면 이렇게 굉장한 시너지를 발휘하는 또 다른 조합을 찾을 수 있을 것이다.