콘텐츠로 이동

syzkaller - 커버리지 기반 커널 퍼저 치트시트

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-managerVM, 코퍼스, 보고 조율
syz-fuzzer게스트 내에서 실행, 프로그램 생성
syz-executor게스트에서 시스템콜 프로그램 실행
syz-repro충돌을 재현기로 최소화
syz-prog2csyz 프로그램을 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 및 접근
procsVM당 병렬 퍼징 프로세스
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 다른 퍼저

측면syzkallerAFL++libFuzzer
목표OS 커널 (시스콜)사용자 공간 바이너리프로세스 내 라이브러리
입력시스콜 프로그램파일/stdin바이트 버퍼
피드백KCOV엣지 커버리지SanitizerCoverage
최적 대상커널 버그 사냥일반 바이너리 퍼징라이브러리 API

사용자 공간 대상은 AFL++ 또는 honggfuzz를 사용합니다; syzkaller는 커널 시스콜 경계 목적입니다.

리소스