-
-
[原创]syzkaller内核黑盒测试环境搭建中,内存不足的解决办法
-
发表于: 2023-2-12 21:29 9915
-
平台
虚拟机安装Ubuntu18.04.6 LTS adm64,注意:内存配置为最大
创建工作目录
1 2 3 4 5 6 | cd ~ mkdir workspace cd workspace mkdir source bin fuzz cd source mkdir image kernel |
安装依赖包
1 2 | sudo apt update sudo apt install make gcc flex bison libncurses - dev libelf - dev libssl - dev debootstrap |
安装QEMU
1 | sudo apt - get install qemu - system - x86 |
查看是否支持虚拟化
1 | egrep - c '(vmx|svm)' / proc / cpuinfo |
如果值大于0则支持虚拟化
如并不大于0,则需要开启虚拟化
注意:需要开启虚拟机虚拟化支持
安装配置 go环境 go1.17
1 2 | wget https: / / go.dev / dl / go1. 17.9 .linux - amd64.tar.gz tar - C / usr / local - xzf go1. 17.9 .linux - amd64.tar.gz |
注意:syzkaller对go版本有要求,我测试时低于14是不行的,据有朋友分享说版本太高也会有问题,所以选了17
配置环境变量:
1 | sudo vi etc / bash.bashrc |
在末尾添加如下,否则go编译器会提示找不到
1 | export PATH = $PATH: / usr / local / go / bin |
下载Syzkaller
1 2 | cd ~ / workspace / fuzz git clone https: / / github.com / google / syzkaller |
注意:git速度可能有点慢,多试几次,或者手动下载也可以
编译Syzkaller
编译环节是踩坑最多的地方:
编译提示“signal kill”,用如下命令
1 | dmesg | egrep - i - B100 'killed process' |
看看是否有红色提示“out of memory: killed process”,遇到这个问题是最多的,有朋友通过扩展内存通过了这步
### 扩展内存方法:
1 2 3 | dd if = / dev / zero of = / root / swapfile bs = 1M count = 1024 mkswap / root / swapfile #建立swap的文件系统 swapon / root / swapfile #激活swap文件 |
使系统开机时自启用,在文件/etc/fstab中添加一行:
1 | / root / swapfile swap swap defaults 0 0 |
但是,在我测试后扩展内存后,编译依然提示killed process,如果出现这个问题,说明syzkaller编译过程中用到了某些风险内存,触发了Linux的OOM机制,关掉OOM就可以了:
1 | sysctl - w vm.panic_on_oom = 1 |
1 | sysctl - p |
然后再重新make就可以了,如果编译过程中会出现卡住,那就重启多试几次。
编译要测试的内核
此时,QemU和Syzkaller均已安装成功,接下来需要编译你要测试的内核,我这里选用的是Linux5.4.1,直接从镜像网站下载速度快些:
1 | 非官方的链接 http: / / ftp.sjtu.edu.cn / sites / ftp.kernel.org / pub / linux / kernel / |
下载完后,复制到你的工作目录,然后解压:
1 2 3 | cp - r ~ / Download / linux - 5.4 . 1.tar .gz ~ / workspace / source / kernel cd ~ / workspace / source / kernel tar - zxvf linux - 5.4 . 1.tar .gz |
下一步是要编译Linux内核,这一步其实很关键,配置不好,syzkaller是无法启动的,先看下linux源码下的.config文件:
1 | ls - a |
参考了其他朋友,使用pluma(没有就install一个)编辑.config,vim也可以的,使用pluma主要是可以搜索,比较方便然后修改或者添加以下配置:
1 2 3 4 5 6 7 8 9 10 | # 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 | make defconfig make kvm_guest.config |
编译内核:
1 | make - j 20 |
这里需要等待些许时间,编译完成后会在同目录下生成vmlinux
同时在arch目录下的相应cpu架构文件目录下生成bzImage内核文件,这里默认的x86,所以在/arch/x86/boot/bzImage;
因为这里只是测试内核,所以没有添加文件系统,在商业化测试中,需要根据需要移植相应的系统,例如驱动漏洞挖掘等。
制作内核镜像
完成Linux内核编译后,接下制作内核镜像,一般使用debootstrap,我这里直接使用的syzkaller携带的镜像脚本生成的,因为里边添加了ssh配置,把syzkaller/tools文件下的creat-image.sh复制到image目录下
1 2 | sudo chmod 777 creat - image.sh sudo. / creat - image.sh |
运行完以上命令后,会生成如下ssh密钥文件和镜像文件stretch.img,
配置syzkaller
接下来配置syzkaller,在编译完成后,touch一个my.cfg,从中添加如下:
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" : "/home/h/workspace/fuzz/syzkaller/workdir" , "kernel_obj" : "/home/h/workspace/source/kernel/linux" , "image" : "/home/h/workspace/source/image/stretch.img" , "sshkey" : "/home/h/workspace/source/image/stretch.id_rsa" , "syzkaller" : "/home/h/workspace/fuzz/syzkaller" , "procs" : 8 , "type" : "qemu" , "vm" : { "count" : 4 , "kernel" : "/home/h/workspace/source/kernel/linux/arch/x86/boot/bzImage" , "cpu" : 2 , "mem" : 2048 } } |
不要忘记,在同级目录中,mkdir workdir,这个文件是接收fuzz crash日志的。
启动测试
然后,就可以启动syzkaller进行测试了:
1 | sudo . / bin / syz - manager - config = my.cfg |
此时,会停留在这一步,没关系,多等待一会
正常启动后,会在终端显示如下测试日志的输出:
使用浏览器登陆
1 | http: / / 127.0 . 0.1 : 56741 / |
会显示syzkaller的界面,现在就可以正常测试了。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
- 怎么提取微软补丁? 5865
- [求助]来啊,一起看看这是不是个洞? 10858
- [讨论]xor r9d r9d ;这条指令执行完后,r9的值是多少? 11302
- 010editor版本V13.0.1暴力破解过程 8257
- [原创]syzkaller内核黑盒测试环境搭建中,内存不足的解决办法 9916