Skip to content
 编辑

Setup: Linux host, Android device, arm32/64 kernel

设置:Linux 主机,Android 设备,arm32/64 内核

注意:对真实的 Android 设备进行内核模糊测试可能会使其被破坏。

本文详细介绍了在 Android 设备上设置 syzkaller 实例对 arm32/64 Linux 内核进行模糊测试的步骤。

一些 syzkaller 的功能可能在 arm32 上尚不能正常工作。例如,对于 arm32,Linux 内核中并不提供所有的调试和测试覆盖功能,这限制了 syzkaller 在快速发现错误方面的有效性。

这些步骤在 NXP Pico-Pi-IMX7D 上进行了测试,遵循了这里的说明.

您可以在 syzkaller 的 adb vm 实现这里找到更多详细信息。

设备设置

按照您的开发板说明安装 Android,并确保设备正常启动。

设置 adb 桥接,使 adb 和 fastboot 正常工作。

设置串行端口,按照您设备的说明操作,以便监视内核日志消息。在基于 Android 的开发板上,串行端口通常以 USB(或某些自定义)端口,或通过 GPIO 引脚的形式暴露。在手机上,您可以使用 Android 串行电缆或Suzy-Q。syzkaller 也可以在没有专用串行端口的情况下工作(通过回退到 adb shell dmesg -w),但这是不可靠的,并且会将许多崩溃转换为 “丢失与测试机器的连接” 崩溃,并且没有额外的信息。

获取适合您设备的编译器工具链。

在您的开发板上重新编译并重新安装具有调试内核选项 的 Linux 内核。你可能会从后向移植 KCOV 或 KASAN 补丁中受益。

构建 syzkaller

按照这里的说明获取 syzkaller。

然后根据您使用的设备,为 armarm64 目标架构构建 syzkaller。

make TARGETOS=linux TARGETARCH=arm
make TARGETOS=linux TARGETARCH=arm64

如果您使用的是旧版 Android /dev/ion 驱动程序(内核版本 <= 3.18),在构建 syzkaller 之前,请复制旧的 /dev/ion 描述:

cp sys/android/* sys/linux

管理器配置

创建一个管理器配置文件 android.cfg

{
	"target": "linux/arm",
	"http": "127.0.0.1:56741",
	"workdir": "$GOPATH/src/github.com/google/syzkaller/workdir",
	"kernel_obj": "$KERNEL",
	"syzkaller": "$GOPATH/src/github.com/google/syzkaller",
	"cover": true,
	"type": "adb",
	"vm": {
		"devices": [$DEVICES],
		"battery_check": true
	}
}

将变量 $GOPATH$KERNEL(内核构建目录的路径)和 $DEVICES (由 adb devices 报告的您的开发板设备 ID,例如 ABCD000010)替换为实际值。

对于 arm64,使用 "target": "linux/arm64"

如果您的内核不支持覆盖率收集(例如,没有 KCOV 补丁的 arm32),请设置 "cover": false

如果您的设备没有电池服务,请关闭 battery_check,详情请参见[此处]((https://github.com/google/syzkaller/blob/master/vm/adb/adb.go)的注释。

运行 syzkaller

运行 syzkaller 管理器:

./bin/syz-manager -config=android.cfg

现在 syzkaller 应该正在运行,您可以在 web 浏览器中输入 127.0.0.1:56741 检查管理器状态。

如果在 syz-manager 启动后遇到问题,请考虑使用 -debug 标志运行。

此外,查看此页面获取故障排除提示,并查看使用 KASAN+KCOV 构建 Pixel 内核使用 KASAN+KCOV 构建 PH-1 内核以获取内核构建/启动说明。