탐색과 활용 기법의 퍼징 적용례와 아이디어
[essay] 2 min read
Abstract
탐색과 활용 기법에 영감을 받아, 현재의 다중 지향성 퍼징 연구에서 사용하는 자원 분배 전략이 악수가 되는 경우를 방지하고자 한다. 현재는 마땅한 탐색 기간 없이, 에너지를 더 쏟을 목표지점을 한 가지 전략으로 정하고 있지만, 이 전략이 더 큰 정체를 불러올 경우는 다른 좋은 목표지점이 있는지 조금씩 집중지점을 옮기며 탐색하는 게 좋을 것이다.
본문
퍼징에서는 유한한 시간 자원을 탐색과 활용 사이에 어떻게 배분할지에 대한 고민이 존재한다. 탐색은 우수한 퍼징을 위한 여러 선택지를 시험해 보는 과정이며, 활용은 그중에서 효과적인 방법을 사용하는 단계이다. 각 변형에 사용할 입력값이나 코드의 특정 부분에 집중하는 시간 배분 방식 등에서 선택지가 생기며 좋은 선택지는 프로그램에 따라 달라진다. 따라서 다양한 선택지를 약간씩 시도하는 것이 탐색의 핵심이다.
기존의 무지향성 퍼징에서 주로 사용하는 기준은 코드 덮이(coverage)이다. AutoFz는 여러 전략 중 하나를 잠깐 실행하고 원래 상태로 돌아오기를 반복하여 분기 덮이(branch coverage)를 가장 증가시키는 전략을 파악해 쓴다. FishFuzz는 함수 덮이를 극대화하는 방식으로, 도달하기 어려운 함수를 탐색하고 해당 함수에 도달하는 입력값에 집중한다.
현재 우리의 다중 지향성 퍼징은 따로 탐색 기간을 두지 않고, 각 목표로 향하는 데이터 흐름의 코드 덮이를 기준으로 자원을 분배하기를 반복한다. 구체적으로는 데이터 흐름 덮이 증가가 정체된 목표에 자원을 집중하는데, 이는 탐색이 정체된 목표에 집중하자는 발상이다. 모든 목표지점을 공평한 깊이로 탐색함으로써, 모든 지점의 오류를 찾는 총 시간이 줄어들리란 판단이었다.
하지만 탐색 없이 특정 조건의 목표에만 집중하는 전략은 항상 성과를 보장하지는 않았다. 일단 집중하고 있는 목표가 애초 시간 내 유발이 불가능했을 수가 있다. 데이터 흐름의 덮이는 정체되어 계속 집중해야 하는데, 발견의 가망도 없으니 엉뚱한 곳에 힘이 소외되는 셈이다. 또한 집중에서 빠진 오류는 지원을 덜 받으므로, 일부 프로그램에서는 집중 전략이 없었을 때 제한 시간내 찾을 수 있었던 오류가 이젠 놓쳐지는 문제도 발생한다.
현재 전략의 문제를 해결하기 위해, 필요 시 탐색 단계를 도입하는 걸 제안한다. 만약 집중 전략이 전체적인 퍼징의 비효율을 유발한다면, 꼭 덮이가 정체된 지점이 아니더라도 퍼징이 다시 진전을 이룰 수 있도록 하는 지점이 있는지, 약간씩 돌아가며 집중해 성능을 평가하는 방식이 될 것이다. 이는 기존의 집중’만’ 있던 전략보다 더 세밀하게 자원을 관리하고, 정적 분석으로 얻은 데이터를 더 깊이 활용해 효율적인 퍼징을 가능하게 할 수 있다.