libFuzzer로 퍼징하기
libFuzzer로 코드를 퍼징하여 예외적인 입력에서 발생하는 충돌을 찾습니다.
libFuzzer로 퍼징하기은(는) CoddyKit의 무료 C++ Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C++ Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
퍼징을 사용하는 이유
퍼징은 충돌, 멈춤 및 보안 버그를 찾기 위해 무작위 입력을 생성합니다. 최신 퍼저는 검사 범위 피드백을 사용하여 새로운 코드 경로를 탐색하는 입력으로 발전시킵니다.
libFuzzer
libFuzzer는 LLVM의 일부이며 살균기와 통합됩니다. 하나의 진입점을 퍼징하는 단일 함수를 작성하면 프레임워크가 입력 생성을 수행합니다.
퍼징 대상 작성
함수 시그니처는 고정되어 있습니다. 바이트 배열을 받고 0을 반환하십시오.
#include <cstdint>
#include <cstddef>
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
parse_input(reinterpret_cast<const char*>(data), size);
return 0;
}libFuzzer용 컴파일
-fsanitize=fuzzer,address 조합과 함께 Clang을 사용하십시오. 직접 링크하면 되며 main은 필요하지 않습니다.
clang++ -g -O1 -fsanitize=fuzzer,address fuzz.cpp parser.cpp -o fuzz_target
./fuzz_target검사 범위 기반 변형
libFuzzer는 각 입력이 실행하는 코드 경로를 추적합니다. 가능성이 높은 입력을 변형하여 더 깊은 경로를 탐색하므로, 아무 기준 없이 무작위로 생성하는 것보다 훨씬 효율적입니다.
코퍼스
흥미로운 것으로 알려진 입력을 담은 디렉터리로 퍼저를 초기화하십시오. 퍼저는 이러한 입력을 변형하여 새로운 입력으로 발전시킵니다.
./fuzz_target corpus/사전 파일
문법이 있는 입력(HTML, JSON, 프로토콜 메시지)을 더 빠르게 탐색할 수 있도록 자주 사용하는 토큰의 사전을 제공하십시오.
살균기와 결합하기
AddressSanitizer에서 실행하면 조용히 발생하던 손상이 퍼저가 감지할 수 있는 즉각적인 충돌로 바뀝니다.
성능
단일 코어로도 작은 대상에서는 초당 수만 회 실행할 수 있습니다. 몇 시간 또는 며칠 동안 실행하고 CI의 백그라운드에서 계속 실행되도록 하십시오.
충돌 재현
libFuzzer가 충돌을 찾으면 입력을 디스크에 저장합니다. 나중에 재생하여 디버깅하십시오.
./fuzz_target crash-abc123OSS-Fuzz
Google의 OSS-Fuzz는 오픈 소스 프로젝트에서 퍼저를 지속적으로 실행하고 버그를 보고합니다. 많은 유명 라이브러리가 이를 통합합니다.
AFL 및 Honggfuzz
다른 퍼저도 있습니다.
- AFL/AFL++ — 프로세스 기반이며 포크 서버로 속도를 높입니다
- Honggfuzz — 네트워크 프로토콜을 지원합니다
libFuzzer는 C++ 통합이 가장 쉽습니다.
퍼징할 시점
신뢰할 수 없는 입력을 처리하는 모든 코드를 퍼징하십시오.
- 구문 분석기(JSON, XML, protobuf)
- 디코더(이미지, 오디오, 동영상)
- 네트워크 프로토콜 처리기
- 외부 데이터를 읽는 모든 코드
빠른 확인
검사 범위 기반 퍼징이 순수한 무작위 퍼징보다 효과적인 이유는 무엇입니까?
복습
libFuzzer는 Clang에 통합된 검사 범위 기반 퍼저입니다. 작은 LLVMFuzzerTestOneInput 진입점을 작성하고 -fsanitize=fuzzer,address로 빌드한 다음 충돌을 찾도록 실행하십시오. 살균기 및 코퍼스와 결합하고, 신뢰할 수 없는 입력을 다루는 모든 코드를 퍼징하십시오.
자주 묻는 질문
“libFuzzer로 퍼징하기” 강의는 무료인가요?
네 — “libFuzzer로 퍼징하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C++ Academy 강의 전체를 잠금 해제할 수 있습니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“libFuzzer로 퍼징하기”에서 뭘 배우나요?
libFuzzer로 코드를 퍼징하여 예외적인 입력에서 발생하는 충돌을 찾습니다. 브라우저에서 직접 실행하는 실습 코드로 C++ Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C++ Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C++ Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“libFuzzer로 퍼징하기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C++ Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C++ Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 정적 분석 도구: clang-tidy, cppcheck
- Sanitizer: Address, Thread, UB Sanitizer
- libFuzzer로 퍼징하기
- C++ 프로젝트의 지속적 통합