Abstract
Fuzzing์ ์๋ํ๋ ๊ณผ์ ์ ํตํด ํ๋ก๊ทธ๋จ์ด ๊ฐ์ง๊ณ ์๋ ์ ์ฌ์ ์ธ ์ทจ์ฝ์ ์ ์๋ณํ๋๋ฐ ์ฌ์ฉ๋๋ ๊ธฐ์ ์
๋๋ค. ๋ณธ ์ฐ๊ตฌ๋ compiler-based ํ๊ฒฝ๋ณด๋ค binary-only ํ๊ฒฝ์์์ fuzzing์ด ๋ ์ด๋ ต๊ณ , ๋นํจ์จ์ ์ด๋ผ๋ ์ ์ ์ฃผ๋ชฉํ๊ณ ์์ต๋๋ค. Compiler-based ํ๊ฒฝ์ ๊ฒฝ์ฐ compiler๋ฅผ ์ง์ ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ ํฅ์์ ์ฉ์ดํ๊ณ , ์ด ๋๋ฌธ์ ๋๋ถ๋ถ์ fuzzing ๊ธฐ๋ฒ๋ค์ compiler-based fuzzing์ ์ค์ฌ์ผ๋ก ๋ฐ์ ๋๊ณ ์์ต๋๋ค. ๋ฐ๋ฉด binary-only fuzzing์ ๊ฒฝ์ฐ ์ด๋ฐ ์ด์ ๋ค์ ์ ํ ํ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๋น๊ต์ ๋ฎ์ ์ฑ๋ฅ์ ๋ณด์ฌ์ฃผ๊ณ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ํ์ค์์ ๋๋ถ๋ถ์ fuzzing์ closed-source๋ฑ์ ์ด์ ๋ก ์์ค์ฝ๋์ ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์ binary-only ํ๊ฒฝ์์ ์งํํด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ๋ณธ ์ฐ๊ตฌ์์๋ binary-only fuzzing์์๋ compiler-based fuzzing์ ์ฑ๋ฅ์ด ๋์ฌ ์ ์๋๋ก ๋๋ fuzzing-enhancing program์ธ ZAFL์ ์๊ฐํฉ๋๋ค.
Background on Fuzzing
์ด ํํธ์์๋ fuzzing์ ๋ํ ์ ๋ฐ์ ์ธ ์ค๋ช
๊ณผ, binary-only fuzzing์์์ ์ด๋ ค์์ ์ ๋ฆฌํ์ต๋๋ค.
An Overview of Fuzzing
Fuzzing์ test case๋ฅผ ์์ฑํ๊ณ , ์ด ์ผ์ด์ค๋ค์ด ๋์ ํ๋ก๊ทธ๋จ์ ๋ฏธ์น๋ ์ํฅ์ ๊ด์ฐฐํ๋ ๊ฒ์ ๋ฐ๋ณตํ๋ฉฐ, ์ต์ข
์ ์ผ๋ก ๋ฒ๊ทธ๋ ํฌ๋์๋ฅผ ์ ๋ฐํ๋ ๊ฒ์ด ๋ชฉํ์
๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก fuzzing์ ๊ณผ์ ์ ์๋ Figure 1๊ณผ ๊ฐ์ต๋๋ค.
Figure 1: A high-level overview of the basic fuzzing overflow
1.
Instrumentation: ํ๊ฒ ํ๋ก๊ทธ๋จ์ code coverage tracking๋ฑ์ ์ํด ์์
2.
Test Case Generation: ์ ํ๋ ์๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก mutation์ ํตํด test case ์์ฑ
3.
Execution Monitoring and Feedback Collection: ๊ฐ test case๋ฅผ ์คํ์์ผ๋ณด๊ณ , ๊ทธ์ ๋ํ feedback์ธ instrumentation์ ์์ง
4.
Feedback Decision-making: ์๋ก์ด code coverage ๋ฐ๊ฒฌ ๋ฑ์ ์กฐ๊ฑด์ ์ถฉ์กฑํ๋ test case๋ง ์ ์ง
5.
1๋ฒ ๊ณผ์ ๋ถํฐ ๋ฐ๋ณต
์์ ๊ฐ์ ๊ณผ์ ์ผ๋ก ์งํ์ด ๋๋ฉฐ, mutation ๋ฐฉ๋ฒ์ด๋ decision-making ๋ฐฉ์์ ๋ฐ๋ผ fuzzer๋ฅผ ๋ถ๋ฅํ ์ ์์ง๋ง, ๋ณธ ์ฐ๊ตฌ์์๋ ์ด ๋ถ๋ถ์ ๋ํด์ ์ง์ค์ ์ผ๋ก ๋ค๋ฃจ์ง ์์์ต๋๋ค.
Coverage-guided Grey-box Fuzzing
Coverage-guided Grey-box Fuzzing์ ๊ฐ์ฅ ๋ง์ด ์ฐ์ด๋ fuzzing ๊ธฐ๋ฒ ์ค ํ๋์
๋๋ค. ์ด ๋ฐฉ์์ ํ๊ฒ ํ๋ก๊ทธ๋จ์ ๋จ์ ๋ธ๋ก(basic block)๋ณ๋ก ์ฝ์
๋์ด์๋ instrumentation์ ๊ธฐ๋ฐ์ผ๋ก, code coverage๋ฅผ ์ธก์ ํ์ฌ fuzzing์ ์งํํฉ๋๋ค. ๋ํ white-box์ black-box์ ๋ถ์ ๋ฐฉ๋ฒ์ ๋ชจ๋ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ โgrey-boxโ๋ผ๊ณ ์นญํฉ๋๋ค.
๋๋ถ๋ถ์ fuzzer๋ค์ ๋ฎ์ overhead๋ฅผ ์ํด ์ปดํ์ผ๋ง ๊ณผ์ ์์ instrumentation์ ์ฝ์
ํ๊ณ , ์ด๋ฅผ ์ํด ์์ค์ฝ๋๊ฐ ํ์ํ ๊ฒฝ์ฐ๊ฐ ๋๋ถ๋ถ์
๋๋ค. ์์ค์ฝ๋ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ binary-only ํ๊ฒฝ์์๋ instrumentation์ ์ฝ์
ํ์ฌ fuzzing์ ์งํํ ์๋ ์์ง๋ง, ์ด ๊ฒฝ์ฐ ์ปดํ์ผ๋ง ๋จ๊ณ ์์ค์ instrumentation์ด ๋ถ๊ฐ๋ฅํ์ฌ coverage tracing์์๋ง ์ต๋ 1000%์ overhead๋ฅผ ์ ๋ฐํฉ๋๋ค. โ์ ์๋ฏธํโ test case์ ํํด์๋ง ๊ณ์ fuzzing์ ์งํํ๋ค๋ ์ ์์ ๋งค์ฐ ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ์ด์ง๋ง, binary-only ํ๊ฒฝ์์๋ ์ด๋ฅผ ํจ์จ์ ์ผ๋ก ํ์ฉํ์ง ๋ชปํ๊ณ ์์ต๋๋ค.
Compiler-based Fuzzing Enhancements
Binary-only ํ๊ฒฝ์์์ fuzzing์ ๋ํด์ ์์๋ณด๊ธฐ ์ ์, ๊ธฐ์กด์ compiler-based fuzzing์์๋ ์ด๋ค ๋ฐฉ๋ฒ์ ํตํด ์ฑ๋ฅ ํฅ์์ ์ด๋ฃจ์๋์ง ์ ๋ฆฌํ์์ต๋๋ค. ๋ณธ ์ฐ๊ตฌ์์๋ ์ฐ์ฐ ๊ณผ์ ์ ํฅ์์ํค๋ Instrumentation Pruning๊ณผ Instrumentation Downgrading, ๊ทธ๋ฆฌ๊ณ Feedback ๊ณผ์ ์ ํฅ์์ํค๋ Sub-instruction Profiling๊ณผ Extra-coverage Behavior Tracking์ ๋ํด์ ์ค๋ช
ํฉ๋๋ค.
Table 1: Popular compiler-based fuzzing-enhancing program transformations, listed by category and effect
[Performance] Instrumentation Pruning
Graph reducibility technique๋ ์ค์ํ์ง ์์ ๊ธฐ๋ณธ ๋ธ๋ก์ ๋ฌด์ํ๋ ๋ฐฉ๋ฒ์ ํตํด ๋ฐํ์ overhead๋ฅผ ๋ฎ์ถ๋ ๋ฐฉ๋ฒ์
๋๋ค. AFL์ ๊ฒฝ์ฐ ์ผ์ ๋น์จ์ ํํด์ ์์์ ์ผ๋ก graph reduction์ ํ์ฉํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด์ ๊ฒฝ์ฐ ์ค์ํ coverage๋ฅผ ๋ฌด์ํ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ๊ธฐ ๋๋ฌธ์, AFL++์ INSTRIM์ ์ค์ ๋ก ์๋ฏธ๊ฐ ์๋ ๋ธ๋ก์ธ์ง ํ์ธํ๊ณ ๋ฌด์ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๋ฐ์ ์์ผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
[Performance] Instrumentation Downgrading
ํ์ฌ ๋๋ถ๋ถ์ fuzzer๋ค์ edge๋ฅผ ํตํด coverage๋ฅผ ์ธก์ ํฉ๋๋ค. ์ฌ๊ธฐ์ edge๋, ๋จ์ ๋ธ๋ก ์ฌ์ด์ branches๋ฅผ ์นญํฉ๋๋ค. ๋ณดํต ์ด edge๋ฅผ coverage ์ธก์ ์ ์์ด ์ผ์ข
์ ํด์๊ฐ์ผ๋ก ์ฌ์ฉํฉ๋๋ค. ๋ค๋ง edge hashing์ ์ฐ์ฐ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ์ต์ํ์ ์ฐ์ฐ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ๋ฐ์ ์ธ performance์์ ์ค์ํ ์ญํ ์ ํ๊ณ ์์ต๋๋ค. ๋ฐ๋ผ์ CollAFL๋ฑ์ fuzzer๋ค์ block์์ instruction์ ์ฝ์
ํ ๋ ๋ ๊ฐ๋จํ๊ฒ ๊ตฌ์ฑํ์ฌ overhead๋ฅผ ๊ฐ์์ํต๋๋ค.
[Feedback] Sub-instruction Profiling
๋๋ถ๋ถ์ coverage-guided fuzzing์ magic bytes์ ์ฒดํฌ์ฌ ๊ฐ์ ๋ณต์กํ ์์๊ฐ ์๋ ๊ฒฝ์ฐ ์ด๋ฅผ ํ์
ํ๋ ๊ฒ์ ์ด๋ ค์์ ๊ฒช๊ณ ์์ต๋๋ค. ๋๋ถ๋ถ์ fuzzer๋ค์ ์์ ์ค๋ช
ํ edge์ block์ ๊ธฐ์ค์ผ๋ก coverage๋ฅผ ์ธก์ ํ๊ธฐ ๋๋ฌธ์, ์ฒดํฌ์ฌ ๋ฑ์ ๊ณผ์ ์ ์ ์ธ์ํ์ง ๋ชปํฉ๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด honggFuzz, CmpCov, laf-Intel๊ณผ ๊ฐ์ fuzzer๋ค์ ๋จ์ผ ๋ฐ์ดํธ ๋น๊ต ๋ฐ ํ์ ๋ช
๋ น์ด ํ๋กํ์ผ๋ง์ ํตํด coverage๋ฅผ ๋์ด๋ ค๊ณ ๋
ธ๋ ฅํฉ๋๋ค.
[Feedback] Extra-coverage Behavior Tracking
์ ํต์ ์ธ ์ฝ๋ ๋ฒ์์์ ๋ฒ์ด๋ ์คํ ๋์๊น์ง ํฌํจํ์ฌ coverage๋ฅผ ์ธก์ ํ๋ ๊ฒ์ ํ์ฌ fuzzing์ ์ฐ๊ตฌ ๋ถ์ผ ์ค ํ๋์
๋๋ค. ๊ธฐ์กด์ fuzzer๋ค์ edge๋ฅผ ํ๋์ ์งํฉ์ผ๋ก ๊ฐ์ฃผํ์ฌ coverage๋ฅผ ์ธก์ ํ๊ธฐ ๋๋ฌธ์, ์์, ์ฆ context์ ๋ํด์๋ ์ธก์ ํ์ง ๋ชปํฉ๋๋ค. ์๋ฅผ ๋ค์ด A โ B โC์ B โ A โC์ ๊ฐ์ edge๋ค์ ๊ฒฝ์ฐ context-insensible coverage๋ ๋ edge๊ฐ ๊ฐ๋ค๊ณ ๊ฐ์ฃผํฉ๋๋ค. ๊ทธ๋ฌ๋ context-sensitive coverage๋ B โ C์ A โ C๋ก ๊ตฌ๋ถํ์ฌ coverage๋ฅผ ๊ณ ๋ คํ๊ฒ ๋ฉ๋๋ค.
Binary-only Fuzzing: the Bad & the Ugly
Binary-only fuzzing์ compiler-based ํ๊ฒฝ์์์ ์ฅ์ ๋ค์ ํ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ๊ณผ ํจ์จ์ด ๋น๊ต์ ๋ฎ์ ํธ์
๋๋ค. ๋ณธ ์ฅ์์๋ ๊ธฐ์กด์ binary-only fuzzing์ด ๊ฐ์ง๊ณ ์๋ ํ๊ณ์ ์ ๋ํด์ ํ๊ตฌํฉ๋๋ค.
Limitations of Existing Platforms
Compiler-based ํ๊ฒฝ์์๋ ์ปดํ์ผ๋ฌ์ ๋น ๋ฅธ ์ฒ๋ฆฌ ์๋๋ฅผ ์ด์ฉํ์ฌ coverage ์ธก์ ์ ํ์ง๋ง, binary-only ํ๊ฒฝ์์๋ ๋ค์ ์ธ ๊ฐ์ง ๋ฐฉ๋ฒ ์ค ํ๋๋ฅผ ํตํด ์ถ์ ๋ฉ๋๋ค.
[1] Hardware-assisted Tracing
Intel PT๋ฑ์ ์ต์ ํ๋ก์ธ์๋ค์ ๊ฒฝ์ฐ, binary code coverage๋ฅผ ์ฝ๊ฒ ์์๋ผ ์ ์๋๋ก ํ๋ ๋ฉ์ปค๋์ฆ์ด ์ ๊ณต๋ฉ๋๋ค. ํ์ง๋ง ์ด ๊ฒฝ์ฐ๋ ๋น์ฉ์ด ๋งค์ฐ ๋๊ณ , compiler-based์ ๋นํด 50%๋๋ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ๋ค๋ ๋จ์ ์ด ์กด์ฌํฉ๋๋ค.
[2] Dynamic Binary Translators
Dynamic binary translating์ ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ๋์ coverage-tracing ํ๋ ๋ฐฉ์์ ๋งํฉ๋๋ค. ๋ํ์ ์ผ๋ก DynamoRIO, PIN, QEMU๋ฑ์ ํ๋ก๊ทธ๋จ์ด ์ฌ์ฉํฉ๋๋ค. ๋ง์ ์ํคํ
์ฒ์ ๋ฐ์ด๋๋ฆฌ ํ์์ ์ง์ํ๋ค๋ ๊ฒ์ด ํฐ ์ฅ์ ์ด์ง๋ง, fuzzing์ ๊ด์ ์ผ๋ก ๋ณด์์ ๋๋ ์ค๋ฒํค๋๊ฐ 600%๊น์ง ๋ฐ์ํ์ฌ ํจ์จ์ฑ์ด ๋ง์ด ๋จ์ด์ง๋ค๋ ๋จ์ ์ด ์์ต๋๋ค.
[3] Static Binary Rewriters
๋ง์ง๋ง์ผ๋ก static binary rewriting ๊ธฐ๋ฒ์ ๊ฒฝ์ฐ, ๋ฐ์ด๋๋ฆฌ๋ฅผ ์คํ์ํค๊ธฐ ์ง์ ์ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ณํ์ํค๋ ๋ฐฉ๋ฒ์
๋๋ค. Static binary rewriting๊ธฐ๋ฒ์ ๊ฒฝ์ฐ AFL-Dynist, RetroWrite, Uroboros, Ramblr ๋ฑ ๋ค์ํ fuzzer๋ค์ด ์ด ๊ธฐ๋ฒ์ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ชจ๋ binary-only ํ๊ฒฝ์ ๊ฒฝ์ฐ ์ ํ์ ์ผ๋ก ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ฑฐ๋ Linux ํ๋ก๊ทธ๋จ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค๋ ๋จ์ ์ด ์กด์ฌํฉ๋๋ค.
Table 2: A qualitative comparison of the leading coverage-tracing methodologies currently used in binary-only coverage-guided fuzzing, alongside compiler instrumentation (LLVM).
์์ Table์ ๋ณด๋ฉด ์ ์ ์๋ฏ์ด, ๊ธฐ์กด binary-only ํ๊ฒฝ์ platform๋ค์ ์ฑ๋ฅ์ ๋ถ์ํด๋ณด์์ ๋, compiler-based fuzzer๋ค์ ์ฑ๋ฅ์ ๋ฐ๋ผ๊ฐ์ง ๋ชปํ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
Fundamental Design Considerations
๋ค์ compiler-based fuzzing์ผ๋ก ๋์์์, compiler ์์ค์์์ instrumentation ์์
์ด binary-only fuzzing์์๋ณด๋ค ํจ์ฌ ํจ๊ณผ์ ์ด์๊ธฐ ๋๋ฌธ์ ํด๋น ๋ฐฉ๋ฒ๋ก ์ ๋ํด ๊ณ ๋ฏผํด๋ณผ ํ์๊ฐ ์์ต๋๋ค. ์ฐ๊ตฌํ์์๋ compiler-based ํ๊ฒฝ์์ fuzzer๋ค์ด transformation ๋ฐฉ๋ฒ์์ ํฌ๊ฒ 4๊ฐ์ง ์ ํ์ ํ๋ ๊ฒ์ ๋ฐ๊ฒฌํ์๊ณ , ๋ณธ ์ฅ์์๋ ๊ฐ๊ฐ์ ์ค์์ฑ์ ๋ํด ๋
ผ์ํ๊ณ compiler-quality instrumentation์ ๊ฐ์ฅ ์ ํฉํ ํน์ฑ์ ์ ์ ํฉ๋๋ค.
[1] Rewriting versus Translation
Dynamic translation์ ๊ธฐ๋ณธ์ ์ผ๋ก emulation์ ํตํด ๋ฐ์ด๋๋ฆฌ์ ์์ค ๋ช
๋ น์ด ์คํธ๋ฆผ์ ์คํํ๊ณ ๋ณ๊ฒฝ(translate)ํ๊ธฐ ๋๋ฌธ์ ๋ง์ ๋น์ฉ์ ํ์๋ก ํฉ๋๋ค. ๋ฐ๋ฉด์ ํ๊ฒ์ ์คํํ๊ธฐ์ ์์์ ์ ์ ์ผ๋ก ์ฐ์ ๋ถ์ํ์ฌ ์ฌ์์ฑ(rewrite)ํ ๊ฒฝ์ฐ, ํจ์ฌ ์ ์ ์์ ๋น์ฉ(๋ฐํ์ ๋ฑ๋ฑ)์ ํ์๋ก ํ๋ฉฐ, ์ด ๊ฒฝ์ฐ compiler-quality ์๋๋ฅผ ๋ฐ๋ผ๊ฐ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ZAFL์ ๊ฒฝ์ฐ์๋ static rewriting์ ํตํ instrumentation code๋ฅผ ์ถ๊ฐํ์์ต๋๋ค.
[2] Inlining versus Trampolining
๋ค์์ coverage๋ฅผ ์ธก์ ํ ๋ฐฉ๋ฒ์ ์ ํํด์ผ ํฉ๋๋ค. ๋๋ถ๋ถ inlining๊ณผ trampolining ์ฌ์ด์์ ์ ํ์ ํฉ๋๋ค. Trampolining์ ๊ฒฝ์ฐ, instrumentation์ ๋ง๋ฌ์ ๋ ๋ณ๋์ ํ์ด๋ก๋ ํจ์๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ํธ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ปํฉ๋๋ค. ๋น์ฐํ payload ํจ์๋ฅผ ํธ์ถํ๊ณ , ํธ์ถํ ํจ์์๊ฒ ๋ค์ ๋์๊ฐ์ผ ํ๊ธฐ ๋๋ฌธ์ ๋์ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค. ๋ฐ๋ฉด inlining์ ๊ฒฝ์ฐ, basic block ๋ด์ instrumentation ๊ธฐ๋ฅ์ ์ฝ์
ํ๋ ๊ฒ์ ์๋ฏธํ๋ค. ์ ๊ฒฝ์ฐ trampolining๊ณผ ๊ฐ์ด ๊ธฐ์กด์ control flow๋ฅผ ๋ฒ์ด๋ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ค๋ฒํค๋๋ฅผ ์ค์ด๋ ๋ฐ ํ์์ ์ด๋ค. ๋ฐ๋ผ์ ZAFL์ ๊ฒฝ์ฐ์๋ inlining ๊ธฐ๋ฒ์ ์ฑํํ์์ต๋๋ค.
[3] Register Allocation
๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ ์ฑ๋ฅ์ ์์ด์ ์ง์ฐ์ ๋ฐ์์ํต๋๋ค. ์ค๋ฒํค๋๋ฅผ ์ค์ด๊ธฐ ์ํด์ ํ์ํ ๋ ์ง์คํฐ๋ง ์ ๊ทผํ๋ ๊ฒ์ด ๊ผญ ํ์ํฉ๋๋ค. ์ปดํ์ผ๋ฌ๋ ๋ณดํต ์ ์ฌ์ฉํ์ง ์๋ ์ฝ๋ ๋ ์ง์คํฐ๋ฅผ ๊ฐ๋ฅํ ๋ง์ด ์ ์ฅ/๋ณต์ํ์ง ์๋๋ก ๋ ์ง์คํฐ ํ์ฑ ์ํ๋ฅผ ์ถ์ ํฉ๋๋ค. ๋ฐ๋ผ์ ์ปดํ์ผ๋ฌ ํ์ง์ ์ด์ง ๊ณ์ธก ์๋๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํด์๋ ์ค๋งํธ ๋ ์ง์คํฐ ํ ๋น์ด ํ์์ ์
๋๋ค.
[4] Real-world Scalability
ํ๋์ ์ปดํ์ผ๋ฌ๋ค์ ๋ค์ํ ์ปดํ์ผ ์ธ์ด, ๋ฐ์ด๋๋ฆฌ ํ์, ํ๋ซํผ์ ์ง์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์์์ ์ดํด๋ณธ ๋ง์ ํ๋ก๊ทธ๋จ๋ค์ ์ผ๋ถ ์ธ๊ธฐ์๋ ํ์๋ค๋ง ์ง์ํ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ๋ํ์ ์ผ๋ก ๋ง์ fuzzer๋ค์ด Linux์๋ง ํธํ ๊ฐ๋ฅํ๋ฉฐ Windows 64bit PE32+์ ๊ฒฝ์ฐ ์ง์๋์ง ์๋ ๊ฒฝ์ฐ๊ฐ ๋๋ค์์
๋๋ค. ๋ฐ๋ผ์ ๋ณธ ์ฐ๊ตฌํ์ด ์ถ๊ตฌํ๋ compiler-quality binary-only fuzzing instrumenting์ ๊ฒฝ์ฐ ๋ค์ํ ๋ฐ์ด๋๋ฆฌ ํ์์ ์ง์ํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
The ZAFL Platform
๋ณธ ์ฐ๊ตฌํ์ compiler-based ํ๊ฒฝ์์์ ์ฅ์ ๊ณผ, binary-only ํ๊ฒฝ์์์ ๋จ์ ์ ์ทจํฉํ์ฌ ํ๋์ ์๋ก์ด ํ๋ซํผ์ ํ์์์ผฐ์ต๋๋ค. ZAFL์ ์ปดํ์ผ๋ฌ ์์ค์ ์ฒ๋ฆฌ๋์ closed-source ๋ฐ์ด๋๋ฆฌ์ ๋ํด์ ๊ตฌํํฉ๋๋ค. ZAFL์ ํน์ง์ staticํ๊ฒ inline instrumentation์ด ์งํ๋๋ฉฐ, liveness awareness๋ํ ๊ณ ๋ คํ์ฌ ์ํ๋ฉ๋๋ค. ๋์๊ฐ x86-64 ELF ๋ฐ์ด๋๋ฆฌ๋ฟ๋ง ์๋๋ผ PE32+์ ํ์๋ ์ง์ํฉ๋๋ค. ์๋๋ ZAFL์ ์ ๋ฐ์ ์ธ ๊ตฌ์กฐ๋ฅผ diagram์ผ๋ก ํํํ ๊ฒ์
๋๋ค.
Figure 2: A high-level depiction of the ZAFL platform architecture and its four ZAX transformation and instrumentation phases.
Figure 3: Figure 2์ ๊ณผ์ ์ zafl ์คํ log๋ฅผ ๊ธฐ๋ฐ์ผ๋ก 3๊ฐ์ step์ผ๋ก ๋๋ ๋ชจ์ต.
Figure 2์ ๋ณด์ด๋ ๊ฒ์ฒ๋ผ, ZAFL์ ํฌ๊ฒ 1) static rewriting์ ์งํํ ๋ค, 2) ZAX transformation์ ์ํํ์ฌ ์ต์ ํ๋ IR(Intermediate Representation)์ ์ถ์ถํ๊ฒ ๋ฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก 3) ์ต์ ํ๋ IR์ ๋ค์ ์ฌ๊ตฌ์ฑ์ ํ๊ฒ ๋๋ฉด output binary๊ฐ ์์ฑ๋ฉ๋๋ค. ์ด๋ ๊ฒ ์ถ์ถ๋ binary๋ AFL๋ฑ์ fuzzer์ input์ผ๋ก ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์์ธํ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Static Rewriting
ZAFL์ ํจ์จ์ ์ธ instrumentation์ ์ํด dynamic transformation์ด ์๋ static writing ๊ธฐ๋ฒ์ ์ฑํํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก static writing์ Zipr์ด๋ผ๋ binary rewriting ํ๋ก๊ทธ๋จ์ ํตํด ์ด๋ฃจ์ด์ง๋๋ค.
Zipr์ ์์๋๋ก rida, pda_register, fill_in_cfg, fill_in_indtargs, fix_calls์ ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ ์ํ๋ฉ๋๋ค. ๊ฒฐ๋ก ์ ์ผ๋ก ์ด ๊ณผ์ ์ ํตํด์ input ๋ฐ์ด๋๋ฆฌ์ ๋ํ IR data structure๊ฐ ์์ฑ๋ฉ๋๋ค. ๊ฐ ๋จ๊ณ์ ๋ํ ์์ธํ ์ค๋ช
์ ๋
ผ๋ฌธ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ์ ์ผ๋ก ์กฐ์ฌํ์ง ์์์ต๋๋ค.
ZAX Transformation
Zipr์ ํตํด ์์ฑ๋ IR์ ๊ธฐ๋ฐ์ผ๋ก ZAFL์ ZAX transformation์ ์ํํ๊ฒ ๋ฉ๋๋ค. ZAX Transformation์ optimization, analysis, point selection, ๊ทธ๋ฆฌ๊ณ application์ผ๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค. ์ด ๊ณผ์ ์ ํตํด ์ต์ ํ๋ IR data structure์ ์์ฑํ๊ฒ ๋ฉ๋๋ค.
์ฐธ๊ณ ๋ก ZAX Transformation์ ํต์ฌ ๋ด์ฉ์ ์ ๋ฆฌํจ๊ณผ ๋์์ ์ค์ ์ฝ๋๋ฅผ ํจ๊ป ๋ถ์ํ์์ต๋๋ค. ZAFL ์ฌ์ฉ์ ์ต์
์ ๋ฐ๋ผ ๊ณผ์ ์ด ์กฐ๊ธ์ฉ ๋ฌ๋ผ์ง์ง๋ง, ZAX Transformation ์์ฒด์ ์ง์คํ๊ณ ์ ์ต์
์์ด ์คํํ์ ๋๋ฅผ ๊ฐ์ ํ์ฌ Transformation ๊ณผ์ ์ ๋ถ์ํ์์ต๋๋ค.
[1] Optimization
ZAX Transformation์ ์ฒซ ๋ฒ์งธ ๋จ๊ณ์ธ Optimization ๋จ๊ณ๋ฅผ ํตํด์๋ ์ฃผ์ด์ง ์กฐ๊ฑด์ ๋ฐ๋ผ์ ์ต์ ํ๋ฅผ ์งํํฉ๋๋ค. ์ด ๊ณผ์ ์ control flow๋ฅผ ๋ณ๊ฒฝ์ํค๊ธฐ ๋๋ฌธ์, ์ด ๊ณผ์ ์ ๊ฐ์ฅ ๋จผ์ ์งํํฉ๋๋ค. Optimization ๋จ๊ณ๋ filterBlocksByDomgraph ํจ์๋ก ๊ตฌํ๋์์ต๋๋ค. ์ด ํจ์์ ํต์ฌ ๋ด์ฉ์ ์๋ for๋ฌธ์
๋๋ค.
Figure 4: filterBlocksByDomgraph์ ์ผ๋ถ.
๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ํจ์ ์คํ ์ ์ ๋ฌ๋ฐ์ basic block set์ ๊ธฐ๋ฐ์ผ๋ก, dominator tree๋ฅผ ์์ฑํฉ๋๋ค. ์์ฑ๋ dominator tree๋ฅผ ๊ธฐ๋ฐ์ผ๋ก, ๊ฐ branch์ ๋ํด successor ์ฌ๋ถ์ ๋ฐ๋ผ์ CFG ์ต์ ํ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ์ด ๊ณผ์ ์์ ์ dominator tree๋ฅผ ํ์ฉํ๋์ง์ ๋ํด์๋ ์๋ Extending Compiler-quality Transforms to Binary-only Fuzzing์์ ์์ ํ์์ต๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก Compiler-based Fuzzing Enhancements์์ ๋ค๋ฃฌ instrumentation pruning ๊ณผ์ ๊ณผ ๋งค์ฐ ๋น์ทํ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์ด ๊ณผ์ ์ ํตํด ์ต์ ์ Control-Flow graph๋ฅผ ์์ฑํ๊ฒ ๋ฉ๋๋ค.
[2] Analysis & Point Selection
1๋จ๊ณ์์ ์์ฑ๋ Control-Flow Graph๋ฅผ ๊ธฐ๋ฐ์ผ๋ก, Control-Flow ๋ถ์์ ์งํํ๊ฒ ๋ฉ๋๋ค. ์ด ๊ณผ์ ์ ํตํด์๋ predecessor successor, data-flow, and dominance relationships ๋ฑ์ Meta-characteristics๋ฅผ ์ถ์ถํฉ๋๋ค. ์ถ์ถ๋ Meta-characteristics๋ฅผ ๊ธฐ๋ฐ์ผ๋ก, ์ค์ ๋ก instruction์ ์ฝ์
ํ ๋ธ๋ก์ ํ๋จํฉ๋๋ค. ์ด ๋ฐฉ๋ฒ์ ๋ชจ๋ ๋ธ๋ก์ ๋์ดํ ๋ค, ์กฐ๊ฑด์ ๋ถํฉํ์ง ์๋ ๋ถ๋ถ์ ์ ๊ฑฐํ๋ ๋ฐฉ์์ผ๋ก ์งํํฉ๋๋ค. Analysis์ Point Selection ๋จ๊ณ๋ getBlocksToInstrumentํจ์์ ๊ตฌํ๋์ด ์์ต๋๋ค. ์๋๋ ํจ์์ ํต์ฌ ๋ด์ฉ์
๋๋ค.
Figure 5: getBlocksToInstrument์ ์ผ๋ถ.
ํด๋น for๋ฌธ์ ๋ณด๋ฉด, if๋ฌธ์ ํตํด์ instrumentation์ ํฌํจํ์ง ์์ ๋ธ๋ก์ ์ ์ธํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ์ด ๋ฐฉ๋ฒ์ compiler-based ํ๊ฒฝ์์์ fuzzing enhancements๊ธฐ๋ฒ ์ค ํ๋์ธ instrumentation downgrading์ ์ฑํํ์์ต๋๋ค. ์ด ๊ณผ์ ์ ๋ํ ์์ธํ ์ค๋ช
์ ์๋ Extending Compiler-quality Transforms to Binary-only Fuzzing์์ ์์ ํ์์ต๋๋ค.
[3] Application
๋ง์ง๋ง์ผ๋ก ZAX Transformation์์ ๋ณํํ ๊ฒ๋ค์ ์ ์ฉ์ํต๋๋ค. ์ด ๊ณผ์ ์์ ์ค์ํ ๊ฒ์ ์ด๋ป๊ฒ ๊ฐ ์์น์ instrument๋ฅผ ์ฝ์
ํ๋์ง๊ฐ ์ค์ํฉ๋๋ค. ํ๋ก๊ทธ๋จ์ด ์ ์์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ ์ ์์์ instrumentation์ด ์งํ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์, ๋ ์ง์คํฐ๊ฐ ํ์ฌ ์ฌ์ฉ๋๊ณ ์๋์ง ํ๋ณํ์ฌ(๋
ผ๋ฌธ์์๋ liveness๋ฅผ ํ๋ณํ๋ค๊ณ ํํํ์์ต๋๋ค) instrumentation์ ์งํํฉ๋๋ค.
๋ํ, ์ํ ๋ ์ง์คํฐ๋ ๋ค๋ฅธ ๋ ์ง์คํฐ๋ณด๋ค ๋ ๋น์ฉ์ด ๋ง์ด ๋ค๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ ํฅ์์ ์์ด ๊ณ ๋ คํด์ผ ํ๋ ๋ถ๋ถ ์ค ํ๋์
๋๋ค. ๋ฐ๋ผ์ ์์ ๋งํ๋ liveness ํ๋ณ์ ํตํด ๊ธฐ์กด์ ๊ณผ์ ์ ํด์น์ง ์์ผ๋ฉด์, ์ต๋์ ํจ์จ์ ๊ฐ์ง ์ ์๋๋ก ์ค๊ณํ์์ต๋๋ค. ์ฝ๋์์์๋ ์ด ๊ณผ์ ์ instrumentBasicBlock์ด๋ผ๋ ํจ์์์ ์ฒ๋ฆฌํ์์ต๋๋ค.
Figure 6: instrumentBasicBlock์ ์ผ๋ถ(1).
ํด๋น ํจ์์์ ๊ฐ์ฅ ๋จผ์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ ์ง์คํฐ๋ฅผ ํ์
ํฉ๋๋ค. ์ด ๊ณผ์ ์์ ๋ฐ๋ก ๋น์ฉ์ ๊ณ์ฐํ์ฌ ์ฐ์ ์์๋ฅผ ๋งค๊ธฐ์ง๋ ์์ง๋ง, eflags๋ฑ์ ์ํ ๋ ์ง์คํฐ๊ฐ ์๋ ๊ฒ์ผ๋ก ๋ฏธ๋ฃจ์ด ๋ณด์ ์ ์ ๋น์ฉ์ ํ์๋ก ํ๋ ๋ ์ง์คํฐ๋ค๋ง ์ฌ์ฉํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
Figure 7: instrumentBasicBlock์ ์ผ๋ถ(2).
๋ค์์ผ๋ก๋ ์ค์ instrumentation์ ์งํํฉ๋๋ค. Instrument๋ฅผ ์ฝ์
ํ ๋๋ ์ฒ์ ์งํํ๋ ๊ฒฝ์ฐ insertAssemblyBefore, ์ดํ๋ก๋ insertAssemblyAfter๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ์์ ์ค๋ช
ํ ๊ฒ์ฒ๋ผ, ZAFL์ instrumentation์ ์งํํ ๋ ํจ์๋ฅผ ์ด์ฉํ๋ trampolining์ด ์๋, ๋ฐ๋ก ์ด์
๋ธ๋ฆฌ์ด๋ฅผ ์ฝ์
ํ๋ inlining ๊ธฐ๋ฒ์ ์ฌ์ฉํ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
Figure 8: instrumentBasicBlock์ ์ผ๋ถ(3).
๋ง์ง๋ง์ผ๋ก ์ฌ์ฉํ๋ ๋ ์ง์คํฐ๋ค์ ๋ค์ ๋ณต๊ตฌํ์ฌ ํ๋ก๊ทธ๋จ ์คํ์ ์ง์ฅ์ด ์๋๋ก ํฉ๋๋ค. ์์ ๊ณผ์ ๊ณผ ๋น๊ตํ์์ ๋ assembly์ ์์๊ฐ ๋ฐ๋์ธ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
ํนํ ์ด ๊ณผ์ ์์ getContextSensitivity๋ฑ์ ํจ์๋ฅผ ํตํด context-sensitive tracking์ ์งํํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ์ด ๊ณผ์ ๋ํ ์๋ Extending Compiler-quality Transforms to Binary-only Fuzzing์์ ์์ธํ ์์ ํ์์ต๋๋ค.
Reconstitute Modified IR
๋ง์ง๋ง์ผ๋ก ZAX Transformation๊น์ง ๊ฑฐ์น IR data structure์ ๊ธฐ๋ฐ์ผ๋ก, ๋ง์ง๋ง์ผ๋ก binary rewriting์ ์ํํฉ๋๋ค. ์ด ๊ณผ์ ๋ํ Figure 3์์ ๋ณผ ์ ์๋ฏ์ด Zipr์ด ์งํํ๊ฒ ๋ฉ๋๋ค. ์ด๋ ๊ฒ binary rewriting์ด ์๋ฃ๋ ๋ฐ์ด๋๋ฆฌ๋ โ.zaflโ์ด๋ผ๋ ํ์ฅ์๋ฅผ ๊ฐ์ง ์ํ๋ก output ๋ฐ์ด๋๋ฆฌ๊ฐ ๋ฉ๋๋ค. ์ด ์ํ์ ๋ฐ์ด๋๋ฆฌ๋ AFL์ input์ผ๋ก ์ฌ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค.
Extending Compiler-quality Transforms to Binary-only Fuzzing
๋ณธ ์ฐ๊ตฌํ์ ZAFL์ ๊ฐ๋ฐํ๋ ๊ณผ์ ์์ ์ด 5๊ฐ์ง์ LLVM ๊ธฐ๋ฐ fuzzing transformation์ ๊ตฌํํ์์ต๋๋ค. ๋ณธ ๋ฆฌ๋ทฐ์์๋ ์ถ๊ฐ์ ์ผ๋ก ZAFL ํ์ด ์ด๋ค ๋ฐฉ์์ผ๋ก ๊ฐ transform์ ๊ตฌํํ๋์ง ๋ถ์ํ์์ต๋๋ค.
Performance Transforms
Single-Successor Path Pruning
Single-Successor Path Pruning์ flow graph๋ฅผ ์ต์ ํํ๋ ๋ฐฉ๋ฒ ์ค ํ๋๋ก, ZAFL์ ๊ฒฝ์ฐ์๋ AFL-Dynist์์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๊ตฌํํ์์ต๋๋ค. AFL-Dynist์์๋ entry block์ด ์๋๋ฉด์, ๋จ์ผ successor๋ฅผ ๊ฐ์ง ๊ฒฝ์ฐ ์ต์ ํ๋ฅผ ์งํํฉ๋๋ค. ์ด ๊ฒฝ์ฐ์๋ ๋ฌด์กฐ๊ฑด ๋๋ฌํ ๊ฒ์ผ๋ก ์์ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ์ ์ผ๋ก instrumentation์ ์งํํ์ง ์๋ ๊ฒ์
๋๋ค. ZAX Transformation์ ๋จ๊ณ์์๋ Analysis๋จ๊ณ์์ ์ฝ์
์ด ๋์์ผ๋ฉฐ, filterEntryBlock์์ ๊ตฌํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
Figure 9: filterEntryBlock์ ์ผ๋ถ.
์ฝ๋์์๋ ํ์ธํ ์ ์๋ฏ์ด, ์ฐ์ ์ ์ผ๋ก successor์ ๊ฐ์๋ฅผ ํ์ธํ์ฌ ๋จ์ผ successor์ธ ๊ฒฝ์ฐ input๊ฐ์ธ p_in_out์์ ์ ์ธ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
Dominator Tree CFG Pruning
ZAX Transformation์ Optimization ๊ณผ์ ์์ ์ธ๊ธํ๋ค์ํผ, ZAFL์ dominator tree๋ฅผ ํตํด CFG ์ต์ ํ๋ฅผ ์งํํฉ๋๋ค. Dominator tree๋ ๊ธฐ๋ณธ์ ์ผ๋ก A๋ผ๋ ์ฝ๋ ๋ถ๋ถ์ด ์คํ๋์์ ๋, B๋ผ๋ ์ฝ๋ ๋ถ๋ถ ๋ํ ์คํ๋์๋์ง ์ฐพ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๊ฐ๋
์
๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก ์ด ์ด๋ก ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋ชจ๋ Flow Graph์ ๋์ํ๋ Dominator Tree๊ฐ ์กด์ฌํ๋ค๋ ๊ฒ์ ์ฆ๋ช
ํด์ผ ํฉ๋๋ค. ์ฆ๋ช
์ [6]์ผ๋ก ๋์ฒดํฉ๋๋ค.
๊ทธ๋ฌ๋ฉด ์ฒ์์ ์ธ๊ธํ๋ โA๋ผ๋ ์ฝ๋ ๋ถ๋ถ์ด ์คํ๋์์ ๋, B๋ผ๋ ์ฝ๋ ๋ถ๋ถ ๋ํ ์คํ๋์๋์งโ์ ๋ํด์๋ ์ ์ ์์ต๋๋ค. ์์ ์ฆ๋ช
ํ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ํ๋จํ์์ ๋, dominator tree์์์ A๋ผ๋ ์ ์ ์ด B๋ผ๋ ์ ์ ์ ์กฐ์์ธ์ง๋ฅผ ํ๋ณํ๋ ๊ฒ๊ณผ ๋์น์
๋๋ค. ๋ฐ๋ผ์ dominator tree๋ฅผ ์ด์ฉํ๋ฉด ๊ทธ๋ํ์ ๊ฒฝ๋ก ์กด์ฌ ์ฌ๋ถ๋ฅผ ๋จ์ํํ ์ ์๊ธฐ ๋๋ฌธ์ instrumentation์ ์ต์ํํ๊ธฐ ์ํ ์ ํ์ผ๋ก ๋ณด์
๋๋ค.
Edge Instrumentation Downgrading
CollAFL์ ๊ธฐ์กด์ AFL์ edge coverage๋ฅผ ๊ธฐ๋ฐ์ผ๋ก, ๋ธ๋ก์ ์ต์ํํ์ฌ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ์ต์ ํํฉ๋๋ค. ์ด๋ ์์์๋ ๋
ผ์ํ๋ Single-Successor Path Pruning๋ฐฉ๋ฒ๊ณผ ๋น์ทํฉ๋๋ค. ๋ง์ฝ ๋ธ๋ก์ด ๋จ์ผ predecessor๋ฅผ ๊ฐ์ง๋ค๋ฉด, ํด๋น ๋ธ๋ก์ ๊ทธ edge๋ฅผ ๋ํํ๋ค๊ณ ๋งํ ์ ์์ต๋๋ค. ์ด ๋ฐฉ๋ฒ์ ์ด์ฉํ ๊ฒฝ์ฐ start์ end point์ ํด์ฑํ๋ ๋น์ฉ์ ์๋ ์ ์์ต๋๋ค. ZAFLํ์ ์ด ๋ฐฉ๋ฒ์ ์ ์ฉํ๊ณ , ์ ์ฒด ๋จ์ ๋ธ๋ก ์ค 35~45%๊ฐ ์ด ์ต์ ํ๋ฅผ ์ ์ฉํ ์ ์์์ต๋๋ค.
Feedback Transforms
Sub-instruction Profiling
Sub-instruction Profiling์ด๋ ๋ณต์กํ ์กฐ๊ฑด๋ถ ๋ถ๋ถ์ single-byte ๋น๊ต๋ฌธ์ผ๋ก ๋ถํดํ์ฌ fuzzing์ ์งํํ๋๋ก ํ๋ ๊ณผ์ ์
๋๋ค. ์ด๋ ๊ฒ ํจ์ผ๋ก์ ์ด๋ฐ ์ ์ฝ์กฐ๊ฑด์ ๋ง์ถ๋ ๊ณผ์ ์ ์ถ์ ํ ์ ์๊ณ , mutation๊ณผ์ ์ ์๋ ์ ์์ต๋๋ค.
Compiler-based ํ๊ฒฝ์์๋ ์ด๋ฅผ ์ค์ฒฉ ๋น๊ต๋ฅผ ๊ธฐ์กด์ ๋น๊ต๋ฌธ์ ๋์ฒดํ์ฌ ๊ตฌํํฉ๋๋ค. ๊ทธ๋ฌ๋ feedback์ ์ฆ๊ฐ์ํค๋ ๊ฒ์ด ์ฃผ๋ ๋ชฉํ์ด๊ธฐ ๋๋ฌธ์, ZAFL์์๋ ๊ธฐ์กด์ ๋น๊ต๋ฌธ ์์ ์ค์ฒฉ ๋น๊ต๋ฅผ ์ฝ์
ํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ์์ต๋๋ค. ์ด ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํํ ๊ฒฝ์ฐ compiler-based ํ๊ฒฝ์์ ๊ตฌํํ์ ๋์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์ ์ด ๋ฐฉ๋ฒ์ ์ ํํ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค. ํนํ IR์์ cmp๊ฐ์ ๋น๊ต ๊ตฌ๋ฌธ์ ์ฐพ์์ ๋ฐ์ดํธ๋ง๋ค ์ค์ฒฉ ๋น๊ต๋ฅผ ํ๊ฒ๋ ๊ตฌํํ์์ต๋๋ค.
Context-sensitive Tracking
๋ง์ง๋ง์ผ๋ก context-sensitive tracking์
๋๋ค. ์์ ์กฐ์ฌํ๋ Extra-coverage Behavior Tracking์ฒ๋ผ, ํธ์ถํ ๋์ ์ํฉ๊น์ง ๊ณ ๋ คํ์ฌ trackingํ๋ ๊ฒ์ ๋ปํฉ๋๋ค. ZAFL์์๋ ๊ฐ ํจ์๋ฅผ ๋๋ค ๊ฐ์ผ๋ก ๋ฐฐ์ ํ์ฌ ๊ธฐ๋ฅ ์์ค์ ์ปจํ
์คํธ ๊ฐ๋๋ฅผ ์์ฑํ๊ณ , ์ด ๊ฐ์ ํจ์ ์
๋ ฅ/์ข
๋ฃ ์ edge hashing ์ฐ์ฐ์ ์ฌ์ฉ๋์์ต๋๋ค. ZAFL์์๋ addContextSensitivity ๋ฑ์ ํจ์๋ฅผ ํตํด ๊ตฌํํ์ต๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก ZAFL์๋ ์์ ๊ฐ์ด 5๊ฐ์ง์ low-level์ API๋ฅผ ์ฝ์
ํ์ฌ binary fuzzing์ด ๊ฐ์ง์ง ๋ชปํ๋ ๋์ ์ฑ๋ฅ์ ๊ตฌํํ์์ต๋๋ค.
Evaluation
๊ฐ๋ฐ์ง๋ค์ ZAFL์ด ์ค์ ๋ก ์ข์ ์ฑ๋ฅ์ ๊ฐ์ง fuzzer์ธ์ง ํ๊ฐํ๊ธฐ ์ํด ๋ช ๊ฐ์ง ํ๊ฐ๋ค์ ์งํํ์์ต๋๋ค. ํ๊ฐ๋ฅผ ์งํํ ๋ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์งํํ์์ต๋๋ค.
โข
๋์: 8๊ฐ์ open-source์ 5๊ฐ์ closed-source ๋ฐ์ด๋๋ฆฌ
โข
๊ธฐ๊ฐ: 8์ผ๋์ fuzzing์ ์งํ
โข
์ฑ๋ฅ: ๋ฐ์ํ๋ overhead๋ฅผ ๊ธฐ์ค์ผ๋ก ์ธก์
โข
์ ํ๋: open-source์์ ๋ณต๊ตฌ๋์ง ์์ instruction์ ๋ํด AFL-LLVM๊ณผ ๋น๊ต
โข
ํ์ฅ์ฑ: ์๋ํ๋ smoke-test๋ ์ง์ ์คํํ์ฌ ์ฌ๋ถ ํ์ธ
์์ธํ ํ๊ฐ ๋ด์ฉ์ ์๋์ ๊ฐ์ต๋๋ค.
Does ZAFL enhance binary fuzzing?
๊ฐ์ฅ ๋จผ์ ZAFL์ด binary-only ํ๊ฒฝ์ fuzzing์์ ๋ ๋์ ์ฑ๋ฅ์ ๋ณด์ฌ์ฃผ๋์ง ์ธก์ ํ์์ต๋๋ค. ์ด ๊ณผ์ ์์๋ AFL-Dynist, AFL-QEMU, ๊ทธ๋ฆฌ๊ณ ZAFL์ ๋น๊ตํ์์ต๋๋ค.
Figure 11: Real-world software fuzzing unique triaged crashes averaged over 8*24 hour trials.
์ ๊ทธ๋ฆผ์ ๊ฒฝ์ฐ ์ค์ software์ ๋์์ผ๋ก fuzzing์ ์งํํ์์ ๋ ์ฃผ์ด์ง test case์ ๋นํด ํ๊ท ์ ์ผ๋ก ์ผ๋ง๋ ํฌ๋์๋ฅผ ๋ฐ๊ฒฌํด๋ด๋์ง์ ๋ํด ๊ธฐ๋กํ ๊ฒ์
๋๋ค. ๊ทธ๋ํ์์๋ ๋ณผ ์ ์๋ฏ์ด, ZAFL์ด ๋๋ถ๋ถ ๋ ๋์ ์ฑ๋ฅ์ ๋ณด์ฌ์ฃผ๊ณ ์์์ ์ ์ ์์ต๋๋ค. ๊ณ์ฐ ๊ฒฐ๊ณผ ZAFL์ด ํ๊ท ์ ์ผ๋ก AFL-Dynist๋ณด๋ค๋ 26%, ๊ทธ๋ฆฌ๊ณ AFL-QEMU๋ณด๋ค๋ 131% ๋ ๋ง์ด ํฌ๋์๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค.
Is ZAFLโs speed near compilersโ?
๋ค์์ผ๋ก๋ ZAFL์ ์๋๊ฐ ์ค์ ์ปดํ์ผ๋ฌ์ ์๋์ ๋น์ทํ ์ง์ ๋ํด์ ํ๊ฐํด๋ณด์์ต๋๋ค. ๋น๊ต ๋์์ ์ปดํ์ผ๋ฌ, ์ด์
๋ธ๋ฌ, AFL-Dynist, ๊ทธ๋ฆฌ๊ณ AFL-QEMU์
๋๋ค. ๋ํ ZAFL-none๊ณผ ZAFL์ ๋ค์ํ version์ธ ZAFL-fsrvr, ZAFL-perf, ZAFL-all์ด ์ ์ฉ๋ ๊ฒฝ์ฐ๋ฅผ ๋๋์ด ๊ฒฐ๊ณผ๋ฅผ ์ธก์ ํ์์ต๋๋ค.
Figure 12: Compiler, assembler, AFL-Dynist, AFL-QEMU, and ZAFL fuzzing instrumentation performance relative to baseline (higher is better).
๊ฒฐ๋ก ์ ์ผ๋ก ZAFL์ ์ปดํ์ผ๋ฌ์ ๋นํด ํฌ๊ฒ ๋ค๋จ์ด์ง์ง ์๋ ์๋๋ฅผ ๋ณด์ฌ์ฃผ์์ต๋๋ค. ์ปดํ์ผ๋ฌ์ ์ด์
๋ธ๋ฌ์ ๊ฒฝ์ฐ ๊ฐ๊ฐ 24%์ 34%์ overhead๊ฐ ๋ฐ์ํ์๋๋ฐ, ZAFL์ ๊ฒฝ์ฐ ๋ฒ์ ์ ๋ฐ๋ผ ์์ดํจ์ ๋ณด์์ง๋ง 27~32%์ overhead๊ฐ ๋ฐ์ํ์์ต๋๋ค. ๋น๋ก ์ปดํ์ผ๋ฌ์ ๋น๊ตํ์ ๋๋ ๋ ๋ฎ์ ์ฑ๋ฅ์ ๋ณด์ฌ์คฌ์ง๋ง, AFL-Dynist์ AFL-QEMU๊ฐ ๊ฐ 88%, 256%์ overhead๋ฅผ ๋ฐ์์ํค๋ ๊ฒ์ ๊ณ ๋ คํ์์ ๋ ์์ฒญ๋ ์ฑ์ฅ์ ์ด๋ฃจ์๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค.
Can ZAFL support real closed-source?
๋ค์์ผ๋ก๋ ZAFL์ด ์ค์ ๋ก closed-source์ ๋ํด์ ์ข์ ์ฑ๊ณผ๋ฅผ ๋ณด์ฌ์ฃผ๋์ง์ ๋ํด์ ํ๊ฐํ์์ต๋๋ค. ํ๊ฐ๋ 5๊ฐ์ ์ทจ์ฝ์ ์ ์ข
๋ฅ์ ๋ํด์ ์ผ๋ง๋ ๋นจ๋ฆฌ, ๊ทธ๋ฆฌ๊ณ ๋ง์ด ๋ฐ๊ฒฌํด๋ด๋์ง์ ๋ํด์ ํ๊ฐํ์์ต๋๋ค. ๋น๊ต ๋์์ AFL-Dynist์ AFL-QEMU์
๋๋ค.
Table 13: Mean time-to-discovery of closed-source binary bugs found for AFL-Dyninst, AFL-QEMU, and ZAFL over 5ร24-hour fuzzing trials.
โ = bug is not reached in any trials for that instrumenter configuration.
๊ทธ ๊ฒฐ๊ณผ, ZAFL์ด AFL-Dynist๋ณด๋ค๋ 55%, ๊ทธ๋ฆฌ๊ณ AFL-QEMU๋ณด๋ค๋ 38% ๋ ํฌ๋์๋ฅผ ๋ง์ด ๋ฐ๊ฒฌํ ๊ฒ์ ์์๋ผ ์ ์์์ต๋๋ค. ๋๋ถ์ด, ํ๊ท ์ ์ผ๋ก ZAFL์ ์ด ๋ฒ๊ทธ๋ค์ ์ฐพ์๋ด๋๋ฐ 660%, 113%(๊ฐ๊ฐ AFL-Dynist, AFL-QEMU) ๋ ๋น ๋ฅธ ๊ฒ์ ์ ์ ์์์ต๋๋ค.
Is ZAFL precise?
๋ค์์ผ๋ก๋ ZAFL์ ์ ํ๋์ ๋ํด์ ํ๊ฐํ์์ต๋๋ค. ์ ํ๋๋ฅผ ํ๊ฐํ๊ธฐ ์ํด์ LLVM-10 objdump์ ์ ํ๋๋ฅผ ๋น๊ตํ์์ต๋๋ค. ๋น๊ต๊ตฐ์ IDA Pro์ Binary Ninja๊ฐ ๊ฐ์งํด๋ผ ์ ์๋ instrumentation์ ๋น๊ตํ์์ต๋๋ค.
Table 14: Instruction recovery statistics for IDA Pro, Binary Ninja, and ZAFL, with ground-truth disassembly from LLVM-10โs objdump.
Reached = mean unrecovered instructions reached by fuzzing (hence, erroneouslyunrecovered); FalseNeg = erroneously-unrecovered instructions over total.
๊ฒฐ๋ก ์ ์ผ๋ก ZAFL์ด ๊ฐ์ฅ ๋์ ์ ํ๋๋ฅผ ๋ณด์์ต๋๋ค. ํนํ LLVM-10์ objdump์ ๋น๊ตํด๋ณด์์ ๋, ZAFL์ ํตํด ๋๋ฌํ์ง ๋ชปํ๋ instruction์ ์์์ต๋๋ค. ๋ํ ์ปค๋ฒ๋ฆฌ์ง ์ ํ๋์ ํ๊ท ์ ๋ด๋ณด์์ ๋ 99.99%๋ผ๋ ๊ฒฐ๊ณผ๋ฅผ ๋์ถํ ์ ์์์ต๋๋ค.
Does ZAFL Scale?
๋ง์ง๋ง์ผ๋ก ZAFL์ด ๋ค์ํ ํ์์ ์ง์ํ๋์ง(scalability)์ ๋ํด์ ํ๊ฐํ์์ต๋๋ค. ZAFL์ open-source, closed-source, ๊ทธ๋ฆฌ๊ณ Windows ๋ฐ์ด๋๋ฆฌ๊น์ง ๋ชจ๋ ํธํ ๊ฐ๋ฅํฉ๋๋ค. ๋ณธ ์ฐ๊ตฌํ์ ๊ฒฐ๋ก ์ ์ผ๋ก ์ด 56๊ฐ์ ๋ฐ์ด๋๋ฆฌ์์ ZAFL์ด ์ ์์ ์ผ๋ก ๋์ํ๋ค๋ ๊ฒ์ ํ์ธํ์์ต๋๋ค. ์ด 56๊ฐ์ ๋ฐ์ด๋๋ฆฌ๋ 1) Linux์ Window ๋ฐ์ด๋๋ฆฌ, 2) stripped, PIE, ๊ทธ๋ฆฌ๊ณ non-PIEํ์, 3) 100KB์ 100MB์ฌ์ด์ ํฌ๊ธฐ์ ๋ฐ์ด๋๋ฆฌ, ๊ทธ๋ฆฌ๊ณ 4)100์์ 1,000,000๊ฐ์ ๋จ์ ๋ธ๋ก์ ๊ฐ์ง ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ชจ๋ ์ง์ํ๋ค๋ ๊ฒ์ ๊ฒ์ฆํ์์ต๋๋ค.
Conclusion
๋ณธ ์ฐ๊ตฌ๋ compiler-based fuzzing๊ณผ binary-only fuzzing ์ฌ์ด์ ๊ฐ๊ทน์ ์ค์ด๊ธฐ ์ํด ์งํํ๋ ์ฐ๊ตฌ์์ต๋๋ค. ํนํ performance์ feedback์ ์ธก๋ฉด์ผ๋ก ๋๋์ด ์ฑ๋ฅ ํฅ์์ ์ด๋ฃฌ ๊ฒ์ด ๊ฐ์ฅ ์ธ์๊น์์ต๋๋ค.
๋ค๋ง ์์ฌ์ ๋ ์ ์ ZAFL์ด static rewriting์ ๋ถ๋ถ์ ์์ด์๋ ๊ธฐ์กด์ binary rewriter์ธ Zipr์ ๋๋ถ๋ถ ์์กดํ ์ ์
๋๋ค. Zipr๋ ์ข์ binary rewriter์ด์ง๋ง, ์ด ๋๋ฌธ์ ๋๋
ํ๊ฐ ์งํ๋ ๋ฐ์ด๋๋ฆฌ์ ๊ฒฝ์ฐ์๋ ์ข์ ์ฑ๋ฅ์ด ๋์ค์ง ์์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ต๊ทผ automatic deobfuscation ๋ฑ์ ์ฐ๊ตฌ๊ฐ ๊ณ์๋๊ณ ์๊ธฐ ๋๋ฌธ์, ์ถํ ์ฐ๊ตฌ์์ ์ด๋ฅผ ์ ์ฉํ ๊ฒฝ์ฐ ๋ ์ข์ ์ฑ๋ฅ์ ๋ณด์ผ ์ ์์ ๊ฒ์ผ๋ก ์์๋ฉ๋๋ค.
๋
ผ๋ฌธ review๋ฅผ ์งํํ๋ฉด์, ZAFL์ ๋ํด์ ์ง์ ์์ค์ฝ๋๋ฅผ ๋ถ์ํ๊ณ ๊ตฌ์กฐ๋ฅผ ํ์
ํด๋ณด์์ต๋๋ค. ํนํ ZAFL์ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด ๊ฐ๋ฐ์ง๋ค์ด ํ๋ ์ ํ์ ์ ํ๋์ง์ ๋ํด ์ง์ ์ฆ๋ช
ํด๋ณธ ๊ฒ์ด ์ฌ๋ฏธ์์์ต๋๋ค. ์ด๋ฒ ๊ณผ์ ๋ฅผ ํตํด ๊ธฐ์ ์ ์ต์ ํํ๋ ๊ณผ์ ๊ณผ, ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ํ๊ฒฝ์์ ๊ธฐ์ ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ง์ด ๋ฐฐ์ธ ์ ์์์ต๋๋ค.
References
[1] Nagy, S., Nguyen-Tuong, A., Hiser, J. D., Davidson, J. W., & Hicks, M. (2021, September). Breaking Through Binaries: Compiler-quality Instrumentation for Better. USENIX. https://www.usenix.org/system/files/sec21-nagy.pdf
[2] USENIX. (2021.09.04). USENIX Security '21 - Breaking Through Binaries: Compiler-quality Instrumentation for Better [Video]. Youtube. https://www.youtube.com/watch?v=8Z-5aTpk_l0
[4] ZAFL (2021). https://git.zephyr-software.com/opensrc/zafl
[3] J. Hiser, A. Nguyen-Tuong, W. Hawkins, M. McGill, M. Co, J. Davidson. (2017, November). Zipr++: Exceptional Binary Rewriting. FEASTโ 17. https://dl.acm.org/doi/pdf/10.1145/3141235.3141240
[5] Zipr (2017). https://git.zephyr-software.com/opensrc/zipr
[6] T. Lengauer, R.E. Tarjan. (1979). A Fast Algorithm for Finding Dominators in a Flowgraph. Stanford University. https://www.cs.princeton.edu/courses/archive/spr03/cs423/download/dominators.pdf