Park, Geon (re-st)

퍼징의 다양한 결과 측정 방법

[essay] 4 min read

Abstract

퍼징 도구들의 성능을 평가하는 다양한 방법들이 존재하며, 각 방법은 퍼징의 목적과 특성에 따라 다르게 적용된다. 주요 성능 평가 지표의 사용례와 다중 지향성 퍼징을 위한 기존의, 그리고 새로운 지표를 소개한다.

본문

퍼징은 무작위 입력 생성으로 프로그램의 오류를 재현한다는 주 목적 아래 여러 가지 하위 분류가 있고, 각 분류의 목적에 맞는 평가기준이 사용되고 있다. 예로, 무지향성 퍼징의 목표는 코드의 많은 부분을 건드려 많은 오류를 잡는 것이므로, 그에 맞게 덮이나 발견된 고장입력 (crash)의 수를 비교한다. 이 비교를 쉽게 만들어주는 대표적 도구로 Fuzzbench가 있다.12 한편 단일 지향성 퍼징의 목표는 특정 버그를 빨리 발견하는 것이므로, 그에 맞게 버그 재현 시간 (Time-To-Exposure)이 주로 사용된다. Beacon처럼 정적분석 등의 사전단계가 있으면 그 시간을 병기하기도 한다.3

다중 지향성 퍼징은 무지향성과 단일 지향성의 사이에 있으므로, 그 목적도 두 마리 토끼를 같이 잡는 것이 된다. 즉, 제한 시간 내에 많은 목표지점의 오류를 재현하는 것과, 모든 오류를 재현하는 시간이 빠르길 바라는 두 가지이다. 많은 다중 지향성 논문은 이를 특별히 이야기하지 않고 자신이 두 가지에서 모두 뛰어나다거나, 혹은 한 가지 기준만을 사용하곤 하는데, 이는 때로 비교의 옹색함을 가져오기도 한다.

버그 재현 시간을 기준으로 다중 지향성 퍼징과 다른 퍼징, 특히 단일 지향성 퍼징을 비교할 때에는 형평성에 문제가 생길 수 있다. 다중 지향성 퍼징 도구인 Titan은 단일 지향성 퍼징에서 각 목표 오류를 재현하는 시간을 합산한 값을, Titan이 재현한 최종 오류의 재현 시간과 비교한다.4 이러한 비교는 단일 지향성 퍼징이 모든 오류를 직렬로 재현하는 총 시간이라는 시나리오에서는 적절할 수 있다. 하지만, 목표 오류를 발견하자마자 즉시 다음 퍼징으로 이동한다는 가정은 비현실적이며, 제한시간 내에 재현되지 않는 오류가 여러 개 있을 경우 단일 지향성 퍼징에서는 시간 제한 값이 반복적으로 더해져 불리하게 작용하는 문제도 내포하고 있다.

다중 지향성 퍼징에는 두 목적을 한 지표에 나타내고, 단일 지향성 퍼징과의 비교도 공평하게 하는 방법이 필요한데, 이를 위해 곡선 아래 면적 (Area Under Curve)를 제안할 수 있다. 매 실행별로 시간 대비 재현된 목표오류 개수를 그래프로 나타낸 뒤 아래 면적을 재는 것으로, 재현된 목표오류 개수의 시간적분이기도 하고 축을 뒤집어 보면 목표 별로 오류가 재현되고 나서 남은 시간의 합이기도 하므로 양 축을 종합적으로 평가할 수 있다. 시간제한에 걸리는 오류가 여럿 있더라도 이는 단일 지향성과 다중 지향성에 공평하게 적용되며, 단일 지향성의 결과를 그래프에서 어떤 순서로 쌓느냐에 따라 단일 지향성 퍼징을 직렬로 돌리는 여러 시나리오를 정의하고 또 비교해 볼 수 있다는 장점도 있다.

