关于Buzzer
Buzzer是一款功能强大的模糊测试工具链,该工具基于Go语言开发,可以帮助广大研究人员简单高效地开发针对eBPF的模糊测试策略。
功能介绍
下面给出的是当前版本的Buzzer整体架构:
元素解析:
1、ControlUnit:通过命令行标志--fuzzing_strategy启动指定的FuzzingStrategy;
2、eBPFGenerationLibrary:包含生成 eBPF 程序的逻辑;
3、ExecutionUnit:FFI 层与 eBPF Syscall 交互并加载/执行 eBPF 程序;
4、FuzzingStrategy:所有策略必须实现的接口;
模糊测试策略是eBPF 程序的生成方式和错误检测方式的结合。
目前,Buzzer 有三种可能的策略:
1、PointerArithmetic:生成随机 ALU 和 JMP 操作,然后尝试对映射指针进行指针算术运算,并写入它。如果写入的值在用户空间不可见,则假设我们写入了 OOB;
2、VerifierLogParser:生成随机 ALU 操作并解析 eBPF 验证程序日志的输出。在程序运行时,寄存器的值会被存储,然后与验证程序通过日志公开的假设进行比较;
3、Playground:这里没有进行真正的模糊测试,此策略只是为了帮助试验 eBPF;
Buzzer 还具有一个集成的指标服务器,能够呈现覆盖率信息,该组件的架构如下所示:
每当ExecutorUnit验证一个程序时,都会将下列信息传递给MetricsUnit:
1、程序是否通过验证;
2、kcov 收集的任何覆盖信息(如果启用);
MetricsUnit税后便会处理这些信息,然后将 kcov 地址解析为代码位置,并在 Web 界面中显示这些信息。
工具要求
Go运行时环境
bazel
clang
工具安装
由于该工具基于Go语言开发,因此我们首先需要在本地设备上安装并配置好最新版本的Go运行时环境。然后按照步骤安装好bazel和clang,并配置好正确的CC和CXX环境变量:
export CC=clang export CXX=clang++
接下来,广大研究人员可以直接使用下列命令将该项目源码克隆至本地:
git clone https://github.com/google/buzzer.git
然后切换到项目目录中,运行Buzzer:
cd buzzer bazel build :buzzer
以root权限运行Buzzer:
sudo ./bazel-bin/buzzer_/buzzer
或使用CAP_BPF运行Buzzer:
sudo setcap CAP_BPF=eip bazel-bin/buzzer_/buzzer ./bazel-bin/buzzer_/buzzer
工具使用
按照syzkaller 的说明设置运行 Debian 映像的虚拟机,请确保在编译 Linux 内核时启用 BPF。
生成bullseye镜像:
./create-image.sh -d bullseye
运行syzkaller生成的虚拟机:
qemu-system-x86_64 \ -m 20G \ -smp 2 \ -cpu host \ -kernel PATH_TO_KERNEL_REPO/arch/x86/boot/bzImage \ -append "console=ttyS0 root=/dev/sda nokaslr earlyprintk=serial net.ifnames=0" \ -drive file=PATH_TO_DEBIAN_IMAGE/bullseye.img,format=raw \ -net user,host=10.0.2.10,hostfwd=tcp:127.0.0.1:10022-:22,hostfwd=tcp:0.0.0.0:8080-:8080 \ -net nic,model=e1000 \ -enable-kvm \ -nographic \ -pidfile vm.pid \ 2>&1 | tee vm.log
将vmlinux镜像传输到VM中:
scp -i PATH_TO_DEBIAN_IMAGE/bullseye.id_rsa -P 10022 PATH_TO_KERNEL_REPO/vmlinux root@localhost:~/
传输到您想要覆盖的源文件:
mkdir /root/sourceFiles
然后将您想要 fuzzer 可视化覆盖信息的任何源文件(例如验证器源代码)传输到该目录中,在运行:
scp -i PATH_TO_DEBIAN_IMAGE/bullseye.id_rsa -P 10022 PATH_TO_KERNEL_REPO/kernel/bpf/verifier.c root@localhost:~/sourceFiles
运行Buzzer并访问指标服务器:
scp -i PATH_TO_DEBIAN_IMAGE/bullseye.id_rsa -P 10022 PATH_TO_BUZZER root@localhost:~/ ./buzzer
此时如果你在主机上访问 localhost:8080,你应该能够看到指标服务器:
许可证协议
本项目的开发与发布遵循Apache-2.0开源许可协议。
项目地址
Buzzer:【GitHub传送门】
参考资料
The Go Programming Language
https://bazel.build/
Clang C Language Family Frontend for LLVM
bpf: Fix incorrect verifier pruning due to missing register precision taints - kernel/git/torvalds/linux.git - Linux kernel source tree
Linux Kernel: Vulnerability in the eBPF verifier register limit tracking · Advisory · google/security-research · GitHub