syzkaller是一种无监督的覆盖引导内核模糊器。
支持的操作系统:Akaros, FreeBSD, Fuchsia, gVisor, Linux, NetBSD, OpenBSD, Windows.
对linux的支持最全面
总览
syz-manager
1、启动、监控多个vm实例
2、复制syz-fuzzer到vm里面,并启动它
3、存储corpus和crashes
syz-fuzzer
1、fuzzing(输入生成、变异、最小化等)
2、通过RPC发送触发新路径的input给到syz-manager
3、启动syz-executor
syz-executor
执行每个input(就是系统调用的序列)
用C++编写,静态二进制,使用共享内存进行通信
安装
依赖安装
1 | apt install build-essential flex bison libssl-dev libelf-dev bc |
下载源码编译
1 | git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git kernel |
在.config文件中加入以下配置
vim .config
1 | # Coverage collection. |
1 | # 由于启用这些选项会导致更多子选项可用,我们需要重新生成配置 |
创建镜像
1 | apt-get install debootstrap |
安装qemu
1 | apt-get install qemu-system-x86 |
测试
1 | qemu-system-x86_64 \ |
试一下ssh是否能够连接
1 | ssh -i image/stretch.id_rsa -p 10021 -o "StrictHostKeyChecking no" root@localhost -v |
Go and syzkaller
下载配置go
1 | wget https://golang.org/dl/go1.16.5.linux-amd64.tar.gz |
下载syzkaller源码并编译,先配置代理
1 | export https_proxy=http://XXX.XXX.XXX.XXX:1080 |
编辑配置文件,路径注意修改
1 | vim syz.cfg |
启动syzkaller
1 | $ ./bin/syz-manager -config=/root/syz.cfg |
假如起不来,就加-debug输出调试信息,看看哪里报错了
1 | ./bin/syz-manager -config=/root/syz.cfg -debug |
问题与解决
1、go没有下载到syzkaller源码问题
需要设置代理,注意不要设置GO111MODULE环境变量,建议使用export https_proxy=http://ip:port
方式进行代理
2、 qemu的ssh服务没起来
这个可能是kernel编译的问题,可以尝试重新编译kernel
make mrproper 之后按步骤再编译一次内核
3、网卡没起来
后来发现syzkaller的qemu启动命令与测试的qemu命令不一样
将syzkaller的命令复制出来,并启动qemu
通过systemctl status networking.service
查看网络服务状态
再查看网络接口,然而并没有eth0
最后使用测试qemu的命令启动,之后修改/etc/network/interfaces中的eth0改为enp0s4即可