퍼징(Fuzzing)은 1990년대 초반에 등장한 이후 소프트웨어 테스팅에서 널리 쓰이게 되었고, KAIST SoftSec 연구실과 KAIST 사이버보안연구센터에서 관리 중인 https://fuzzing-survey.org/ 에 따르면 새롭게 공개된 퍼저의 수가 매년 점점 증가하고 있습니다[1,2].
그렇다면 새롭게 만들어지는 많은 퍼저 중 어떤 퍼저가 성능이 좋을까요? 평가 기준은 어떻게 정하게 되는 걸까요? 이번 포스팅에서는 이러한 퍼저의 성능을 평가하기 위해 만들어진 소프트웨어 테스팅 분야 국제 대회인 Test-Comp에 대해 간략히 알아보고 Test-Comp에 추가된 새로운 퍼저 벤치마크 ‘Fuzzle’에 대해 소개하겠습니다.
Fuzzle[3]은 KAIST 사이버보안연구센터 이하은 연구원이 KAIST 정보보호대학원(Softsec Lab) 석사과정 중에 수행한 연구로 ASE’22 컨퍼런스에서 최우수논문상(ACM Distinguished Paper Award)을 수상하여 인정을 받았을 뿐만 아니라 최근에 소프트웨어 검증을 위한 국제 대회인 Competition on Software Testing (Test-Comp 2024) 에 공식적으로 포함되어 앞으로 퍼저 성능을 가리는 하나의 기준이 되었습니다.
ㆍ퍼징 연구 관한 내용은 이전 블로그 글 참고하세요 : 원문(영문) / 번역(국문)
Competition on Software Testing (Test-Comp)
Competition on Software Testing (Test-Comp)는 2023년 기준 5회째 맞고 있으며 자동화된 소프트웨어 테스팅을 통해 퍼징 기술의 성능과 효율성을 평가하는 대회입니다. 또한 Test-Comp는 소프트웨어 테스팅에 대한 기준을 만들어 연구자들이 개발한 새로운 퍼징 도구의 성능 비교를 위한 대규모 벤치마크를 제공하고, 최신 기술에 대한 발표 기회를 제공하는 것을 목표로 하고 있습니다[4,5].

