Park, Geon (re-st)

AFL의 휴리스틱 알고 쓰기

[essay] 2 min read

Abstract

AFL 퍼징의 높은 성능을 만들어주는 휴리스틱의 목적과 이를 응용한 퍼징 도구의 사례를 서술한다. AFL 위에 새 기능을 추가할 때는 기존 휴리스틱이 망가지지 않도록 주의하며, 또한 이를 적절히 활용할 줄 알아야 한다.

본문

AFL은 간결하면서도 강력한 퍼징 도구이다. 사용자가 제공한 입력값 주머니에서 출발하여, 입력값을 하나 꺼내 변형한 자손들을 생성하고, 그중 코드의 간선 덮이 (edge coverage)를 확장한 자손을 주머니에 넣는 과정을 반복하며 프로그램 전 부분을 탐색한다. 간결하게도 간선 덮이 외에는 대상 코드의 추가 정보를 요구하지 않지만, 대부분의 퍼징 연구에서 비교 대상으로 꼽힐 만큼 뛰어난 성능을 자랑한다.

AFL의 성능 아래에는 빠른 실행과 깊이 있는 탐색을 가능하게 하는 휴리스틱이 있다. 예를 들어, AFL은 실행 덮이를 모두 포함하는 작고 빠른 입력값들의 부분집합을 관리하며, 주머니에서 입력값을 꺼낼 때 부분집합을 크게 우대하여 실질적인 입력값 주머니 크기를 축소한다. 이를 통해 덮이가 겹치는 입력값의 실행을 줄이고 새로운 경로를 빠르게 탐색할 수 있다. (관리는 입력값의 ‘favored’ 태그로 이루어진다.)

또한, AFL은 입력값의 덮이, 실행 속도, 그리고 해당 입력값이 초기 입력값에서부터 몇 단계를 거쳐 발전했는지 그 깊이를 바탕으로 자손의 수를 결정하여, 도달하기 어려운 코드 영역을 탐색할 확률을 높인다.

AFL을 기반으로 한 퍼징 도구들은 목적에 맞게 휴리스틱을 약간씩 조정해 쓰기도 한다. 예를 들어, FishFuzz는 아직 도달하지 못한 함수에 가까운 입력값을 부분집합에 넣어 탐색을 가속화하고, DAFL은 목표 지점까지의 데이터 흐름에서 덮이와 깊이가 우수한 입력값의 자손을 많이 만들어 효율을 높인다.

직접 AFL 위에 다른 기능을 추가하는 연구자에게 이러한 휴리스틱의 이해는 필수적이다. 예를 들어, 현재의 다중 지향성 연구에서 이미 재현된 오류 지점에 대한 정보를 제거할 때 휴리스틱의 전역 변수를 갱신하지 않으면 성능 저하가 발생할 수 있으며, 새로운 목표 도달 가능성을 비교할 때도 AFL의 휴리스틱을 어떻게 활용할지, 그 근거는 무엇인지 신중히 고민해야 한다.

분류:AFL (퍼징)

#Essay  #Weekly-Writing 

<< Previous Post

|

Next Post >>

← 뒤로