资讯详情 syzkaller Linux 内核模糊测试环境搭建完全指南:从零构建覆盖引导内核 fuzzing 平台
📅 2026/10/13 6:03:16
测试操作系统网络安全【免费下载链接】syzkallersyzkaller is an unsupervised coverage-guided kernel fuzzer项目地址https://gitcode.com/gh_mirrors/syz/syzkaller点击查看免费下载导读本文是 syzkaller 官方 Linux 内核模糊测试环境搭建文档docs/linux/setup.md的完整实战化讲解覆盖从 Go 工具链、syzkaller 二进制构建、带 KCOV 覆盖支持的 GCC 与 Linux 内核准备到 QEMU 虚拟机镜像制作、syz-manager配置与常见故障排查的完整链路。读完本文你将掌握一套可复现的 syzkaller Linux 内核 fuzzing 环境搭建方案理解make交叉构建参数、内核覆盖配置项与 VM 工作机的通用要求并能够独立启动syz-manager开始模糊测试。一、搭建前的组件总览根据 docs/linux/setup.md一个可用的 syzkaller Linux 环境需要以下四类组件Go 编译器与 syzkaller 本体syzkaller 使用 Go 编写需要 Go 1.21 工具链完成构建支持覆盖coverage的 C 编译器syzkaller 是覆盖引导coverage-guided的模糊测试器内核必须以带覆盖率插桩的方式编译带覆盖扩展的 Linux 内核内核侧需要 KCOVkernel code coverage支持虚拟机VM或物理设备syzkaller 在工作机 VM 中执行 fuzzing 程序防止恶意程序直接破坏宿主。官方推荐的 syzbot 生产环境参考配置位于 dashboard/config/linux/upstream-apparmor-kasan.config可作为内核配置模板。二、安装 Go 工具链与构建 syzkaller2.1 安装 Go 1.21 工具链syzkaller 使用 Go 编写官方支持 2 个最新 Go 版本当前仓库的 go.mod 声明go 1.21。可通过下载官方二进制包安装wget https://dl.google.com/go/go1.21.4.linux-amd64.tar.gz tar -xf go1.21.4.linux-amd64.tar.gz export GOROOTpwd/go export PATH$GOROOT/bin:$PATH也可参考 Go 官方安装文档选择其他安装方式。安装完成后确认go version可正常输出。2.2 下载并构建 syzkallergit clone https://github.com/google/syzkaller cd syzkaller make构建完成后编译出的二进制会出现在bin/目录下。仓库根目录 Makefile 揭示了构建过程的核心机制它内部通过tools/syz-make/make.go解析环境变量再调用 Go 编译各组件。默认的make等价于make all会构建host与target两组目标host 目标syz-manager、syz-repro、syz-mutate、syz-prog2c、syz-db、syz-upgrade等运行在宿主机上的工具target 目标syz-execprog与syz-executor由executor/executor.cc经 C 编译产生见 Makefile它们运行在目标 VM 内。2.3 make 交叉构建参数详解如需进行跨 OS/架构测试必须为make指定三组参数见 Makefile参数含义说明HOSTOS/HOSTARCH宿主机 OS/架构syz-manager运行的环境默认取当前机器TARGETOS/TARGETVMARCH被测目标 OS/架构目标 VM 中运行的 OS 与内核架构TARGETOS/TARGETARCH被测测试进程架构与TARGETVMARCH不同仅出现在测试 386 兼容系统调用等场景典型用法示例# 本机直接测试 linux/amd64 make # 在 darwin/amd64 宿主上交叉构建 linux/arm64 目标 make HOSTOSdarwin HOSTARCHamd64 TARGETOSlinux TARGETARCHarm64 # 在 amd64 内核上测试 x86 32 位兼容系统调用 make TARGETVMARCHamd64 TARGETARCH386此外 Makefile 还提供了make install_prerequisites目标可一键安装跨架构交叉编译所需的各类 GCC/G 工具链与 clang、flatbuffers 等依赖。2.4 跨架构环境的 binutils 配置syzkaller 依赖binutils工具集objdump、nm、addr2line、readelf将 kcov 导出的基本块地址映射回源码行与函数详见 docs/linux/coverage.md。在跨架构 fuzzing 环境下必须在启动syz-manager前提供对应的交叉 binutils且符号名前缀需符合目标 triple。以下以 mips64le 为例mkdir -p ~/bin/mips64le ln -s which mips64el-linux-gnuabi64-addr2line ~/bin/mips64le/addr2line ln -s which mips64el-linux-gnuabi64-nm ~/bin/mips64le/nm ln -s which mips64el-linux-gnuabi64-objdump ~/bin/mips64le/objdump ln -s which mips64el-linux-gnuabi64-readelf ~/bin/mips64le/readelf export PATH~/bin/mips64le:$PATH目标 triple 前缀由syz-manager配置中的target选项决定。这些工具在覆盖报告生成链路中的作用分别为readelf检测内核镜像的虚拟内存偏移、nm解析每个函数的地址与大小、objdump反汇编定位__sanitizer_cov_trace_pc调用点、addr2line将 PC 映射到源文件与行号。三、C 编译器要求覆盖支持syzkaller 是覆盖引导的模糊测试器内核必须以带覆盖支持的方式构建。Linux 内核的 KCOV 覆盖率插桩依赖 GCC 的-fsanitize-coverage能力该支持在GCC 6.1.0 及以后版本中正式提供。若发行版自带 GCC 版本过旧可选用 syzbot 使用的编译器参见 docs/syzbot.md。仓库记录了 syzbot 正在使用的gcr.io/syzkaller/syzbot:gcc-10.2.1Docker 镜像以及历史 GCC 7/8/9/10 系列与 clangKMSAN工具链的下载地址可直接获取。四、Linux 内核准备KCOV 与推荐配置4.1 KCOV内核侧覆盖支持除 GCC 侧支持外内核侧需要 KCOV 支持。KCOV 自Linux 4.6进入 mainline通过内核配置项CONFIG_KCOVy启用。对于更老的内核至少需要 backport 提交 kernel: add kcov code coverage5c9a8750a6409c63a0f01d51a9024861022f6593并建议 backport 所有触及kernel/kcov.c的补丁。4.2 推荐内核配置项为启用更多 syzkaller 特性、提升漏洞检出能力建议按 docs/linux/kernel_configs.md 启用额外配置。以下是最低限度的核心配置组合以 x86-64 QEMU 场景为例出自 docs/linux/setup_ubuntu-host_qemu-vm_x86-64-kernel.md# 覆盖收集 CONFIG_KCOVy # 符号化所需的调试信息 CONFIG_DEBUG_INFO_DWARF4y # 内存缺陷检测器 CONFIG_KASANy CONFIG_KASAN_INLINEy # Debian 镜像Stretch 及以后所需 CONFIG_CONFIGFS_FSy CONFIG_SECURITYFSy更完整的覆盖收集配置来自 docs/linux/kernel_configs.mdCONFIG_KCOVy CONFIG_KCOV_INSTRUMENT_ALLy CONFIG_KCOV_ENABLE_COMPARISONSy CONFIG_DEBUG_FSy其中CONFIG_KCOV_ENABLE_COMPARISONS需要 gcc 8且旧内核需 backport kcov: support comparison operands collection 与 kcov: fix comparison callback signature 两个提交。其他值得关注的配置类别内存泄漏检测CONFIG_DEBUG_KMEMLEAKyKernel Memory Leak DetectorkmemleakWeb 界面覆盖展示CONFIG_DEBUG_INFOy已启用系统调用与内核位宽检测CONFIG_KALLSYMSy、CONFIG_KALLSYMS_ALLy更佳沙箱CONFIG_NAMESPACESy、CONFIG_UTS_NSy、CONFIG_IPC_NSy、CONFIG_PID_NSy、CONFIG_NET_NSy、CONFIG_CGROUP_PIDSy、CONFIG_MEMCGy若使用namespace沙箱还需CONFIG_USER_NSyQEMU 虚拟机通常需要make kvm_guest.configDebian 镜像由 tools/create-image.sh 生成还需CONFIG_CONFIGFS_FSy、CONFIG_SECURITYFSyKASLR建议# CONFIG_RANDOMIZE_BASE is not set若内核缺少kcov: make kcov work properly with KASLR enabled等提交则必须禁用禁用可预测网络接口命名可通过内核参数CONFIG_CMDLINE_BOOLy、CONFIG_CMDLINEnet.ifnames0实现也可在 syz-manager 配置的cmdline中设置故障注入fault injectionCONFIG_FAULT_INJECTIONy、CONFIG_FAULT_INJECTION_DEBUG_FSy、CONFIG_FAULT_INJECTION_USERCOPYy、CONFIG_FAILSLABy、CONFIG_FAIL_PAGE_ALLOCy、CONFIG_FAIL_MAKE_REQUESTy、CONFIG_FAIL_IO_TIMEOUTy、CONFIG_FAIL_FUTEXy锁与内存调试CONFIG_LOCKDEPy、CONFIG_PROVE_LOCKINGy、CONFIG_DEBUG_ATOMIC_SLEEPy、CONFIG_PROVE_RCUy、CONFIG_DEBUG_VMy、CONFIG_REFCOUNT_FULLy、CONFIG_FORTIFY_SOURCEy、CONFIG_HARDENED_USERCOPYy、CONFIG_LOCKUP_DETECTORy、CONFIG_SOFTLOCKUP_DETECTORy、CONFIG_HARDLOCKUP_DETECTORy、CONFIG_BOOTPARAM_HARDLOCKUP_PANICy、CONFIG_DETECT_HUNG_TASKy、CONFIG_WQ_WATCHDOGy降低误报的 hung/stall 超时CONFIG_DEFAULT_HUNG_TASK_TIMEOUT140、CONFIG_RCU_CPU_STALL_TIMEOUT100。Bug 检测方面syzkaller 设计上与 KASANCONFIG_KASANy上游可用、KTSAN原型、KMSAN原型或 KUBSANCONFIG_UBSANy配合使用。4.3 内核构建流程示例x86-64以 Ubuntu 宿主 QEMU x86-64 内核为例完整步骤见 docs/linux/setup_ubuntu-host_qemu-vm_x86-64-kernel.mdsudo apt update sudo apt install make gcc flex bison libncurses-dev libelf-dev libssl-dev git clone --branch v6.2 git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git $KERNEL cd $KERNEL make defconfig make kvm_guest.config # 手工编辑 .config 启用上述必需选项或使用 make menuconfig make olddefconfig make -jnproc构建成功后应得到内核二进制$KERNEL/vmlinux与打包内核镜像$KERNEL/arch/x86/boot/bzImage。若指定编译器可将上述make替换为make CC$GCC/bin/gcc ...。五、VM工作机环境设置syzkaller 在工作虚拟机或物理设备上执行内核 fuzzing这些工作环境统称为 VM。开箱即用地syzkaller 支持QEMU、kvmtool、GCE 虚拟机、Android 设备以及 Odroid C2 开发板。5.1 syzkaller VM 的通用要求根据 docs/linux/setup.md任何 syzkaller 工作 VM 必须满足以下四点网络支持fuzzing 进程需要与外界通信VM 镜像必须包含网络支持SSH 服务器fuzzer 的程序文件通过 SSH 传输进 VM镜像需运行 sshd免密 root SSHVM 的 SSH 配置应允许syz-manager配置中指定的身份直接 root 登录即无需输入密码即可执行ssh -i $SSHID -p $PORT rootlocalhostSSHID为配置中的 SSH 私钥文件PORT为配置中的端口debugfs 挂载内核通过 debugfs 条目导出覆盖信息VM 需将 debugfs 挂载到/sys/kernel/debug。5.2 使用 create-image.sh 制作 Debian 镜像QEMU VM 需要在宿主安装 QEMU。官方提供了 tools/create-image.sh 脚本用于创建适合 syzkaller 的最小 Debian Linux 镜像。脚本基于 debootstrap 构建预装openssh-server, curl, tar, gcc, libc6-dev, time, strace, sudo, less, psmisc, selinux-utils, policycoreutils, checkpolicy, selinux-policy-default, firmware-atheros等软件包并通过ADD_PACKAGE环境变量追加make, sysbench, git, vim, tmux, usbutils, tcpdump等实用工具。脚本同时会自动完成以下关键配置清除 root 密码并生成bullseye.id_rsa/bullseye.id_rsa.pub密钥对公钥写入/root/.ssh/authorized_keys实现免密 SSH在/etc/fstab中写入debugfs /sys/kernel/debug debugfs defaults 0 0等挂载项debugfs、securityfs、configfs、binfmt_misc配置串口 gettyttyS0、DHCP 网络eth0与 hostname。常用参数./create-image.sh -h可查看全部参数含义默认值-a, --arch目标架构当前机器架构uname -m-d, --distributionDebian 发行版bullseye-f, --feature镜像特性minimal或fullminimal-s, --seek镜像大小MB如 2048 表示 2G20471-p, --add-perf额外构建 perf需先设置$KERNEL环境变量关闭典型使用流程mkdir $IMAGE cd $IMAGE/ wget https://raw.githubusercontent.com/google/syzkaller/master/tools/create-image.sh -O create-image.sh chmod x create-image.sh ./create-image.sh # 指定发行版 ./create-image.sh --distribution buster # 安装完整工具集 ./create-image.sh --feature full # 附带 perf 支持需要 $KERNEL 指向内核源码 ./create-image.sh --add-perf结果应为$IMAGE/bullseye.img磁盘镜像。跨架构场景下目标架构不同于宿主脚本要求宿主安装qemu-user-static并具备对应 binfmt 注册项。5.3 QEMU 参数与验证手工启动 QEMU 验证内核能启动、sshd 能运行qemu-system-x86_64 \ -m 2G \ -smp 2 \ -kernel $KERNEL/arch/x86/boot/bzImage \ -append consolettyS0 root/dev/sda earlyprintkserial net.ifnames0 \ -drive file$IMAGE/bullseye.img,formatraw \ -net user,host10.0.2.10,hostfwdtcp:127.0.0.1:10021-:22 \ -net nic,modele1000 \ -enable-kvm \ -nographic \ -pidfile vm.pid \ 21 | tee vm.log看到内核启动日志且[ ok ] Starting OpenBSD Secure Shell server: sshd.后即可在另一终端验证 SSHssh -i $IMAGE/bullseye.id_rsa -p 10021 -o StrictHostKeyChecking no rootlocalhost若报 too many tries说明 ssh 在显式传入的-i密钥前尝试了默认密钥可追加-o IdentitiesOnly yes。退出 QEMU 用CtrlA后按X或执行kill $(cat vm.pid)。5.4 QEMU 配置参数源码级解析syz-manager配置中vm字段的 QEMU 参数定义在 vm/qemu/qemu.go核心字段包括字段含义默认行为count并行运行的 VM 数量1qemuQEMU 二进制名按架构默认如qemu-system-x86_64qemu_args附加 QEMU 命令行参数默认含机型、cpu 与-enable-kvm自定义时必须自行包含所需内容支持{{INDEX}}、{{TEMPLATE}}、{{TCP_PORT}}、{{FN%8}}占位符kernel注入启动的内核镜像对应-kernel可选cmdline启动内核的附加命令行仅与kernel同用时有效initrd初始 ramdisk对应-initrd可选image_device磁盘设备描述默认hda转为-hda image也支持drive index0,mediadisk,file现代写法network_device网络设备类型按架构默认amd64 为e1000arm64 为virtio-net-pcicpu/memVM CPU 数量 / 内存MiB1 / 1024snapshot构建内核时是否不使用-snapshottrue各架构默认 QEMU 参数同样定义在 vm/qemu/qemu.go例如linux/amd64默认QemuArgs-enable-kvm -cpu host,migratableoff、NetDeve1000、CmdLine[root/dev/sda,consolettyS0]linux/arm64默认-machine virt,virtualizationon -cpu cortex-a57 -accel tcg,threadmulti。这些默认值解释了 setup.md 中 QEMU MSR 故障的根源见下文排查章节。六、syz-manager 配置与启动6.1 完整配置示例QEMU x86-64参照 docs/linux/setup_ubuntu-host_qemu-vm_x86-64-kernel.md 与 pkg/mgrconfig/testdata/qemu.cfg一个典型配置如下将$GOPATH、$KERNEL、$IMAGE替换为实际值{ target: linux/amd64, http: 127.0.0.1:56741, workdir: $GOPATH/src/github.com/google/syzkaller/workdir, kernel_obj: $KERNEL, image: $IMAGE/bullseye.img, sshkey: $IMAGE/bullseye.id_rsa, syzkaller: $GOPATH/src/github.com/google/syzkaller, procs: 8, type: qemu, vm: { count: 4, kernel: $KERNEL/arch/x86/boot/bzImage, cpu: 2, mem: 2048 } }启动mkdir workdir ./bin/syz-manager -configmy.cfg浏览器访问127.0.0.1:56741即可查看 fuzzing 状态。6.2 关键配置项源码级解读pkg/mgrconfig/config.gopkg/mgrconfig/config.go定义了全部配置字段值得关注的核心项target目标 OS/架构例如linux/arm64或linux/amd64/386amd64 内核 386 测试进程httpsyz-manager 的 Web 状态页面地址rpc为 fuzzer 进程提供 RPC 的 TCP 地址可选workdir工作目录产出crashes/*崩溃报告、corpus.db语料库、instance-x各 VM 临时文件kernel_obj内核对象文件目录如vmlinux用于报告符号化与覆盖报告可选的kernel_src/kernel_build_src分别指定源码与构建目录module_obj用于树外内核模块image/sshkey/ssh_user磁盘镜像、宿主侧 root SSH 私钥、SSH 用户默认rootprocs每个 VM 内并行测试进程数允许 1-32推荐约 4-8默认 6应在饱和 VM CPU 的同时避免过度超订导致 OOM 与伪挂起sandbox沙箱类型——noneroot 下测试覆盖最大默认、namespaceCLONE_NEWUSER 用户命名空间需CONFIG_USER_NS、setuid降权为 nobody最严格、android模拟不受信任的 Android 应用权限cover是否使用 KCOV 覆盖默认 truecover_filter支持按files/functions/pcs过滤覆盖reproduce崩溃复现、定位与最小化默认 truefuzzing_vms可预留若干 VM 专用于 fuzzingenable_syscalls/disable_syscalls/no_mutate_syscalls系统调用过滤支持通配符如openat$ashmem、ioctl$ASHMEM*suppressions/ignores/interests按正则过滤已知崩溃报告typeVM 类型qemu、gce、android、isolated等vm为类型专属参数QEMU 参数见 5.4 节email_addrs首次发现 bug 时邮件通知的地址列表dashboard_client/dashboard_addr/dashboard_key用于对接 syzbot 仪表盘。syz-manager还支持命令行调试开关见 syz-manager/manager.go-debug将所有 VM 输出转储到控制台此时仅运行一个 VM 实例、-bench周期性写入执行统计以及-modefuzzing、smoke-test、corpus-triage、corpus-run、run-tests等运行模式。七、故障排查7.1 通用调试手段-debug标志打印syz-manager与所有syz-executor实例的全部调试输出但只运行一个 VM 实例-vv N标志提高日志量N 越大输出越多executor 日志写入workdir/crashes子目录executor 故障若日志出现executor failure可将syz-executor与syz-execprog拷入 VM运行./syz-execprog -executor ./syz-executor -debug sampleprogsampleprog 可仅含getpid()手动验证。若clone失败通常说明内核缺少所需命名空间支持可先以-sandboxsetuid验证再在配置中把sandbox改为setuidfailed to copy binary若使用 Buildroot 镜像且输出含subsystem request failed on channel 0多由 OpenSSH 9.0 强制 SFTP 协议所致升级 Buildroot 镜像并确保启用 SFTP。7.2 QEMU 专属问题1QEMU 需要 root 才能使用-enable-kvm将当前用户加入kvm组后重新登录sudo usermod -a -G kvm 用户名2QEMU 启动崩溃MSR 断言qemu-system-x86_64: error: failed to set MSR 0x48b to 0x159ff00000000 qemu-system-x86_64: /build/qemu-EmNSP4/qemu-4.2/target/i386/kvm.c:2947: kvm_put_msrs: Assertion ret cpu-kvm_msr_buf-nmsrs failed.根因是默认qemu_args中的-cpu host,migratableoff见 vm/qemu/qemu.go 中 amd64 默认值。解决方法是移除该参数最简单的方式是在配置中显式设置qemu_args为-enable-kvm。7.3 Linux 内核专属排查来自 docs/linux/troubleshooting.mdVM 无法启动用qemu-system-x86_64 -hda $IMAGE -m 256 -net nic -net user,host10.0.2.10,hostfwdtcp::23505-:22 -enable-kvm -kernel $KERNEL -append root/dev/sda手工验证SSH 不通确认内核配置含网络支持必要时补充CONFIG_VIRTIO_NETy、CONFIG_E1000y、CONFIG_E1000Eydefconfig 常遗漏Failed to start Raise network interfaces禁用可预测网络接口命名——要么在内核配置加CONFIG_CMDLINE_BOOLyCONFIG_CMDLINEnet.ifnames0并重编内核要么在 syz-manager 配置的vm.cmdline中加net.ifnames0后者不保证对所有虚拟化技术有效KCOV 不可用在 VM 内依次执行ls /sys/kernel/debug检查 debugfs 是否挂载、ls /sys/kernel/debug/kcov检查 kcov 是否启用并编译运行Documentation/kcov.txt中的测试程序符号缺失将 kcov 测试程序输出的十六进制地址喂给addr2line -a -i -f -e $VMLINUX确认内核符号可用。八、其他平台设置指南索引官方为不同宿主/VM 组合提供了专门的搭建指南均位于 docs/linux 目录Ubuntu 宿主 QEMU x86-64 内核最常用的入门路线含完整内核编译、镜像制作、QEMU 验证与配置示例Linux 宿主 QEMU arm64 内核使用 buildroot 生成 ext3 镜像、Linaro AArch64 工具链、make TARGETARCHarm64交叉构建Linux 宿主 QEMU arm 内核 与 s390x 内核同类流程的 arm/s390x 变体Linux 宿主 QEMU riscv64 内核需自行获取riscv64-linux-gnu-gccGCC 8与 OpenSBI使用 buildrootqemu_riscv64_virt_defconfig制作镜像Linux 宿主 Android 设备 arm32/64 内核面向 Android 设备Linux 隔离宿主isolated host仅凭 SSH 管理远程物理机使用反向 SSH 代理通信配置type: isolatedvm.targets指定主机列表、vm.target_dir指定目标机工作目录、vm.target_reboot控制在远程进程挂起时是否重启机器可选pstore: true从/sys/fs/pstore拉取崩溃日志、startup_script在 fuzzing 重启前执行命令Ubuntu 宿主 VMware x86-64 内核VMware 场景。结语搭建 syzkaller Linux 内核 fuzzing 环境的关键链路可归纳为Go 工具链与 syzkaller 构建 → 带 KCOV 支持的内核与 GCC → 满足网络/SSH/debugfs 三大要求的 VM 镜像 → 一份正确的 syz-manager 配置。理解make的 HOST/TARGET 参数体系、CONFIG_KCOV系列内核选项以及syz-manager配置字段特别是type/vm与sandbox的语义即可在此基础上灵活扩展到任意架构与 VM 类型。遇到问题时先以-debug模式启动、用 QEMU 手工验证启动与 SSH、逐项核对 kcov 与 debugfs再对照 docs/troubleshooting.md 排查即可快速定位。赞分享测试操作系统网络安全【免费下载链接】syzkallersyzkaller is an unsupervised coverage-guided kernel fuzzer项目地址https://gitcode.com/gh_mirrors/syz/syzkaller点击查看免费下载相关推荐syzkaller 部署完整指南从零搭建 Linux 内核模糊测试环境syzkaller 部署完整指南从零搭建 Linux 内核模糊测试环境 导读 本指南面向希望在本机搭建 syzkaller 内核模糊测试环境的开发者系统讲解网络安全开发工具质量保障syzkaller 实战Linux 主机 QEMU 虚拟机环境对 LoongArch64 内核进行覆盖引导模糊测试syzkaller 实战Linux 主机 QEMU 虚拟机环境对 LoongArch64 内核进行覆盖引导模糊测试 本指南完整讲解如何在 Linux 主机网络安全开发工具质量保障syzkaller 环境搭建实战Linux 主机 QEMU 虚拟机 arm64 内核模糊测试完整指南syzkaller 环境搭建实战Linux 主机 QEMU 虚拟机 arm64 内核模糊测试完整指南 syzkaller 是一款基于覆盖率引导cov网络安全开发工具质量保障上一篇WezTerm CLI 全面指南用 wezterm cli 远程操控运行中的终端实例下一篇grepWinWindows平台上最强大的正则表达式搜索替换工具终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考