메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
(Fuzzer에서 넘어옴)


개요

FUzzing은 소프트웨어 테스트 기법으로서, 컴퓨터 프로그램에 유효하고 무작우의 데이터를 입력하는 것이다. 이후 프로그램은 잘못된 실행을 하는지에 대한 체크를 통해서 잠재적인 버그를 찾는다. 퍼징은 주로 소프트웨어나 컴퓨터 시스템들의 보안 문제를 테스트하기 위해 사용된다.

퍼징 프로그램의 형태로 변이 기반(Mutation)과 생성 기반(Generation) 두 종류가 있으며, 화이트박스 검사, 그레이박스 검사, 또는 블랙박스 검사에 사용된다.

사용

Fuzzing이 찾은 결과는 프로그램에 버그가 있다는 것을 증명할 수는 있지만, 결과가 없다고 프로그램에 버그가 없다는 것은 증명할 수 없다. 즉, Completeness하지만 Soundness한 방식은 아니다. 따라서 Fuzzing은 Static analysis와 같은 기존의 기법을 완전히 대체할 수는 없다는 것이다. 그러나 Fuzzing은 아주 효과적으로 디버깅에 필요한 잠재적인 버그들을 발견해 내는 것으로 알려져 있으며, 프로그램 디버깅에서 소중한 정보들을 제공한다.

기법

퍼징 프로그램은 두 다른 카테고리로 나뉜다. Mutator는 존재하는 데이터 샘플에서 새로운 데이터 샘플을 만든다. 이에 반하여, Generator은 Model의 Semantic정보에 의해서 새로운 테스트 데이터를 만든다. 간단한 퍼저는 무작위의 데이터를 생성하지만, 정확도가 떨어져 효율적이지 못하다. 이를 올리기 위해서 Program의 Semantic을 이용하여 새로운 데이터를 만들어가는 것이 중요하다.

장점과 단점

단점

퍼징을 프로그램의 결함을 찾는 데 사용할 때 가장 큰 문제점은 단순한 결함만 찾아낼 가능성이 높다는 것이다. 소프트웨어 테스팅 문제는 계산이 매우 복잡하며, 모든 퍼저는 제한된 시간 안에 의미 있는 문제를 찾기 위해 효율적인 방법을 찾아야 한다.

단순한 퍼저는 코드 커버리지가 낮은 경우가 많다. 예를 들어, 입력 데이터가 체크섬을 포함하지만 이를 적절히 갱신하지 않는다면, 퍼저는 단지 체크섬 검증 코드만 실행하게 될 것이다. 코드 커버리지는 퍼저의 성능을 평가하는 데 자주 사용되지만, 이는 퍼저의 품질에 대한 참고자료일 뿐이다.

퍼징에서 사용하는 무작위 입력은 단점으로 보일 수 있는데, 이는 임의의 입력으로 경곗값 조건을 찾는 것이 어렵기 때문이다. 그러나 현재 대부분의 퍼저는 결정론적 알고리즘을 기반으로 입력을 처리하여 이 문제를 해결하고 있다. 예를 들어서, 퍼저들은 다시 퍼징의 Input과 Output을 재현하기 위한 Initial seed정보를 제공한다.

장점

퍼징으로 발견된 버그는 심각한 결함이나 실제로 악용 가능한 보안 취약점일 수 있다. 퍼즈 테스팅이 널리 알려지면서 발견 사례가 많아졌지만, 같은 기법과 도구가 공격자들에 의해 악용되는 경우도 증가하고 있다. 이는 바이너리 분석이나 소스 코드 감사보다 특정 상황에서 유리한 점이 있다.

퍼즈 테스팅은 테스트 과정에서 간과된 오류나 사람이 쉽게 발견하기 어려운 결함을 찾아내는 데 도움을 준다. 이를 통해 애플리케이션 보안을 강화할 수 있다.