본문 바로가기

Network, Security

퍼징(Fuzzing) - 테스트

퍼징(Fuzzing)

퍼징, 퍼즈 테스팅(Fuzz Testing)은 소프트웨어 테스트 기법이다. 컴퓨터 프로그램에 유효한, 예상치 않은 값들을 무작위 대입하여 데이터를 입력한다. 해당 과정을 통해 충돌, 버그 등을 찾아낸다. 퍼징은 화이트, 그레이, 블랙 박스 테스팅에 사용 된다. 화이트 박스 테스트는 프로그램의 소스코드를 보며 테스트를 진행하는 것으로 조건문, 반복문 등의 코드 결함을 찾아낼 때 주로 사용된다. 그레이 박스 테스트는 프로그램의 코드 일부만 알고 진행하는 테스트 기법이다. 테스트 케이스를 만들 때 내부 구조를 참고하여 설계하며 이후 테스트는 블랙박스 기반으로 진행된다. 블랙박스 테스트는 프로그램 내부를 보지않고 기능들이 정상적으로 잘 동작하는지 확인하는 테스트이다. 즉, 프로그램이 동작할 때 입력으로 들어올 수 있는 값들을 무작위로 대입하여 버그를 발견하기 위해 퍼즈 테스팅을 진행한다.

퍼징은 프로그램의 형태로 변이 기반과 생성 기반 두 종류가 있다. 테스트는 파일 형식과 통신 프로토콜 등이 예외처리가 잘 되어있는지 등을 테스트하는게 주요 목표이지만 이외에도 환경변수, 키보드와 마우스 이벤트, API 호출 등의 테스트도 진행하며 입력을 간주되지 않은 여러 이벤트 항목들도 퍼즈가 가능하다.

 

변이 기반 퍼저

변이 기반 퍼저는 명령의 옵션, 변이된 프로토콜 패킷, 이벤트 등을 소프트웨어에 테스트하는 것이다. 변이 기반 테스트는 명령 기반 애플리케이션, 네트워크 프로토콜, GDI 기반 애플리케이션, 서비스 등의 버그를 찾는데 효과적이다. 변이 기반 퍼저는 값들을 무작위로 대입하는 형태로 테스트가 진행된다. 값을 추가하거나 위치를 변경하는 등의 과정을 반복하며 버그를 찾는다. 또한, 프로그램에서 무작위로 값을 대입하는 형태이기 때문에 프로토콜, 소프트웨어에 대한 이해도가 부족해도 테스트를 진행할 수 있다.

생성 기반 퍼저

생성 기반 퍼저는 프토로콜, 소프트웨어에 대한 이해도가 있을 때 사용하는 테스트 방식이다. 테스트를 위한 명세서를 작성하고 해당 명세서를 기반으로 테스트케이스를 직접 설계하여 사용된다. 이때, 생성 기반 퍼저로 테스트 케이스를 설계하면서 변이 기반 퍼저도 동시에 사용할 수 있다. 때문에 변이 기반 퍼저만 사용할 때 보다 더 꼼꼼하게 테스트를 진행할 수 있다.

 

두 가지 방식의 퍼저 테스트가 있는데 각각의 장단점은 있다. 변이 기반의 경우 프로토콜, 소프트웨어에 대한 이해도가 부족해도 테스트를 진행할 수 있다는 장점이 있다. 하지만 자세한 부분까지 다루지 못한다는 단점이 있다. 생성 기반 퍼저는 프로토콜, 소프트웨어에 대한 이해도가 어느 정도 필요하다. 명세서를 기반으로 하여 테스트 케이스를 직접 설계해줘야 하기 때문이다. 직접 설계하기 때문에 더욱 자세한 부분까지 다룰 수 있다. 하지만 설계하는데 시간이 오래걸릴 수 있다.

퍼징을 이용하면 비교적 빠른시간에 테스트를 반복적으로 진행할 수 있다는 장점이 있다. 하지만 경계값 분석을 찾는 것이 어렵다는 단점이 있었는데 현재 대부분의 퍼저들은 결정론적 알고리즘을 기반으로 하여 사용자 입력을 사용해서 해당 문제점을 해결했다. 여기서 결정론적 알고리즘은 예측한 그대로 동작하는 알고리즘이다. 즉, 특정한 입력값이 들어오면 언제나 같은 과정을 거쳐서 같은 결과를 내놓는 알고리즘이다.

 

퍼징의 악용

퍼징은 개발된 소프트웨어, 프로토콜을 테스트 하기위해 개발되었지만 소프트웨어의 결함을 찾아내는 도구인 만큼 악용할 수도 있다. 공격자들이 공격 대상 애플리케이션에 퍼징 테스트를 직접하여 개발자가 발견하지 못한 결함을 직접 찾아내여 공격 경로로 활용하는 것이다. 퍼징 외에도 테스트를 위한 여러 도구들이 공격자들의 공격 도구로 사용될 수 있다.

반응형