平台:Ubuntu 22.04.1
1. 安装依赖
sudo apt update
sudo apt install make gcc flex bison libncurses-dev libelf-dev libssl-dev
2. GCC
- 推荐使用较新版本的GCC,本机11.4.0版本没问题
3. 建立文件夹,设置工作目录(供参考)
~/fuzzing
|--- linux
|--- IMAGE
|--- syzkaller
4. Kernel
- 进入
fuzzing
文件夹,获得linux
内核源代码
git clone --branch v6.2 git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git $KERNEL
- 进入
linux
文件夹,生成默认的配置文件
cd linux
make defconfig
make kvm_guest.config
- linux文件夹中,选择显示隐藏文件,可找到.config文件。对该文件进行编辑,使所需的配置选项能够发挥作用
# Coverage collection.
CONFIG_KCOV=y
# Debug info for symbolization.
CONFIG_DEBUG_INFO_DWARF4=y
# Memory bug detector
CONFIG_KASAN=y
CONFIG_KASAN_INLINE=y
# Required for Debian Stretch and later
CONFIG_CONFIGFS_FS=y
CONFIG_SECURITYFS=y
# 这两行若没加,最终启动syzkaller后可能没办法连接到虚拟机
CONFIG_CMDLINE_BOOL=y
CONFIG_CMDLINE="net.ifnames=0"
- 重新生成配置文件
make olddefconfig
- 编译内核
make -j`nproc`
编译内核成功后,可在~/linux目录下可找到vmlinux文件,在~/linux/arch/x86/boot目录下可找到bzImage文件
5. Image
-
安装
debootstrap
测试
Linux
内核时,只有内核没有办法运行,还需要发行版外环境的支持,所以需要使用debootstrap
来生成一个小型的Linux
发行版用于测试
sudo apt install debootstrap
-
生成
Debian Bullseyes Linux 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
完成后在IMAGE
文件夹下会生成bullseyes.img
文件
作者在这一步出现了依赖包无法下载的情况,换源和手动安装均无法解决,尝试关闭vpn后成功
6. QEMU
一般测试的Linux
内核需要运行在虚拟机上进行测试,需要安装qemu
支持硬件虚拟机
- 安装
qemu
sudo apt install qemu-system-x86
- 验证:确保kernel boots和sshd启动
qemu-system-x86_64 \
-m 2G \
-smp 2 \
-kernel $KERNEL/arch/x86/boot/bzImage \ #此处$KERNEL替换为linux文件夹目录
-append "console=ttyS0 root=/dev/sda earlyprintk=serial net.ifnames=0" \
-drive file=$IMAGE/bullseye.img,format=raw \ #此处$IMAGE替换为IMAGE文件夹目录
-net user,host=10.0.2.10,hostfwd=tcp:127.0.0.1:10021-:22 \
-net nic,model=e1000 \
-enable-kvm \
-nographic \
-pidfile vm.pid \
2>&1 | tee vm.log
启动成功后会出现以下界面,输入root登录
登录后可进入虚拟机
此外,新开一个终端,可通过以下命令连接到QEMU虚拟机
ssh -i $IMAGE/bullseye.id_rsa -p 10021 -o "StrictHostKeyChecking no" root@localhost
连接成功后的界面如下,可输入poweroff命令关闭连接
7. syzkaller
- Go:
syzkaller
是以go语言写的,在build syzkaller时需要Go 1.20+
(可将go直接安装在fuzzing目录下,此时$GOROOT
即为~/fuzzing/go
)
wget https://dl.google.com/go/go1.21.4.linux-amd64.tar.gz
tar -xf go1.21.4.linux-amd64.tar.gz
export GOROOT=`pwd`/go
export PATH=$GOROOT/bin:$PATH
- 进入fuzzing文件夹,下载安装syzkaller
git clone https://github.com/google/syzkaller
cd syzkaller
make
- 新建syz-manager配置文件my.cfg,文件内容如下(需要将$GOPATH, $KERNEL, $IMAGE替换为实际的路径),将该文件放置在syzkaller目录下
{
"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
}
}
- 在syzkaller目录下新建workdir文件夹,并运行syzkaller manager
mkdir workdir
./bin/syz-manager -config=my.cfg
运行成功后界面如下:
(这一步,作者因之前未设置步骤4中的CONFIG_CMDLINE_BOOL
和CONFIG_CMDLINE
两个选项,导致连接失败)
可通过浏览器观察manager的状态,IP:127.0.0.1:56741
syzkaller搭建完成!
参考:
https://github.com/google/syzkaller/blob/master/docs/linux/setup.md#go-and-syzkaller