参考官方的配置手册:syzkaller/docs/linux/setup_ubuntu-host_qemu-vm_x86-64-kernel.md at master · google/syzkaller (github.com)

但是也才到了很多坑,花了一天半的时间折腾好。初学的时候总是不停地折腾。加油吧!

踩坑情况:

一、配置过程

1.编译内核时缺程序:bc

bc (Basic Calculate)

image-20231208091301453

解决办法:安装bc之后重新编译。

注:不严重的问题,就是编译十分钟之后报错有点糟心。

2.创建镜像时wget时拒绝连接

image-20231208103425564

解决办法1(无效):

查询raw.githubusercontent.com的ip,将ip加入/etc/hosts

解决办法2(无效):

修改DNS.

解决办法3(成功):

手动复制文件。(反正就这一个文件,还挺小,就手动cv吧。)

3.运行create-image.sh时无法下载所需的包

解决办法:更换为国内镜像源。

注:修改文件后记得apt-get update,我尝试的时候更新得奇慢无比,令人郁闷。

4.启动QEMU时在虚拟机中嵌套使用虚拟机

Could not access KVM kernel module

image-20231208145336238

解决办法:

在虚拟机设置中开启虚拟化,并在主机中关闭Hyper-v。

5.启动QEMU时报错

报错:Failed to mount /sys/kernel/config

解决办法:重新编译内核。有可能是配置的时候什么地方手误写错了。

6.测试syzkaller时无法启动网络接口

Failed to start Raise network interfaces

image-20231208182306123

二、其他坑

1.同时拉取Linux内核、安装QEMU导致拉取失败

一边拉取Linux内核一边安装QEMU,QEMU安装好了但是拉取这边受到了影响。

image-20231207155935995

image-20231207155951417

解决办法:重新拉取。

2.磁盘空间不够。

解决办法:扩容

具体过程见博客末尾一节。

配置过程

一、配置前置:

1.安装make、gcc等

1
2
sudo apt update
sudo apt install make gcc flex bison libncurses-dev libelf-dev libssl-dev

检查一下gcc和g++的版本。

image-20231207101557737

再检查软链接是否指向正确的gcc、g++版本。

1
2
3
cd /user/bin

ls -il | grep gcc

image-20231207101852612

1
ls -il | grep g++

image-20231207102009745

发现软链接都指向正确版本。如果没有,需要修改软链接。

2.安装golang

1
2
sudo apt-get install golang
go version #查看版本

image-20231207155337840

二、编译内核

1.拉取内核源码:

