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 2 3 4 5 6 7
| git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git kernel
cd kernel # 生成默认配置
make defconfig make kvm_guest.config
|
在.config文件中加入以下配置
vim .config
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=y
# Memory bug detector CONFIG_KASAN=y CONFIG_KASAN_INLINE=y
# Required for Debian Stretch CONFIG_CONFIGFS_FS=y CONFIG_SECURITYFS=y
|
1 2 3 4
| # 由于启用这些选项会导致更多子选项可用,我们需要重新生成配置 make olddefconfig
make -j 16
|
创建镜像
1 2 3 4 5 6
| apt-get install debootstrap
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
|
安装qemu
1
| apt-get 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 ./kernel/arch/x86/boot/bzImage \ -append "console=ttyS0 root=/dev/sda earlyprintk=serial net.ifnames=0" \ -drive file=./image/stretch.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
|
试一下ssh是否能够连接
1
| ssh -i image/stretch.id_rsa -p 10021 -o "StrictHostKeyChecking no" [email protected] -v
|
下载配置go
1 2 3 4 5 6 7 8 9 10 11
| wget https://golang.org/dl/go1.16.5.linux-amd64.tar.gz
tar -xvf go1.16.5.linux-amd64.tar.gz
mv go goroot mkdir gopath
export GOPATH=`pwd`/gopath export GOROOT=`pwd`/goroot export PATH=$GOPATH/bin:$PATH export PATH=$GOROOT/bin:$PATH
|
下载syzkaller源码并编译,先配置代理
1 2 3 4 5 6
| export https_proxy=http://XXX.XXX.XXX.XXX:1080
go get -u -d github.com/google/syzkaller/prog
cd gopath/src/github.com/google/syzkaller make
|
编辑配置文件,路径注意修改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| vim syz.cfg
{ "target": "linux/amd64", "http": "127.0.0.1:56741", "workdir": "/root/gopath/src/github.com/google/syzkaller/workdir", "kernel_obj": "/root/kernel", "image": "/root/image/stretch.img", "sshkey": "/root/image/stretch.id_rsa", "syzkaller": "/root/gopath/src/github.com/google/syzkaller", "procs": 8, "type": "qemu", "vm": { "count": 4, "kernel": "/root/kernel/arch/x86/boot/bzImage", "cpu": 2, "mem": 2048 } }
|
启动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即可
假如你看不到评论,可能是你访问Disqus被墙了,请使用代理访问
文章来源: https://www.giantbranch.cn/2021/06/25/syzkaller%E7%9A%84%E5%AE%89%E8%A3%85%E4%B8%8E%E8%BF%90%E8%A1%8C/
如有侵权请联系:admin#unsafe.sh