퍼징(Fuzzing)이란?
Fuzz 테스트(또는 퍼징)은 자동화 테스트로 기형/반기형적 데이터를 주입하여 소프트웨어 버그를 찾는 블랙박스 테스팅 기술입니다.
퍼징의 이해
간단한 예시
사용자가 0, 1, 2 숫자 중 하나를 선택하여 입력하는 프로그램을 가정하겠습니다. 이는 세 가지 실제 실행경로를 만듭니다. 하지만 3 또는 255를 전송하면, 정수는 정적크기 변수에 저장되기 때문에 전송되어질 수 있습니다. 기본 Switch-case가 안전하게 구현되지 않은 경우 프로그램이 전통적인 보안문제인 버퍼 오버플로우 등의 메모리 문제가 발생할 가능성이 내제합니다. 퍼징은 이러한 소프트웨어의 구현 결함을 자동으로 찾는 것이 목적입니다.
히스토리
Fuzz 테스트는 Barton Miller 교수와 학생들이 1989년 WISC에서 개발했습니다.(http://www.cs.wisc.edu/~bart/fuzz) 주로 커맨드라인 인터페이스 및 UI 퍼징을 지향하며 최신 운영체제에서도 단순한 퍼징으로 취약점을 찾아내었습니다.
퍼징의 구현
Fuzzer는 프로그램 혹은 메모리 스택에 자동으로 반무작위 데이터를 주입하고 버그를 탐지합니다.
데이터 생성은 생성기로, 취약점 탐지는 디버깅 도구에 의존합니다. 생성기는 일반적인 퍼징 벡터(위험한 것으로 알려진 값 목록) 또는 완전한 무작위의 데이터 조합을 사용합니다. 최신의 Fuzzer는 유전 알고리즘을 사용하여 주입된 데이터와 그 영향을 연결하지만 아직 이러한 도구 중 공개된 것은 없습니다.
공격 유형
Fuzzer는 아래와 같은 공격조합을 시도하여 프로그램 결함을 유도합니다.
- numbers (signed/unsigned integers/float…)
- chars (urls, command-line inputs)
- metadata : user-input text (id3 tag)
- pure binary sequences
퍼징에 대한 일반적인 접근 방식은 각 유형에 대해 위험한 것으로 알려진 값(퍼징 벡터) 목록을 정의하고 이들을 주입하거나 재조합하는 것입니다.
어플리케이션 퍼징
어플리케이션 Fuzzer의 공격 벡터는 항상 입출력 범위 내에 있습니다.
- the UI (testing all the buttons sequences / text inputs)
- the command-line options
- the import/export capabilities (For a web app: urls, forms, user-generated content, RPC requests, etc)
파일형식 퍼징
파일 형식 Fuzzer는 여러 개의 잘못된 샘플을 생성하고 순차적으로 엽니다. 프로그램이 충돌하면 추가 분석을 위해 디버그 정보가 유지합니다.
다음을 공격할 수 있습니다.
- the parser layer (container layer): file format constraints, structure, conventions, field sizes, flags, …
- the codec/application layer: lower-level attacks, aiming at the program’s deeper internals
정리
퍼징의 장점
퍼즈 테스트의 가장 큰 장점은 테스트 디자인이 매우 간단하고 사람이 하는 테스트와 달리 시스템 동작에 대한 편향성이 없다는 것입니다. 체계적/무작위 접근 방식을 사용하면 사람의 눈으로 자주 놓칠 수있는 버그를 찾을 수 있습니다. 또한 완전히 닫힌 시스템에 대한 퍼징은 품질을 검토하는 유일한 수단 중 하나입니다.
퍼징의 한계
Fuzzer는 일반적으로 간단한 버그를 찾는 경향이 있습니다. 또한 프로토콜을 더 많이 인식할수록 이상한 버그를 찾는 확률이 줄어 듭니다. 이러한 이유때문에 퍼징 커뮤니티에서는 아직도 완전한 무작위적인 접근 방식이 여전히 인기있습니다.
또 다른 문제는 블랙박스 테스트를 통해 퍼징 수행시 폐쇄된 시스템을 공격하여 발견된 취약점의 위험/영향성을 분석하기 어려운 점입니다.
왜 퍼징인가?
퍼징의 목적은 모든 프로그램 내에 항상 잔존하는 버그가 있다는 가정을 전제합니다. 따라서 체계적인 접근 방식을 통해 이러한 버그를 찾아야합니다.
퍼징은 기계적인 접근방식으로 기존 소프트웨어 테스트 기술(코드 리뷰, 디버깅)에 또 다른 관점을 추가 할 수 있습니다. 이를 완전히 대체하지는 못하지만 다른 단점을 보완해줄 수 있는 합리적인 보완책입니다.
출처: owasp.org