그림 1. Test-Comp 대회 평가 과정[5]
대회의 참가한 퍼저들의 성능평가는 [그림 1]과 같이 각각의 벤치마크 프로그램 별로 Cover-Error(버그 탐지)와 Cover-Branches(Branch 커버리지) 능력을 점수화하여 순위를 매기는 방식입니다. 2023년도의 결과는 Software Testing: 5th Comparative Evaluation: Test-Comp 2023 논문에서 확인할 수 있습니다.
최근 센터에서는 Fuzzle을 활용하여 생성한 프로그램을 Test-Comp 벤치마크 프로그램으로 포함시켰으며 2024년 대회부터 공식적인 벤치마크 중 하나로 활용될 예정입니다. Fuzzle을 활용하여 실제 취약점 정보를 가지고 있는 프로그램을 포함하여 총 15개의 프로그램을 제출하였으며 SV-Benchmark GitLab에 접속하시면 Fuzzle로 생성된 Test-Comp Program을 확인할 수 있습니다.
( Fuzzle Test-Comp Benchmark: https://gitlab.com/sosy-lab/benchmarking/sv-benchmarks/-/tree/main/c/fuzzle-programs)
새로운 퍼저 평가 도구 “Fuzzle”
Fuzzle은 새로운 종류의 버그를 합성하는 도구(Bug Synthersizer)로 기존의 벤치마크 프로그램의 단점을 보완하는 벤치마크 프로그램을 생성하는 도구입니다. 현재 많은 퍼징 연구들에서는 GNU Binutils[6], CGC[7], Google Fuzzer-test-suite[8], FuzzBench[9]와 같은 벤치마크 프로그램을 사용하여 퍼징도구를 평가합니다. 하지만 이러한 벤치마크 프로그램을 사용했을 때에는 단점이 존재합니다. 먼저, 기존 공개된 벤치마크 도구는 그대로 유지되는 경향이 있으므로 기존 벤치마크에 과적합되는 퍼저를 만들수 있습니다. 예를 들어 특정 벤치마크에서 좋은 성능을 위해 다양한 휴리스틱을 사용하는 퍼저가 있으면 다른 벤치마크와 달리 제대로 된 평가를 하기 어렵습니다. 이러한 과적합 문제를 해결하기 위한 방법으로 새로운 프로그램을 추가하여 벤치마크를 업데이트 하는 방법이 있으나 새 프로그램을 분석하고 벤치마크에 추가하여 업데이트 하는 것은 상당한 작업이 필요하고, 평가를 방해하는 예상치 못한 버그가 포함 될 수 있습니다. 또한, 각 프로그램에 얼마나 많은 버그가 있는지, 버그가 어디에 있는지 정확히 알 수 없기 때문에 퍼저의 효율성을 평가하기 어렵습니다.
따라서 Fuzzle 연구에서는 기존 Bug Synthesizer의 6가지 목표에 두가지의 벤치마크 테스트를 위한 목표를 추가하여 목표로 설정하였습니다. 8가지 목표는 다음 [표 1]과 같습니다.

[표 1] Bug Synthesizer 비교
- Unbiased – 공정한 평가를 위해 편향되지 않는 버그를 생성해야 됨
- Deep – 많은 분기를 통과해야만 도달할 수 있는 깊은 버그를 생성해야 됨
- Rare – 극히 일부의 Input 값에 의해서만 유발되는 버그를 생성해야 됨
- Uncorrelated – 버그가 서로 독립적으로 작동하도록 연관성이 없는 버그를 생성해야 됨
- Reproducible – 재현이 가능한 버그를 생성해야 됨
- Realistic – 실제 경로를 실행하여 트리거 할 수 있는 버그를 생성해야 됨.
- Providing Ground Truth – 평가를 위해 버그 갯수와 위치와 같은 정보를 제공해야 됨
- Visualizable – 퍼징 과정의 진행상황을 직관적으로 파악할 수 있도록 퍼저의 시각적 피드백을 제공해야 함
기존 도구(LAVA, EvilCoder, Apocalypse, Bug-Injector, FixReverter )에서는 8가지 기준을 모두 충족하는 도구는 없습니다. 예를 들어 EvilCoder와 FixReverter는 정적 분석을 사용하기 때문에 항상 트리거 가능한 버그를 생성하지 못하고, 기존의 도구들에서는 모두 버그의 정확한 개수와 위치를 제공하지 않습니다. 하지만 Fuzzle에서는 8가지의 기준을 모두 충족하도록 설계되었습니다.

그림 2. Fuzzle Approch – 미로 기반 버그 합성 알고리즘
Fuzzle은 소프트웨어 테스팅과 미로를 푸는 것 둘 다 특정 경로를 찾아간다는 점에서 유사하다는 관찰에서 영감을 얻었습니다. 이를 바탕으로 Fuzzle은 미로기반으로 버그가 있는 C 프로그램을 자동으로 합성하는 새로운 버그 합성 알고리즘을 제안하였습니다.

그림 3. Fuzzle의 아키텍처
따라서 Fuzzle의 아키텍처는 [그림 3]과 같은 순서로 이루어집니다.
미로 생성 알고리즘 중 하나를 사용하여 임의의 미로를 생성합니다(Maze Generation).
- 미로 생성 알고리즘 중 하나를 사용하여 임의의 미로를 생성합니다(Maze Generation).
- 생성된 미로의 방을 그래프의 노드로, 방과 방 사이의 통로를 그래프의 간선으로 바꾸어 그래프를 생성합니다(Graph Generation).
- 생성된 그래프를 이용하여 코드 템플릿을 생성하고 생성된 템플릿은 미로의 경로를 일련의 함수 호출로 인코딩합니다(Template Generation).
- Fuzzle은 유저가 제공한 매개변수 중 하나인 SMT formula를 사용하여 이전 단계에서 만들어진 템플릿의 자리 표시자를 채워 C 프로그램을 생성합니다.(Program Rendering)
이처럼 미로 기반 프로그램을 생성하는 Fuzzle은 여러 장점이 있습니다.
먼저 입구에서 출구까지의 경로가 있는 미로를 사용하여 프로그램을 만들기 때문에 합성된 프로그램 안에 버그까지 도달하는 경로가 포함되어 있음을 보장할 수 있습니다. 두번째로, Fuzzle이 조건식을 만들기 위해 사용되는 SMT formula를 구할 때 실제 CVE를 사용함으로써 실제 버그의 경로 조건을 프로그램 생성에 사용할 수 있습니다. 세번째로, 평균적으로 약 10초 내에 프로그램을 생성할 수 있으며, 기존 프로그램에 의존하지 않기 때문에 쉽게 벤치마크를 확장하여 더 큰 프로그램을 만들 수 있습니다. 또한, 시각화가 가능하다는 장점이 있습니다.

그림 5. 미로 생성 알고리즘에 따른 Fuzzle 시각화 결과 (빨간색: 커버X, 초록색: 커버O)
Fuzzle 논문에서는 벤치마크 결과의 시각화를 위해 세 가지 다른 미로 생성 알고리즘(backtracking, Prim’s, Sidewinder)과 CVE-2016-4491에서 얻은 경로 공식을 사용하여 프로그램을 생성하고 생성한 각 프로그램을 AFL을 24시간 동안 한 번씩 실행하는 방식으로 실험을 진행하였습니다(다른 매개변수에는 동일)
테스트 결과 branch 커버리지는 각각 31.2%, 42.4%, 60.2%을 확인함과 동시에 [그림 5]와 같이 색깔을 사용하여 어떤 지역을 커버했는지 알 수 있었습니다. 이 때 주황색으로 표시된 부분은 SMT formula에서 가져온 조건식으로 채워진 곳을 나타내고 따라서 이는 프로그램 시작에서 버그까지의 경로를 보여줍니다. 따라서 Fuzzle을 사용하면 AFL이 프로그램에서 버그를 찾는 데 얼마나 근접했는지 쉽게 알 수 있습니다.
* 추가적인 실험 결과 및 상세한 내용은 “Fuzzle: Making a Puzzle for Fuzzers”[3] Paper를 참고하세요.
글을 마치며
본 포스팅에서는 ‘Fuzzle’에 대해 소개해보았습니다. Fuzzle은 기존 연구들과 달리 버그 합성을 위해 기존 프로그램에 의존하지 않는 최초의 Bug Synthersizer로 이를 활용한다면 퍼저의 성능을 평가하는데 존재하는 기존의 단점들을 극복할 수 있습니다. 실제로 Fuzzle로 생성한 15개의 벤치마크 프로그램은 2024년 Test-Comp 대회에서 하나의 평가 기준으로 사용될 예정입니다. 추후 다양한 연구들에서 Fuzzle를 활용하여 공정하고 효율적인 퍼징 시스템 평가를 위해 사용되기를 기대해봅니다. Fuzzle은 SoftSec-KAIST Github에 공개되어 있으며 https://github.com/SoftSec-KAIST/Fuzzle 에 접속하시면, 사용할 수 있습니다.
Reference
[1] Manès, Valentin JM, HyungSeok Han, Choongwoo Han, Sang Kil Cha, Manuel Egele, Edward J. Schwartz, and Maverick Woo. “The art, science, and engineering of fuzzing: A survey.” IEEE Transactions on Software Engineering 47, no. 11 (2019): pp. 2312-2331.
[2] Valentin Manès, “A Fuzzing Mirkwood”, KAIST CSRC Weblog https://csrc.kaist.ac.kr/blog/2020/12/30/a-fuzzing-mirkwood/
[3] Lee, Haeun, Soomin Kim, and Sang Kil Cha. “Fuzzle: Making a Puzzle for Fuzzers.” In 37th IEEE/ACM International Conference on Automated Software Engineering, pp. 1-12. 2022, https://softsec.kaist.ac.kr/~sangkilc/papers/lee-ase22.pdf
[4] “Test-Comp Webpage”, https://test-comp.sosy-lab.org/2024/
[5] Beyer, D. (2023). Software Testing: 5th Comparative Evaluation: Test-Comp 2023. In: Lambers, L., Uchitel, S. (eds) Fundamental Approaches to Software Engineering. FASE 2023. Lecture Notes in Computer Science, vol 13991. Springer, Cham.
[6] “GNU Binutils”, https://www.gnu.org/software/binutils/
[7] “Cyber Grand Challenge”, http://www.lungetech.com/cgc-corpus/
[8] “fuzzer-test-suite,” https://github.com/google/fuzzer-test-suite
[9] Metzman, Jonathan, László Szekeres, Laurent Simon, Read Sprabery, and Abhishek Arya. “Fuzzbench: an open fuzzer benchmarking platform and service.” In Proceedings of the 29th ACM joint meeting on European software engineering conference and symposium on the foundations of software engineering, pp. 1393-1403. 2021.

KAIST 사이버보안연구센터 바이너리분석팀 연구원으로 강력한 타입 시스템과 직관적인 프로그래밍이 가능한 F#을 활용하여 바이너리 분석 도구 개발 및 다양한 연구를 수행하고 있다.

KAIST 사이버보안연구센터 바이너리분석 팀원으로 퍼징 및 소프트웨어 테스팅 연구를 진행하고 있다.