Set up Syzkaller (记录安装过程)
但是也才到了很多坑,花了一天半的时间折腾好。初学的时候总是不停地折腾。加油吧!
踩坑情况:
一、配置过程
1.编译内核时缺程序:bc
bc (Basic Calculate)
解决办法:安装bc之后重新编译。
注:不严重的问题,就是编译十分钟之后报错有点糟心。
2.创建镜像时wget时拒绝连接
解决办法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
解决办法:
在虚拟机设置中开启虚拟化,并在主机中关闭Hyper-v。
5.启动QEMU时报错
报错:Failed to mount /sys/kernel/config
解决办法:重新编译内核。有可能是配置的时候什么地方手误写错了。
6.测试syzkaller时无法启动网络接口
Failed to start Raise network interfaces
二、其他坑
1.同时拉取Linux内核、安装QEMU导致拉取失败
一边拉取Linux内核一边安装QEMU,QEMU安装好了但是拉取这边受到了影响。
解决办法:重新拉取。
2.磁盘空间不够。
解决办法:扩容
具体过程见博客末尾一节。
配置过程
一、配置前置:
1.安装make、gcc等
1 | sudo apt update |
检查一下gcc和g++的版本。
再检查软链接是否指向正确的gcc、g++版本。
1 | cd /user/bin |
1 | ls -il | grep g++ |
发现软链接都指向正确版本。如果没有,需要修改软链接。
2.安装golang
1 | sudo apt-get install golang |
二、编译内核
1.拉取内核源码:
清华源拉得稍微快一点。直接拉github拉真的拉得太慢。(挺慢:torvalds/linux: Linux kernel source tree (github.com))
1 | git clone https://mirrors.tuna.tsinghua.edu.cn/git/linux.git |
这是目前最新的版本,如果想要以前的旧版本可以自行替换。
直接拉取后文件夹会被自动命名为linux。手册中使用 $VAR 符号(例如 KERNEL 等)来表示路径到目录,这些目录在执行指南时会被创建(例如解压 GCC 存档时会创建一个目录),或者在运行指南之前需要自己创建这些目录。请手动替换这些变量的值。
由于名字不一样,在之后的命令中注意文件路径,改一下名字。
耐心地等待拉取…
2.修改配置文件
拉取好之后,生成默认配置文件。
1 | cd linux |
手动编辑.config文件,或使用make menuconfig
。至少需要修改以下内容:
更详细的配置可以参考:syzkaller/docs/linux/kernel_configs.md at master · google/syzkaller (github.com)
1 | # Coverage collection. |
重新生成配置文件:
Command:
1 | make olddefconfig |
3.编译内核(有坑)
Command:
1 | make -j`nproc` |
编译失败,因为没有bc:
安装bc后再编译,这大概需要十五分钟。
4.检查是否成功
查看vmlinux
(kernel binary) 和 bzImage
(packed kernel image):
三、安装debootstrap
Command:
1 | sudo apt install debootstrap |
(这个是我之前安装过的。)
四、创建Debian Bullseye Linux image(有坑)
1.创建生成镜像的脚本(有坑)
Command:
1 | mkdir $IMAGE |
在wget这一步发现网络链接有问题:
解决办法1(无效):
参考:https://blog.csdn.net/weixin_40973138/article/details/106081946以及类似的方法:
查询raw.githubusercontent.com的ip
将ip加入/etc/hosts
好像不行。
解决办法2(无效):修改DNS,不知道为什么还是不行。
解决办法3:
浪费一个大半个上午之后决定直接去把https://raw.githubusercontent.com/google/syzkaller/master/tools/create-image.sh这个文件复制下来,在IMAGE下新建一个.sh命名为create-image.sh,把文件手动复制进去。
2.运行脚本(有坑)
运行:
1 | chmod +x create-image.sh |
运行create-image.sh时又出现了报错:
跑到这个网址上一看,404了。
(搞啥啊啊啊啊啊!!!!土拨鼠尖叫!!!)
换源,使用国内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 extra tools,根据自身需要安装吧。
五、安装QEMU
1.安装qemu-system-x86
Command:
1 | sudo apt install qemu-system-x86 |
2.验证是否成功
1.验证能否启动(有坑)
Command:
其中-kernel和file根据自己的文件路径稍作修改,
1 | qemu-system-x86_64 \ |
报错1:无法访问KVM内核模块
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博客
结果又报错啦!(我精神状态好得很呀)
原因分析:
不要同时开启hyper-V和VMware虚拟机软件,两者只能选择其一来使用,要用VMware虚拟机就必须关闭hyper-V 。
使用以下代码关闭Hyper-V,然后重启主机。
1 | bcdedit /set hypervisorlaunchtype off |
再次启动QEMU。
报错2:Failed to mount /sys/kernel/config
发现有报错,所以现在是emergency mode.
1 | systemctl status sys-kernel-config.mount |
看一下是什么情况
好像是config配置文件有什么问题?有可能是当时编辑.config的时候手滑输错了什么或者别的什么问题。左思右想之后还是决定重来一次。
然后我回到了第二步,重新编译内核,创建镜像,又折腾半个下午。第二次总算成功啦!!
2.成功启动QEMU
可以看到有登陆界面。
登陆的用户名为root,不需要密码,回车即可。
3.验证能否ssh
在另一个终端里ssh登陆:(注意密钥的路径)
1 | ssh -i linux/IMAGE/bullseye.id_rsa -p 10021 -o "StrictHostKeyChecking no" root@localhost |
这样就登陆成功啦!
六、下载syzkaller
1 | git clone https://github.com/google/syzkaller |
七、测试
1.修改syzkaller配置文件
在syzkaller文件夹下新建文件夹:workdir,
1 | cd syzkaller |
在syzkaller文件夹下新建文件:my.cfg,写入:
其中workdir,image等的路径根据自己的配置修改。
1 | { |
运行:
1 | ./bin/syz-manager -config=my.cfg |
2.进行测试
在测试的时候一直连不上,最后超时报错。
发现无法启动网络接口:
在测试QEMU时是没有发现这个问题的,因为syzkaller的qemu启动命令与测试的qemu命令不一样,下图是测试时的情景。
参考了这篇博客的解决方法:syzkaller的安装与运行 | giantbranch’s blog
使用测试qemu的命令启动,之后修改/etc/network/interfaces中的eth0改为enp0s4
最后终于成功运行了!!!
3.验证是否成功
在命令行和网页端都可以看见syzkaller在正常运行。
喜大普奔!!!!!
附:磁盘扩容:
编译内核的时候报错说没有可用空间了,然后去虚拟机设置那里分配了更多的内存,结果登陆的时候原先的用户名和密码登不进去了。更改root密码,再登陆。幸好文件和配置没有丢失。
查看一下文件系统的使用情况。
1 | df -h |
解决办法:
想使用bleachbit清理一下不需要的文件,结果发现bleachbit还没有安装,甚至没有安装空间了,只好先把拉取下来的内核源码删掉(回收站里也要删),安装上bleachbit
1 | sudo apt-get install bleachbit |
删掉内核源码之后再查看文件系统使用情况:
删掉一些缓存文件等等再查看文件系统使用情况:
如果还是不够怎么办呢?
切换到根目录下面看一下是什么占用了那么多内存。
1 | cd / |
好像没啥可删的了,还是把源码拉回来吧。
呃。。。。。。还是扩容吧。
先在主机上分配更多的硬盘空间(我把最大从20G改为35G,读者按需更改),然后在虚拟机内部增加空间。
https://zhuanlan.zhihu.com/p/574737232
原理
我们是不能直接给/dev/sda1
分区调整大小的。只能通过swap
(交换空间)进行中转。然后再调整/dev/sda1
分区的大小就行了。最后一定要记得保存!