Syzkaller
截止到5/28号,网上的教程大多都有问题,包括官方给的教程,大概是因为版本问题,本人配置syzkaller花费了很长时间以致于内心倍感挫败,在此记录我的安装过程希望对后来者有帮助。
架构和使用
Syzkaller是google安全研究人员开发并维护的内核fuzz工具,由go语言编写,含少部分c/c++代码。支持多个操作系统内核,如linux、windows、darwin、openbsd等等,其对linux的支持最为全面。

Syzkaller由多个部件组成:
- syz-manager 总管中枢:管理整个模糊测试,启动/停止虚拟机,收集 crash和coverage数据,提供Web UI展示测试进展和崩溃详情
- 解析配置文件json格式
- 启动多个VM实例并通过SSH部署
syz-fuzzer
,
- 收集VM回传的crash信息,保存日志、生成 repro(复现程序)
- 自动保存工作状态到
workdir
目录,可断点续测
- syz-fuzzer 模糊测试引擎:根据目标架构定义,负责生成系统调用序列
- syz-executor syscall执行器: 在内核中运行syscall程序,收集执行的覆盖率数据,监控是否触发了异常
SSH(Secure shell)是一种安全的远程登陆协议,用于通过网络安全地访问另一台计算机终端,在Syzkaller 中,SSH用于和被测虚拟机进行通信。
执行过程如下:
- 启动syz-manager:执行
./bin/syz-manager -config=config.json
,其中config.json定义了配置(也可以是cfg格式)。
- 启动虚拟机:syz-manager根据配置调用QEMU,模拟环境。
- 建立SSH连接:使用SSH登录VM,并把fuzzing所需的syz-executor复制到VM中。
- 运行syz-fuzzer:syz-manager自动启动多个syz-fuzzer进程,每个对应一个VM,syz-fuzzer生成系统调用程序
- 运行syscall:syz-fuzzer将syscall程序传送给syz-executor,然后开始执行syscall
- 数据收集
安装过程
选择环境VMware+Ubuntu ,官方文档
前置
下载go语言编译器,版本需要>= 1.16
1 2 3 4 5 6 7 8 9 10 11
| wget https://dl.google.com/go/go1.22.3.linux-amd64.tar.gz tar -xf go1.22.3.linux-amd64.tar.gz mv go go1.22.3
# 设置环境变量 echo 'export GOROOT=$HOME/run1/go1.22.3' >> ~/.bashrc echo 'export PATH=$GOROOT/bin:$PATH' >> ~/.bashrc # 生效 source ~/.bashrc # 检查是否安装成功 go version
|
下载编译syzkaller
1 2 3
| git clone https://github.com/google/syzkaller cd syzkaller make
|
下载编译linux内核,进行浅克隆,只获取最新提交,不包含各种提交历史,这样可以拉取更快且节省空间(~200MB)
1
| git clone --depth=1 --branch v6.6 https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git linux-6.6
|
生成默认配置
1 2 3
| cd linux-6.6 make defconfig make kvm_guest.config
|
启用 Syzkaller 所需内核配置,即手动修改.config文件中以下项——nano .config
1 2 3 4 5 6
| CONFIG_KCOV=y # 代码覆盖追踪(coverage) CONFIG_DEBUG_INFO_DWARF4=y # 含符号调试信息(用于 crash 定位) CONFIG_KASAN=y # 内存访问错误检测器 CONFIG_KASAN_INLINE=y # KASAN 内联(性能更好) CONFIG_CONFIGFS_FS=y # Debian Stretch 及以上所需 CONFIG_SECURITYFS=y # Debian 系统安全相关功能
|
再次更新
编译内核
注意这里版本不能太低,否则执行make指令会出现下述错误,选择linux6.6不会出现问题

执行下述指令验证内核是否编译成功
1 2
| ls linux-6.6/vmlinux ls linux-6.6/arch/x86/boot/bzImage
|

