[Rust 공식문서 한국어 정리] 52. Rust 퍼징(Fuzzing) 가이드
[Rust 공식문서 한국어 정리] 52. Rust 퍼징(Fuzzing) 가이드
원문 제목: The Rust Fuzz Book
작성자: Rust Fuzz Working Group
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📌 1. 서론 — 이 문서가 다루는 내용
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
이 문서는 Rust 프로젝트에 퍼징(Fuzzing)을 적용하여 보안 취약점과 크래시를 자동으로 발견하는 방법을 설명합니다.
cargo-fuzz와 libFuzzer, AFL, Honggfuzz 등의 퍼징 엔진을 Rust와 통합하는 방법을 다룹니다.
무작위 입력 생성, 커버리지 기반 피드백, 그리고 발견된 크래시의 재현과 축소를 중심으로 설명합니다.
파서, 디코더, 네트워크 프로토콜 구현체 등 입력을 처리하는 코드의 안정성을 검증하는 데 특히 효과적입니다.
보안과 안정성이 중요한 Rust 프로젝트를 검증하려는 개발자에게 필수적인 기법입니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔑 2. 핵심 개념 4가지
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
① Fuzzing: 무작위 입력을 대량 생성하여 프로그램의 비정상 종료나 버그를 자동으로 찾는 기법입니다.
② cargo-fuzz: libFuzzer 기반의 Rust 퍼징 도구로, cargo integrate 워크플로우를 제공합니다.
③ Corpus: 퍼징의 초기 입력 집합으로, 좋은 시드가 탐색 효율을 크게 향상시킵니다.
④ Coverage-guided: 코드 커버리지를 피드백으로 사용하여 입력을 진화시키는 지능형 퍼징입니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📖 3. 주요 내용 상세
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
cargo-fuzz는 Rust 공식 퍼징 도구로, cargo fuzz init과 cargo fuzz run으로 간단히 시작할 수 있습니다.
퍼징 타겟은 fuzz_targets/ 디렉토리에 작성하며, libfuzzer_sys::fuzz_target! 매크로로 정의합니다.
입력은 &[u8] 슬라이스로 제공되며, 이를 파서나 디코더에 전달하여 처리합니다.
커버리지 기반 퍼징은 입력이 새로운 코드 경로를 실행할 때만 corpus에 추가합니다.
이를 통해 의미 없는 입력의 반복을 줄이고, 효율적으로 탐색 공간을 확장합니다.
libFuzzer는 LLVM의 SanitizerCoverage를 사용하여 각 입력의 커버리지를 측정합니다.
발견된 크래시는 corpus/artifacts/에 저장되며, cargo fuzz run으로 자동 재현됩니다.
크래시 입력은 보통 불필요한 바이트를 포함하므로, cargo fuzz tmin으로 최소화합니다.
최소화된 입력은 버그 보고서와 regression 테스트에 포함하기에 적합합니다.
AFL(American Fuzzy Lop)도 Rust에서 사용할 수 있습니다.
cargo-afl은 AFL의 러스트 래퍼로, LLVM 모드로 컴파일하여 커버리지 기반 퍼징을 수행합니다.
AFL은 병렬 퍼징이 용이하고, 대규모 프로젝트에서도 안정적인 성능을 보입니다.
메모리 안전성 버그는 AddressSanitizer(ASan)와 함께 퍼징하면 더 효과적으로 발견됩니다.
cargo-fuzz는 기본적으로 ASan을 활성화하여, 힙 버퍼 오버플로우나 use-after-free를 감지합니다.
또한 MemorySanitizer(MSan)로 초기화되지 않은 메모리 읽기도 검출할 수 있습니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🛠 4. 실전 활용
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
이미지/비디오 디코더, 프로토콜 파서, 파일 포맷 라이브러리에 cargo-fuzz를 적용합니다.
기존 테스트 케이스를 corpus로 제공하여 퍼징의 초기 탐색 품질을 높입니다.
발견된 크래시는 최소화 후 regression 테스트로 추가하여 재발 방지합니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ 5. 정리
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
퍼징은 Rust 코드의 보안과 안정성을 자동으로 검증하는 강력한 도구입니다.
cargo-fuzz와 libFuzzer의 커버리지 기반 접근은 효율적인 탐색을 보장합니다.
보안이 중요한 입력 처리 코드에는 반드시 퍼징을 도입하여 취약점을 사전에 차단하세요.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔗 출처 링크
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
원문: https://rust-fuzz.github.io/book/
cargo-fuzz: https://github.com/rust-fuzz/cargo-fuzz
#Rust #Fuzzing #Security #cargo-fuzz #libFuzzer #AFL #번역

오뉴노노 님의 최근 댓글
ㅋㅋㅋㅋㅋ 2019 01.14 잘 읽었습니다 2018 12.30 포인트가 없어서 아직 시작을 못하고있는데요! 글은 잘 읽었습니다! 포인트 쌓고 도전할거에요 2018 12.30