syzkaller的安装与运行

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" root@localhost -v

Go and syzkaller

下载配置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即可

打赏专区