syzkaller - 커버리지 기반 커널 퍼저 치트시트
syzkaller는 Google의 자율, 커버리지 기반 커널 퍼저입니다. 선언적 언어(syzlang)로 설명된 시스템콜 시퀀스를 생성하고, VM 내에서 실행하고, 커널 커버리지(KCOV)를 사용하여 탐사되지 않은 코드로 돌연변이를 안내하고, 커널 살균기로 충돌을 감지합니다. 인간 입력 없이 계속 실행되며 수천 개의 Linux 커널 버그를 찾았습니다 — syzbot 연속 퍼징 시스템이 그 위에 구축되었습니다. BSD, Fuchsia, Windows를 포함한 다른 커널도 지원합니다.
퍼징은 설계상 커널을 손상시킵니다. 항상 일회용 VM 내에서 실행하고, 관심 있는 기계에서는 절대 실행하지 마십시오.
전제조건
| 요구사항 | 참고 |
|---|
| Go 도구 체인 | syzkaller를 빌드하려면 |
| 커널 소스 | KCOV, KASAN, 디버그 정보로 구축 |
| VM 지원 | QEMU/KVM, GCE, 또는 물리적 보드 |
| 디스크 이미지 | 게스트용 최소한의 rootfs |
빌드
git clone https://github.com/google/syzkaller
cd syzkaller && make
| 바이너리 | 역할 |
|---|
syz-manager | VM, 코퍼스, 보고 조율 |
syz-fuzzer | 게스트 내에서 실행, 프로그램 생성 |
syz-executor | 게스트에서 시스템콜 프로그램 실행 |
syz-repro | 충돌을 재현기로 최소화 |
syz-prog2c | syz 프로그램을 C로 변환 |
필수 커널 설정
| 옵션 | 목적 |
|---|
CONFIG_KCOV=y | 커버리지 피드백 (필수) |
CONFIG_KASAN=y | 메모리 오류 감지 |
CONFIG_DEBUG_INFO=y | 기호화된 보고 |
CONFIG_KASAN_INLINE=y | 빠른 KASAN |
CONFIG_FAULT_INJECTION=y | 오류 경로 탐사 |
CONFIG_DEBUG_KMEMLEAK=y | 누수 감지 (선택) |
KCOV 없으면 퍼저는 장님입니다 — 커버리지 피드백이 무작위보다 효과적으로 만드는 것입니다.
관리자 설정
{
"target": "linux/amd64",
"http": "127.0.0.1:56741",
"workdir": "/home/user/syzkaller/workdir",
"kernel_obj": "/home/user/linux",
"image": "/home/user/image/bullseye.img",
"sshkey": "/home/user/image/bullseye.id_rsa",
"syzkaller": "/home/user/syzkaller",
"procs": 8,
"type": "qemu",
"vm": { "count": 4, "kernel": "/home/user/linux/arch/x86/boot/bzImage", "cpu": 2, "mem": 2048 }
}
./bin/syz-manager -config my.cfg
| 필드 | 목적 |
|---|
target | 테스트 중인 OS/아키텍처 |
kernel_obj | 커널 빌드 디렉터리 (기호화용) |
image / sshkey | 게스트 rootfs 및 접근 |
procs | VM당 병렬 퍼징 프로세스 |
vm.count | 동시 VM 개수 |
http | 웹 대시보드 주소 |
웹 대시보드
| 보기 | 표시 |
|---|
| 충돌 | 고유 충돌 제목 + 개수 |
| 코퍼스 | 커버리지에 기여하는 프로그램 |
| 커버리지 | 어느 커널 파일/라인에 도달함 |
| 통계 | 실행 속도, VM 상태 |
커버리지는 감시할 수: 안정화되면 퍼저가 시스템콜 설명이 도달할 수 있는 것을 소진했습니다.
syzlang (시스템콜 설명)
# 단순화된 예: 시스템콜의 인수 구조 설명
open(file ptr[in, filename], flags flags[open_flags], mode flags[open_mode]) fd
read(fd fd, buf buffer[out], count len[buf])
좋은 설명이 퍼저가 심층 코드에 도달하기에 충분히 유효한 프로그램을 빌드할 수 있게 합니다. sys/linux/*.txt를 확장하는 것은 종종 가장 높은 가치의 기여입니다.
충돌 재현
| 명령어 | 목적 |
|---|
| 자동 | 관리자가 새 충돌에서 syz-repro 실행 |
syz-repro -config my.cfg crash.log | 수동 최소화 |
syz-prog2c -prog repro.syz | 독립형 C 재현기 내보내기 |
| C 재현기 | 버그 보고서에 첨부하는 것 |
syzkaller vs 다른 퍼저
| 측면 | syzkaller | AFL++ | libFuzzer |
|---|
| 목표 | OS 커널 (시스콜) | 사용자 공간 바이너리 | 프로세스 내 라이브러리 |
| 입력 | 시스콜 프로그램 | 파일/stdin | 바이트 버퍼 |
| 피드백 | KCOV | 엣지 커버리지 | SanitizerCoverage |
| 최적 대상 | 커널 버그 사냥 | 일반 바이너리 퍼징 | 라이브러리 API |
사용자 공간 대상은 AFL++ 또는 honggfuzz를 사용합니다; syzkaller는 커널 시스콜 경계 목적입니다.
리소스