安装 Syzkaller(Linux 内核模糊测试工具)

Syzkaller

截止到5/28号,网上的教程大多都有问题,包括官方给的教程,大概是因为版本问题,本人配置syzkaller花费了很长时间以致于内心倍感挫败,在此记录我的安装过程希望对后来者有帮助。

架构和使用

Syzkaller是google安全研究人员开发并维护的内核fuzz工具,由go语言编写,含少部分c/c++代码。支持多个操作系统内核,如linux、windows、darwin、openbsd等等,其对linux的支持最为全面。

image-20250526154409481

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用于和被测虚拟机进行通信。

执行过程如下:

  1. 启动syz-manager:执行./bin/syz-manager -config=config.json,其中config.json定义了配置(也可以是cfg格式)。
  2. 启动虚拟机:syz-manager根据配置调用QEMU,模拟环境。
  3. 建立SSH连接:使用SSH登录VM,并把fuzzing所需的syz-executor复制到VM中。
  4. 运行syz-fuzzer:syz-manager自动启动多个syz-fuzzer进程,每个对应一个VM,syz-fuzzer生成系统调用程序
  5. 运行syscall:syz-fuzzer将syscall程序传送给syz-executor,然后开始执行syscall
  6. 数据收集

安装过程

选择环境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 系统安全相关功能

再次更新

1
make olddefconfig

编译内核

1
make -j$(nproc)

注意这里版本不能太低,否则执行make指令会出现下述错误,选择linux6.6不会出现问题

image-20250528083135579

执行下述指令验证内核是否编译成功

1
2
ls linux-6.6/vmlinux
ls linux-6.6/arch/x86/boot/bzImage

image-20250528083431877

系统镜像

创建适用于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
tree -L 1 stretch-img
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启动虚拟化

image-20250528085334161

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

image-20250528090441259

测试ssh连接

1
ssh -i ~/run/stretch-img/bullseye.id_rsa -p 10021 root@127.0.0.1

成功应出现,输出exit即可退出

image-20250528090611606

启动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同时执行否则会出现,关闭其中一个即可

image-20250528091003666

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

image-20250528091310394

似乎是因为虚拟网卡的问题,经过测试发现,单独的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

image-20250528092715153

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

image-20250528092831056


安装 Syzkaller(Linux 内核模糊测试工具)
http://example.com/2025/05/28/Syzkaller安装/
作者
nndjxh
发布于
2025年5月28日
许可协议