Mutation vs Generation.
퍼징이란?
퍼즈 테스팅 또는 퍼징은 종종 자동화 또는 반자동화된 소프트웨어 테스트 기법으로서, 컴퓨터 프로그램에 유효한,예상치 않은 또는 무작위 데이터를 입력하는 것이라고 정의되어 있다.
퍼징은 목적에 따라 크게 2가지 분류로 나눌 수 있다.
1번째로 유효하지 않거나 잘못된 값을 무작위로 입력하여 미쳐 발견하지 못한 프로그램상의 결함이나 보안 취약점을 찾는 검사
방법이다.주목적은 소프트웨어의 결함이나 보안 취약점을 찾아 보완하려는 것이며, Black-Box 테스트라고도 불린다.
2번째로 해커가 소프트웨어 프로그램을 공격하기 전 소프트웨어의 취약점을 발견하기 위한 목적으로 하는 테스트다.해커는 퍼징을 통해 소프트웨어에 존재하는 취약점을 찾고 그 취약점을 자신의 목표를 달성하는 수단으로 사용한다.
Related Link => https://www.slideshare.net/khalegh/fuzzing-49089300
퍼징 기법 종류.
퍼징을 하는 이유는 제품이나 프로그램의 올바른 기능을 테스트하는 것이 아니라, 정의되지 않은 영역을 검증하고 확인하기 위함이다.퍼징을 분류할 때 그 공격 기법이나 방식, 타겟 등에 따라 다양한 종류로 구분할 수 있다.타겟의 경우만 해도 파일 포맷,네트워크 프로토콜,커맨드라인 파라미터 등 굉장히 다양하다.일단 가장 기본이 되는 방법은 테이트 케이스를 어떤 식으로 생성하는지에 따라 분류하는 것이다. 즉 퍼징을 위한 Input data를 어떻게 처리하느냐에 따라 2가지 방식인 Mutation,Generation로 나뉜다.
Mutation [Dumb Fuzzer].
덤프 퍼져는 이미 생성된 입력 값에 대해 특정한 조작을 가해 값을 변조하는 것이다.그렇기 때문에 이런 방식은 입력으로 사용되는 데이터의 포맷이나 구조에 대한 지식이 없기 때문에 Dumb[무식한] 퍼져라고 불리운다.즉 데이터의 랜덤 색션 하나를 다른 것으로 바꾸거나 추가시키는 것이다.예를 들어 Bit Flipping[비트 반전]은 뮤테이션 방식에서 사용하는 기법 중 하나인데 비트를 선택하여 반전시킨다.
유사한 방식으로 이미 존재하는 입력 데이터의 끝 부분에 임의의 문자열을 추가할 수도 있다.
Bit Flipping with ZZUF [Mutation].
비트 반전 기법을 이용하는 대표적인 퍼저로 ZZUF가 있다.ZZUF는 사용하기 쉬운 퍼져인데, 사용자에 의해 작성되는 데이터를 변조하고, 입력 값의 특정 비트를 랜덤하게 변경하여 애플리케이션의 버그를 찾는 것이 목적인 퍼져.아래와 같이 fuzz.txt라는 입력 파일의 내용을 변조한다.
ZZUF를 이용해서 리눅스 cat 명령어의 입력 파일을 퍼징해본다.
위 사진은 파일을 ZZUF 유틸리티의 입력으로 사용할 fuzz.txt 파일을 보여준다.
위 사진은 ZUFF를 이용해 -r 옵션을 통해 퍼즈하고자 하는 비트의 개수를 지정하는 명령어와 결과를 보여준다.참고로 0.002는 0.2% 비트를 퍼즈하라는 뜻이고, 0.01은 비트의 1%를 의미한다.
Generation[Intelligent Fuzzer]
Dumb Fuzzer와는 대조적으로 파일의 포맷[형식]이나 프로토콜[규약]을 이해하고 그것에 맞추어 적절한 input을 생성하는 방식이 Generation 기반 퍼징이고, 명세에 따라 밑바닥부터 철저히 구현해야 하므로 Intelligent Fuzzer라고 불리기도 한다.
Peach Fuzzer를 가지고 예를 들어보면, 대표적인 Smart 퍼저이며, Mutation 방식과 Generation 방식을 둘 다 사용할 수 있다.PeachPit 파일이라는 것을 생성함으로써 동작하는데, 해당 파일은 데이터 구조,파일 종류,데이터 간의 관계 등을 포함하는 XML 파일이다.
Peach는 해당 파일을 통해 모델링을 수행하고, 여러 동작을 수행하게 된다. 아래는 HTTP 프로토콜을 위한 PeachPit 파일의 예시다.PeachPit에는 최소한 한 개 이상의 data model이 포함되어 있고, 이를 통해 새로운 다양한 데이터를 새롭게 생성하여 퍼징을 수행한다.
-t 옵션을 통해 피지 XML 파일을 파싱한다.
-1 옵션을 이용해 1번만 반복만을 수행하고 -debug 옵션을 통해 디버그 메시지에 대한 디버그를 진행한다.로그 기록 데몬과 에이전트를 구성함으로써, 진행 상황과 잘못된 액션 등을 추적할 수 있다.
비교
Mutation 기반 방식이 Generation 기반 방식보다 접근 하기 쉽지만 [대상 파일 포맷의 이해가 필요 X], 대부분의 경우 생성 방식이 다양한 입력 데이터를 포함하고 코드 범위와 실행 경로들을 더 많이 커버할 수 있기 때문에 더 퍼징 결과가 좋게 나타난다.또한 생성 방식이 시간이 좀 더 오래 걸리는데 퍼징 프로세스에 대해 좀 더 많은 것을 고려하기 때문이다. 즉 상황에 따라 좀 더 이득이 되는 방식을 사용하는 것이 바람직하다.
퍼징의 장점
퍼징은 정의,접근 기반 테스팅 방법에서는 찾을 수 없는 버그를 찾을 수 있게 해주는 랜덤 테스팅 방식이다.즉 무작위로 테스팅을 하는 기법으로 정의된 것만 테스트하는 접근 방식으로는 해결할 수 없는 부분까지 버그를 찾아내는 것이다.이는 실제 입력과 프로세스 시작 직전에 시작한 사항들에 대한 탐구 가능한 이슈를 파악한다.다루기 쉽고 초기 설정이 용이하고, 초기 설정한 부분만 제대로 된다면 재사용하기 간편하다.
퍼징의 단점
퍼징은 간단한 버그는 꽤 효과적으로 탐지한다.특히 위에서 말한 Black-Box 테스팅 방식에서 꽤 효과적이지만 내부적으로는 한계가 존재한다.퍼징의 영향도를 체크할만한 정보가 적은데 이 말은 프로토콜,파일 구조 스펙 문서를 작성하는 것이 난이도가 꽤 있는 일이다.랜덤 접근 방식은 랜덤이라는 것은 물론 장점이지만, 경계값에서 발생하는 이슈는 찾기 힘들다는 단점이 있다.
Reference Link => https://resources.infosecinstitute.com/fuzzing-mutation-vs-generation/
'#Fuzzer' 카테고리의 다른 글
#8.FOE Fuzzer Practice. (0) | 2018.05.25 |
---|---|
#7.Vulnerabilities exploited using FOE. (0) | 2018.05.25 |
#6.FOE Fuzzer Windows Additional Information. (0) | 2018.05.25 |
#5.FOE Fuzzer. (0) | 2018.05.25 |
#4.BFF Fuzzer Option. (0) | 2018.05.23 |