한편 그래프에서 하나의 수치를 뽑아낼 필요 없이, 그래프 자체가 알기 쉬운 평가 지표가 되는 경우도 있다. 그 예로 퍼징끼리 어떤 오류를 더 잘 찾는지 비교하는 도구인 MAGMA가 있다. 목표오류 별로 시간 대비 미발견 실행 횟수를 그래프로 표시한 뒤, Kaplan-Meier 추정법을 이용해 그래프 선의 위 아래로 신뢰 구간을 표시하는데, 이 덕분에 퍼징 간 성능 차이가 어느 정도까지 극적인지 쉽게 확인할 수 있다.5 기존에 지표가 한 가지였던 경우 두 퍼징의 차이를 가늠하기 위해 주로 쓰던 Mann-Whitney U 의 결과값보다, 오히려 더 알아보기 쉬운 장점도 있는 것이다. 따라서 다중 지향성 퍼징이 두 가지 목표가 있는 게 꼭 성능 비교에 어려움만을 가져다주는 것은 아닐 수 있다.

마지막으로 논문에서 제시하는 주 아이디어가 실제 결과에서 성립하는지 보기 위해, 퍼징 성능과 관계없는 지표를 추가로 제시하는 경우도 많이 있다. 예로 다중 지향성인 AFLRun의 경우 얼마나 목표오류들에 에너지를 공평히 투자했는지가 관건이기에 목표별 에너지 투자량을 그래프로 나타내 그 평평함을 자랑한다.6 우리도 이해하기 쉬운 주 아이디어를 잡고 이를 직관적으로 보여준다면 자타인의 이해에 큰 도움을 줄 것이다.

그러나 고장입력 중복 제거 (crash deduplication)가 없으면 결과는 애매해지고 만다. 따라서, 이를 엄밀하게 할 겸 코드에 직접 버그의 위치와 유발조건을 정의하는 것이다. 이 경우 버그 위치 도달시간과 유발시간을 따로 검사 가능하다는 장점이다. FishFuzz는 고장입력의 실행 기록을 토대로 눈으로 비교해 유발조건을 찾지만, Magma 벤치마크는 코드 안전벨트처럼 코드 안에 심어 놓는다.75

마지막으로, 퍼징 도구 성능 비교 시에는 Mann-Whitney U 테스트 등 통계적 방법을 사용하여 퍼징 간의 차이를 검증할. 이러한 통계적 분석은 단순한 성능 비교를 넘어, 퍼징 도구가 얼마나 공평하게 자원을 분배했는지, 혹은 주장한 이론적 근거가 실제로 성립하는지를 확인하는 데 중요한 역할을 한다.

마지막으로 논문들에서 자기들의 방법이 맞다는 것과 결과 수치 비교뿐이 아닌, 그 과정에서 자신들이 생각하는 대로 값이 나온다는 것에 - 예로, titan의 경우 자신들이 주장하는 목표오류 간 상관관계의 수가 많다는 걸 증명한다던지, AFLRun의 경우 얼마나 목표오류들에 공평히 에너지를 썼는지 말이다.



  1. Jonathan Metzman et al., “FuzzBench: an open fuzzer benchmarking platform and service”, 2021. ↩︎

  2. Dario Asprone et al., “Comparing Fuzzers on a Level Playing Field with FuzzBench”, 2022. ↩︎

  3. Heqing Huang et al., “Beacon: Directed grey-box fuzzing with provable path pruning”, 2022. % ↩︎

  4. Heqing Huang et al., “Titan: Efficient Multi-target Directed Greybox Fuzzing”, 2024. ↩︎

  5. Ahmad Hazimeh et al., “Magma: A Ground-Truth Fuzzing Benchmark”, 2020. ↩︎ ↩︎

  6. Huanyao Rong et al., “Toward Unbiased Multiple-Target Fuzzing with Path Diversity”, 2023. ↩︎

  7. % Han Zheng et al., “FISHFUZZ: Catch Deeper Bugs by Throwing Larger Nets”, 2023. ↩︎

#Essay  #Weekly-Writing 

<< Previous Post

|

Next Post >>

← 뒤로