清华源拉得稍微快一点。直接拉github拉真的拉得太慢。(挺慢:torvalds/linux: Linux kernel source tree (github.com)

1
git clone https://mirrors.tuna.tsinghua.edu.cn/git/linux.git

这是目前最新的版本,如果想要以前的旧版本可以自行替换。

直接拉取后文件夹会被自动命名为linux。手册中使用 $VAR 符号(例如 GCC*GCC*、KERNEL 等)来表示路径到目录,这些目录在执行指南时会被创建(例如解压 GCC 存档时会创建一个目录),或者在运行指南之前需要自己创建这些目录。请手动替换这些变量的值。

由于名字不一样,在之后的命令中注意文件路径,改一下名字。

耐心地等待拉取…

image-20231207163317549

2.修改配置文件

拉取好之后,生成默认配置文件。

1
2
3
cd linux
make CC="$GCC/bin/gcc" defconfig
make CC="$GCC/bin/gcc" kvm_guest.config

image-20231208085318104

手动编辑.config文件,或使用make menuconfig。至少需要修改以下内容:

更详细的配置可以参考:syzkaller/docs/linux/kernel_configs.md at master · google/syzkaller (github.com)

1
2
3
4
5
6
7
8
9
10
11
12
13
# 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

重新生成配置文件:

Command:

1
make olddefconfig

image-20231208090953589

3.编译内核(有坑)

Command:

1
make -j`nproc`

编译失败,因为没有bc:

image-20231208091301453

安装bc后再编译,这大概需要十五分钟。

image-20231208095206200

4.检查是否成功

查看vmlinux (kernel binary) 和 bzImage (packed kernel image):

image-20231208101959479

三、安装debootstrap

Command:

1
sudo apt install debootstrap

(这个是我之前安装过的。)

image-20231208102310776

四、创建Debian Bullseye Linux image(有坑)

1.创建生成镜像的脚本(有坑)

Command:

1
2
3
4
5
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

在wget这一步发现网络链接有问题:

image-20231208103425564

解决办法1(无效):

参考:https://blog.csdn.net/weixin_40973138/article/details/106081946以及类似的方法:

查询raw.githubusercontent.com的ip

image-20231208103511873

将ip加入/etc/hosts

好像不行。

image-20231208105134258

解决办法2(无效):修改DNS,不知道为什么还是不行。

解决办法3:

浪费一个大半个上午之后决定直接去把https://raw.githubusercontent.com/google/syzkaller/master/tools/create-image.sh这个文件复制下来,在IMAGE下新建一个.sh命名为create-image.sh,把文件手动复制进去。

2.运行脚本(有坑)

运行:

1
2
chmod +x create-image.sh
./create-image.sh

运行create-image.sh时又出现了报错:

image-20231208120855723

跑到这个网址上一看,404了。

image-20231208120925309

(搞啥啊啊啊啊啊!!!!土拨鼠尖叫!!!)

换源,使用国内Debian镜像

[Debian镜像使用帮助 (163.com)

以Buster为例, 编辑/etc/apt/sources.list文件, 在文件最前面添加以下条目(操作前请做好相应备份)

1
2
3
4
5
6
7
8
deb http://mirrors.163.com/debian/ buster main non-free contrib
deb http://mirrors.163.com/debian/ buster-updates main non-free contrib
deb http://mirrors.163.com/debian/ buster-backports main non-free contrib
deb-src http://mirrors.163.com/debian/ buster main non-free contrib
deb-src http://mirrors.163.com/debian/ buster-updates main non-free contrib
deb-src http://mirrors.163.com/debian/ buster-backports main non-free contrib
deb http://mirrors.163.com/debian-security/ buster/updates main non-free contrib
deb-src http://mirrors.163.com/debian-security/ buster/updates main non-free contrib

编辑完/etc/apt/sources.list之后,别忘了更新:

1
sudo apt-get update

更新时间有点长,倒也不是需要全部更新。

然后再运行create-image.sh。等待一段时间之后,成功。

3.检查是否成功

可以在IMAGE文件夹中看到有 bullseye.img 文件。

image-20231208130517910

image-20231208131022047

至于手册中的Image extra tools,根据自身需要安装吧。

五、安装QEMU

1.安装qemu-system-x86

Command:

1
sudo apt install qemu-system-x86

2.验证是否成功

1.验证能否启动(有坑)

Command:

其中-kernel和file根据自己的文件路径稍作修改,

1
2
3
4
5
6
7
8
9
10
11
12
qemu-system-x86_64 \
-m 2G \
-smp 2 \
-kernel arch/x86/boot/bzImage \
-append "console=ttyS0 root=/dev/sda earlyprintk=serial net.ifnames=0" \
-drive file=IMAGE/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 vm.pid \
2>&1 | tee vm.log
报错1:无法访问KVM内核模块

image-20231208145336238

Could not access KVM kernel module: No such file or directory
qemu-system-x86_64: failed to initialize kvm: No such file or directory

分析:

问题发生场景为在虚拟机中嵌套使用虚拟机,因此不光物理机要支持虚拟化,同时虚拟机也要支持虚拟化,即嵌套虚拟化问题。

解决办法:在虚拟机设置中开启虚拟化。

如果不行,可以参考:[vmware中创建qemu的嵌套虚拟化问题_vmware虚拟机嵌套-CSDN博客

image-20231208145642484

结果又报错啦!(我精神状态好得很呀)

image-20231208150818083

原因分析:

不要同时开启hyper-V和VMware虚拟机软件,两者只能选择其一来使用,要用VMware虚拟机就必须关闭hyper-V 。

使用以下代码关闭Hyper-V,然后重启主机。

1
bcdedit /set hypervisorlaunchtype off

再次启动QEMU。

image-20231208152848208

报错2:Failed to mount /sys/kernel/config

发现有报错,所以现在是emergency mode.

image-20231208153101925

1
systemctl status sys-kernel-config.mount

看一下是什么情况

image-20231208154012621

好像是config配置文件有什么问题?有可能是当时编辑.config的时候手滑输错了什么或者别的什么问题。左思右想之后还是决定重来一次。

然后我回到了第二步,重新编译内核,创建镜像,又折腾半个下午。第二次总算成功啦!!

2.成功启动QEMU

可以看到有登陆界面。

image-20231208173619247

登陆的用户名为root,不需要密码,回车即可。

image-20231208174421862

3.验证能否ssh

在另一个终端里ssh登陆:(注意密钥的路径)

1
ssh -i linux/IMAGE/bullseye.id_rsa -p 10021 -o "StrictHostKeyChecking no" root@localhost

这样就登陆成功啦!

image-20231208174728423

六、下载syzkaller

1
2
3
git clone https://github.com/google/syzkaller
cd syzkaller
make

image-20231208180351416

七、测试

1.修改syzkaller配置文件

在syzkaller文件夹下新建文件夹:workdir,

1
2
cd syzkaller
mkdir workdir

在syzkaller文件夹下新建文件:my.cfg,写入:

其中workdir,image等的路径根据自己的配置修改。

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": "/root/syzkaller/workdir",
"kernel_obj": "/root/linux",
"image": "/root/linux/IMAGE/bullseye.img",
"sshkey": "/root/linux/IMAGE/bullseye.id_rsa",
"syzkaller": "/root/syzkaller",
"procs": 8,
"type": "qemu",
"vm": {
"count": 4,
"kernel": "/root/linux/arch/x86/boot/bzImage",
"cpu": 2,
"mem": 2048
}
}

运行:

1
./bin/syz-manager -config=my.cfg

2.进行测试

在测试的时候一直连不上,最后超时报错。

image-20231208182227076

发现无法启动网络接口:

image-20231208182306123

在测试QEMU时是没有发现这个问题的,因为syzkaller的qemu启动命令与测试的qemu命令不一样,下图是测试时的情景。

image-20231208182833852

参考了这篇博客的解决方法:syzkaller的安装与运行 | giantbranch’s blog

使用测试qemu的命令启动,之后修改/etc/network/interfaces中的eth0改为enp0s4

最后终于成功运行了!!!

3.验证是否成功

在命令行和网页端都可以看见syzkaller在正常运行。

image-20231208184449710

image-20231208184510791

喜大普奔!!!!!

附:磁盘扩容:

编译内核的时候报错说没有可用空间了,然后去虚拟机设置那里分配了更多的内存,结果登陆的时候原先的用户名和密码登不进去了。更改root密码,再登陆。幸好文件和配置没有丢失。

查看一下文件系统的使用情况。

1
df -h

image-20231207170721097

解决办法:

想使用bleachbit清理一下不需要的文件,结果发现bleachbit还没有安装,甚至没有安装空间了,只好先把拉取下来的内核源码删掉(回收站里也要删),安装上bleachbit

1
2
sudo apt-get install bleachbit
sudo bleachbit

删掉内核源码之后再查看文件系统使用情况:

image-20231207172110898

删掉一些缓存文件等等再查看文件系统使用情况:

image-20231207172549769

如果还是不够怎么办呢?

切换到根目录下面看一下是什么占用了那么多内存。

1
2
cd /
du -h -x --max-depth=1

image-20231207172850230

好像没啥可删的了,还是把源码拉回来吧。

image-20231207174857782

呃。。。。。。还是扩容吧。

先在主机上分配更多的硬盘空间(我把最大从20G改为35G,读者按需更改),然后在虚拟机内部增加空间。

image-20231207175459304

image-20231208002915660

https://zhuanlan.zhihu.com/p/574737232

image-20231208002935931

image-20231208003900125

原理

我们是不能直接给/dev/sda1分区调整大小的。只能通过swap(交换空间)进行中转。然后再调整/dev/sda1分区的大小就行了。最后一定要记得保存!