Healer的安装和初步使用
Healer的安装和初步使用
简介
Healer 是受 Syzkaller 启发的内核模糊测试器。
与 Syzkaller 类似,Healer 使用 Syzlang 描述提供的 syscall 信息生成确认参数结构约束和部分语义约束的系统调用序列,并通过不断执行生成的调用序列导致内核崩溃,从而发现内核错误。
与 Syzkaller 不同,Healer 不使用经验选择表,而是通过动态移除最小化调用序列中的调用并观察覆盖变化,来检测系统调用之间的影响关系,并利用影响关系来指导调用序列的生成和变异。 此外,Healer 还使用了与 Syzkaller 不同的架构设计。
构建Healer
-
除了一些修补代码之外,Healer 是用纯rust编写的。 因此,首先应安装 rust 工具链。
1
2curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustc --version # check install检查安装结果:
-
为了使用 Syzlang 描述,Healer 的构建脚本会自动下载 Syzkaller 并在源代码中添加补丁并构建 Syzkaller,这可能会增加构建时间。 因此,需要安装Syzkaller 所需的构建工具,例如:GO111MODULE开启的golang 编译器,GCC 6.1.0 或更高版本。
-
GO111MODULE的开启命令:
1
2go env -w GO111MODULE="on"
go env #check
-
-
一旦安装了所有必需的工具,就可以使用以下命令轻松构建 Healer:
1
cargo build --release
-
最后,可以在
target/release
目录中找到 Healer 本身和打补丁的 Syzkaller 二进制文件 (syz-bin
)。
使用 Healer 对 Linux 内核进行模糊测试
总的来说,使用 Healer 对 Linux 内核进行模糊测试需要三个步骤:(1) 准备磁盘映像,(2) 编译内核, (3) 启动 Healer。
Healer 使用 qumu 来引导内核,所以需要准备磁盘镜像和内核镜像。启动后的 qemu 需要能够通过 ssh 密钥登录,内核至少需要具备 kcov 功能。(可以参照Syzkaller文档的详细介绍)
先决条件
1 |
|
准备磁盘映像
安装 debootstrap
1 |
|
创建 Debian Stretch Linux 映像
1 |
|
- 注意将
$IMAGE
替换为自己的路径。
附加工具
1 |
|
编译内核
获取内核源码
1 |
|
- 建议从最新的稳定版本开始。V5.14是一个示例。
- 在虚拟机中
git clone
运行时间较长。在较好的网络环境下,可以选择在物理机中前往https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/
下载内核源码的压缩包,然后拖入虚拟机解压
生成默认配置
1 |
|
- 同样注意将
$IMAGE
替换为自己的路径。
启用所需的配置选项
- 手动编辑
.config
文件来启用它们:
1 |
|
-
重新生成配置:
1
make olddefconfig
编译内核命令
1 |
|
编译内核时make -j
nproc
的含义是使用多线程编译,加快编译速度。其中,-j选项指定了同时运行的任务数,而nproc
是一个命令,用于返回当前系统的处理器数1。
-
检查:
1
2
3
4ls $KERNEL/vmlinux
# sample output - $KERNEL/vmlinux
ls $KERNEL/arch/x86/boot/bzImage
# sample output - $KERNEL/arch/x86/boot/bzImage
安装QEMU
命令
1 |
|
核查
-
先确定虚拟机的处理器开启
虚拟化引擎
-虚拟化Intel VT-x/EPT或AMD-V/RVI
(我使用的是VMware Workstation) -
确认
sshd
开启1
ps -e |grep ssh
-
如果没有出现
sshd
,则输入命令:1
/etc/init.d/ssh start
-
-
正式启动QEMU:
1
2
3
4
5
6
7
8
9
10
11
12qemu-system-x86_64 \
-m 2G \
-smp 2 \
-kernel linux/arch/x86/boot/bzImage \
-append "console=ttyS0 root=/dev/sda earlyprintk=serial net.ifnames=0" \
-drive file=./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 |- 同样注意路径替换
- 输入root即可登录
-
此后,可以在另一终端中测试ssh能否工作
1
ssh -i $IMAGE/stretch.id_rsa -p 10021 -o "StrictHostKeyChecking no" root@localhost
运行Healer
-
一旦
stretch.img
($IMAGE/stretch.img
)、ssh-stretch.id_rsa
($IMAGE/ssh-stretch.id_rsa
)、bzImage
($KERNEL/linux-5.14/arch/x86/boot/bzImage
准备就绪,建议是创建一个工作目录workdir
。 然后,在workdir
中创建一个bin
目录,并将修补后的Syzkaller
二进制文件和Healer二进制文件复制到该目录中(healer/target/release/syz-bin
),注意不要更改syz-bin
目录结构。 最终的工作目录需要有以下文件。1
2
3
4cd path/to/workdir && ls
bin bzImage stretch.id_rsa stretch.img
ls ./bin
healer linux_amd64 syz-repro syz-symbolize syz-sysgen -
最后,在
workdir
执行以下命令开始模糊测试,其中 -d 指定磁盘映像的路径,-k 指定内核映像的路径,–ssh-key 指定 ssh 密钥的路径。1
sudo ./bin/healer -d stretch.img -s stretch.id_rsa -k bzImage
-
若正常运行,界面如下:
遇到的错误
1
1 |
|
解决方案
找到healer-main/healer_utils/healer_vm/src/qemu.rs
,这是healer中关于qemu的配置文件。将“linux/amd64”
的对应参数args
改为:"-enable-kvm"
(下图中的第487行)。
参考链接
1 |
|
ssh -F /dev/null -o BatchMode=yes -o IdentitiesOnly=yes -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectTimeout=3s -i /home/yuhan/Desktop/FuzzerWork/stretch.id_rsa -p 14605 root@127.0.0.1 pkill syz-executor
本博客所有文章除特别声明外,均为博客作者本人编写整理,转载请联系作者!