系统镜像
创建适用于QEMU的Debian系统镜像,用于内核模糊测试
1 2 3 4 5 6 7 8 9 10 11 12
| # 创建镜像目录 mkdir ~/run1/stretch-img cd ~/run1/stretch-img
# 下载官方脚本 wget https://raw.githubusercontent.com/google/syzkaller/master/tools/create-image.sh -O create-image.sh
# 赋予执行权限 chmod +x create-image.sh
# 运行脚本,构建镜像 ./create-image.sh --feature full
|
注意不能直接写./create-image.sh,否则会默认安装最小系统,会缺失一些功能
查看结构
1 2 3 4 5 6
| stretch-img ├── bullseye ├── bullseye.id_rsa ├── bullseye.id_rsa.pub ├── bullseye.img └── create-image.sh
|
编写rc.local
,这是Linux系统中一个用于开机时自动执行自定义命令的脚本文件。
这里编写脚本用于启动虚拟机时自动完成网络配置并启动SSH服务
1 2 3 4 5 6 7
| sudo mkdir -p /mnt/vm sudo mount -o loop /home/ming/run/stretch-img/bullseye.img /mnt/vm cd /mnt/vm sudo nano etc/rc.local
cd .. sudo umount /mnt/vm
|
填入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #!/bin/sh -e
# 使用 logger 输出信息到系统日志 logger "Running /etc/rc.local"
ip link set eth0 up ip addr flush dev eth0 ip addr add 10.0.2.15/24 dev eth0 ip route add default via 10.0.2.2
# 启动 SSH 服务 logger "Starting SSH service..." /etc/init.d/ssh start
# 输出结束 logger "rc.local execution finished."
exit 0
|
QEMU
安装QEMU虚拟机,Syzkaller默认使用QEMU启动虚拟机运行内核进行模糊测试
1
| sudo apt install qemu-system-x86
|
测试虚拟机
1 2 3 4 5 6 7 8 9 10 11 12
| qemu-system-x86_64 \ -m 2G \ -smp 2 \ -kernel /home/ming/run/linux-6.6/arch/x86/boot/bzImage \ -append "console=ttyS0 root=/dev/sda earlyprintk=serial net.ifnames=0" \ -drive file=/home/ming/run/stretch-img/bullseye.img,format=raw \ -net user,host=10.0.2.10,hostfwd=tcp:127.0.0.1:10021-:22 \ -net nic,model=e1000 \ -enable-kvm \ -nographic \ -pidfile /home/ming/run/vm.pid \ 2>&1 | tee /home/ming/run/vm.log
|
配置中kernel和drive file要替换为自己的镜像路径,enable-kvm需要虚拟机VMware启动虚拟化

启动成功会出现,默认的账号是root,密码回车即可

测试ssh连接
1
| ssh -i ~/run/stretch-img/bullseye.id_rsa -p 10021 root@127.0.0.1
|
成功应出现,输出exit即可退出

启动Syzakller
启动syzkaller(在syzkaller目录下)
1
| ./bin/syz-manager -config=my.cfg -debug
|
my.cfg指定了syzkaller的配置,使用默认配置替换下路径即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| { "target": "linux/amd64", "http": "127.0.0.1:56741", "workdir": "/home/ming/run/syzkaller/workdir", "kernel_obj": "/home/ming/run/linux-6.6", "image": "/home/ming/run/stretch-img/bullseye.img", "sshkey": "/home/ming/run/stretch-img/bullseye.id_rsa", "syzkaller": "/home/ming/run/syzkaller", "procs": 8, "type": "qemu", "vm": { "count": 4, "kernel": "/home/ming/run/linux-6.6/arch/x86/boot/bzImage", "cpu": 2, "mem": 2048 } }
|
注意同一时间syzkaller不能和单独的qemu同时执行否则会出现,关闭其中一个即可

在执行过程中出现以下错误

似乎是因为虚拟网卡的问题,经过测试发现,单独的qemu启动使用的是eht0,而syzkaller启动的qemu使用的是enp0s4,不同的机器可能有不同的配置,可以在rc.local添加命令打印出syzkaller所用的网卡
1 2
| echo "[rc.local] Available interfaces:" | tee /dev/console ip a | tee /dev/console
|
然后根据输出对照地设置
目前已知syzkaller使用的是enp0s4,因此更改rc.local以及/etc/network/interfaces
其中rc.local
1 2 3 4 5 6 7
| sudo mkdir -p /mnt/vm sudo mount -o loop /home/ming/run/stretch-img/bullseye.img /mnt/vm cd /mnt/vm sudo nano etc/rc.local
cd .. sudo umount /mnt/vm
|
填入,其实只要修改eth0为enp0s4即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #!/bin/sh -e
# 使用 logger 输出信息到系统日志 logger "Running /etc/rc.local"
echo "[rc.local] Available interfaces:" | tee /dev/console ip a | tee /dev/console
ip link set enp0s4 up ip addr flush dev enp0s4 ip addr add 10.0.2.15/24 dev enp0s4 ip route add default via 10.0.2.2
# 启动 SSH 服务 logger "Starting SSH service..." /etc/init.d/ssh start
# 输出结束 logger "rc.local execution finished."
exit 0
|
/etc/network/interfaces
1 2 3 4
| sudo mkdir -p /mnt/bullseye sudo mount -o loop /home/ming/run/stretch-img/bullseye.img /mnt/bullseye sudo nano /mnt/bullseye/etc/network/interfaces sudo umount /mnt/bullseye
|
填入
1 2 3 4 5 6 7
| source /etc/network/interfaces.d/*
auto enp0s4 iface enp0s4 inet static address 10.0.2.15 netmask 255.255.255.0 gateway 10.0.2.2
|
完成后再次执行
1
| ./bin/syz-manager -config=my.cfg -debug
|

打开http://127.0.0.1:56741/,syzkaller提供的UI界面,可以看到已经成功在执行模糊测试了
