syzkaller 对 Android Trusty TEE 的模糊测试支持:内核、Trusty 与 arm64 镜像的完整构建与运行指南 测试操作系统网络安全【免费下载链接】syzkallersyzkaller is an unsupervised coverage-guided kernel fuzzer项目地址https://gitcode.com/gh_mirrors/syz/syzkaller点击查看免费下载导读本文档基于 docs/trusty/README.md 展开完整介绍 syzkaller 如何在 QEMU 虚拟机中模糊测试 Android Trusty Trusted Execution EnvironmentTEE的 IPC 应用端口从编译带 Trusty IPC 支持的内核、构建 Trusty 与 arm64 rootfs到编写 trusty.cfg 并启动 syz-manager 的全流程。读完本文你将掌握一套可在本地复现的 Trusty 模糊测试环境搭建方案并理解 syzkaller 描述文件sys/trusty/sys.txt、sys/linux/dev_trusty.txt与 QEMU VM 配置的底层配合关系。Trusty 支持概览与当前状态Trusty 是 Android 上支撑 TEE可信执行环境的一组软件组件。syzkaller 对 Trusty 的支持目前仍处于**工作在进行中work-in-progress**的状态对应上游 issue #933当前只支持通过真实应用端口actual application ports对 Trusty 进行测试即不直接模糊 Trusty 自身的系统调用接口而是通过 Linux 内核的 Trusty IPC 设备与运行在 TEE 中的各 Trusty 应用如 gatekeeper、keymaster、avb、storage 等通信来触发深层代码路径。从代码结构看Trusty 在 syzkaller 中已作为独立 OS 目标存在sys/targets/targets.go 中定义了Trusty trusty目标标识sys/sys.go 通过 blank import 引入了sys/trusty/gen生成的代码sys/trusty/init.go 的InitTarget将target.MakeDataMmap绑定到targets.MakeSyzMmap用于在生成程序时构造 mmap 相关的内存映射sys.txt 中注释提到需要MakeSyzMmap来支持syz_mmap。下文的环境搭建与官方 README 保持完全一致内核使用 AOSP 的android-trusty-4.9分支Trusty 使用 AOSP 官方 manifestrootfs 使用 Buildroot 构建最终全部在 QEMUarm64、secure 模式中运行。构建带 Trusty IPC 支持的内核Trusty IPC 依赖内核侧的设备驱动与若干调试/插桩选项官方步骤以 AOSP 的 kernel/common 仓库android-trusty-4.9分支为基础git remote add android https://android.googlesource.com/kernel/common git fetch android git checkout android/android-trusty-4.9 make distclean # TODO: consider using trusty_qemu_defconfig instead. make ARCHarm64 ranchu64_defconfig # Required to enable qemu networking: make ARCHarm64 defconfig make ARCHarm64 kvmconfig # Some custom configs: ARCHarm64 ./scripts/kconfig/merge_config.sh .config trusty.config # We dont install modules: sed -i s#^\(.*\)m$#\# \1 is not set#g .config make ARCHarm64 olddefconfig make ARCHarm64 CROSS_COMPILEaarch64-linux-gnu- -j64要点说明ranchu64_defconfig是 Android 模拟器ranchu的 arm64 基础配置随后再叠加defconfig与kvmconfig以开启 QEMU 所需的网络支持通过merge_config.sh合并自定义的trusty.config其内容如下# trusty.config CONFIG_TRUSTYy CONFIG_DEBUG_FSy CONFIG_DEBUG_INFOy CONFIG_KCOVy CONFIG_KASANy CONFIG_KASAN_INLINEy CONFIG_PROVE_LOCKINGy CONFIG_DEBUG_ATOMIC_SLEEPy CONFIG_DEBUG_VMy CONFIG_LOCKUP_DETECTORy CONFIG_BOOTPARAM_HARDLOCKUP_PANICy CONFIG_BOOTPARAM_SOFTLOCKUP_PANICy CONFIG_DETECT_HUNG_TASKy CONFIG_DEFAULT_HUNG_TASK_TIMEOUT140 CONFIG_BOOTPARAM_HUNG_TASK_PANICy CONFIG_WQ_WATCHDOGyCONFIG_TRUSTYy开启 Trusty IPC 核心驱动是测试的前提CONFIG_KCOVy提供内核代码覆盖率采集syzkaller 依赖它指导模糊测试方向CONFIG_KASANyCONFIG_KASAN_INLINEy开启内联 KASAN用于捕获越界/释放后使用等内存错误CONFIG_DEBUG_FSy用于挂载 debugfsKCOV 节点所在CONFIG_PROVE_LOCKING、CONFIG_DEBUG_VM、CONFIG_LOCKUP_DETECTOR、CONFIG_DETECT_HUNG_TASK、CONFIG_WQ_WATCHDOG等调试选项用于暴露死锁、软/硬锁死与挂起任务等问题sed -i s#^\(.*\)m$#\# \1 is not set#g将所有m的内核模块改写为不编译因为本方案不安装模块避免启动时模块缺失交叉编译使用CROSS_COMPILEaarch64-linux-gnu-产物为arch/arm64/boot/Image供后续 QEMU-kernel使用。构建 TrustyTrusty 本身通过 Android 的repo工具拉取官方 manifest 并构建mkdir trusty; cd trusty repo init -u trusty-manifest-url -b master repo sync -j32 source trusty/vendor/google/aosp/scripts/envsetup.sh make -j32 generic-arm64 # Build Trusty and qemu images: trusty/vendor/google/aosp/scripts/build.py qemu-generic-arm64-test-debug # Create qemu-comb.dtb: KERNEL_DIR$KERNEL build-root/build-qemu-generic-arm64-test-debug/run-qemu其中generic-arm64目标编译 Trusty 用户态与固件组件build.py qemu-generic-arm64-test-debug生成 QEMU 测试/调试版镜像最后通过执行run-qemu脚本生成qemu-comb.dtbcombined device tree它会被后面的 QEMU 命令行以-dtb传入用于描述包含 Trusty 安全侧的设备树。构建产物路径约定如下后续配置会反复引用$TRUSTY/build-root/build-qemu-generic-arm64-test-debug/atf/qemu/debug/bl1.binATFARM Trusted FirmwareBL1 固件$TRUSTY/build-root/build-qemu-generic-arm64-test-debug/atf/qemu/debug/qemu-comb.dtb组合设备树$TRUSTY/build-root/build-qemu-generic-arm64-test-debug/qemu-build/aarch64-softmmu/qemu-system-aarch64官方脚本构建的 QEMU 二进制。构建 arm64 用户态镜像通过 Buildroot 制作可 SSH 登录的 arm64 rootfsgit clone buildroot-repo-url cd buildroot make qemu_aarch64_virt_defconfig support/kconfig/merge_config.sh .config syzkaller.config make -j64syzkaller.config内容如下# syzkaller.config BR2_cortex_a57y BR2_TOOLCHAIN_EXTERNALy BR2_TOOLCHAIN_EXTERNAL_ARM_AARCH64y BR2_TARGET_GENERIC_HOSTNAMEsyzkaller BR2_TARGET_GENERIC_ISSUEsyzkaller BR2_PACKAGE_DHCPCDy BR2_PACKAGE_OPENSSHy BR2_TARGET_ROOTFS_EXT2_SIZE1G BR2_ROOTFS_POST_FAKEROOT_SCRIPT./syzkaller.sh # BR2_LINUX_KERNEL is not setBR2_cortex_a57y指定 CPU 为 Cortex-A57与 QEMU-cpu cortex-a57一致BR2_PACKAGE_DHCPCD提供 DHCP 客户端BR2_PACKAGE_OPENSSH提供 SSH 服务端二者保证 syzkaller 能通过网络登录 VMBR2_TARGET_ROOTFS_EXT2_SIZE1G将 ext2 根文件系统扩展到 1G# BR2_LINUX_KERNEL is not set不在 Buildroot 内编译内核内核由上面单独构建BR2_ROOTFS_POST_FAKEROOT_SCRIPT./syzkaller.sh指定 rootfs 制作完成后的后处理脚本# syzkaller.sh set -eux # Mount debugfs for KCOV. echo debugfs /sys/kernel/debug debugfs defaults 0 0 $1/etc/fstab # Generate and install ssh key. rm -f key key.pub ssh-keygen -f key -t rsa -N mkdir -p $1/root/.ssh cp key.pub $1/root/.ssh/authorized_keys该脚本做两件关键的事在/etc/fstab中追加debugfs挂载KCOV 的/sys/kernel/debug/kcov依赖 debugfs并生成一套 RSA SSH 密钥对把公钥写入 root 的authorized_keys供 syz-manager 免密登录。key/key.pub生成在 Buildroot 源码目录后续配置中的sshkey指向$BUILDROOT/key。QEMU 启动与 SSH 验证官方 README 中启动 QEMU 的命令为$TRUSTY与$BUILDROOT需替换为实际路径cd $TRUSTY/build-root/build-qemu-generic-arm64-test-debug/atf/qemu/debug $TRUSTY/build-root/build-qemu-generic-arm64-test-debug/qemu-build/aarch64-softmmu/qemu-system-aarch64 -m 1024 -smp 1 -net nic -net user,host10.0.2.10,hostfwdtcp::10022-:22 -display none -serial stdio -no-reboot -machine virt,secureon,virtualizationon -cpu cortex-a57 -bios $TRUSTY/build-root/build-qemu-generic-arm64-test-debug/atf/qemu/debug/bl1.bin -d unimp -semihosting-config enable,targetnative -no-acpi -dtb $TRUSTY/build-root/build-qemu-generic-arm64-test-debug/atf/qemu/debug/qemu-comb.dtb -hda $BUILDROOT/output/images/rootfs.ext4 -snapshot -kernel $KERNEL/arch/arm64/boot/Image -append androidboot.hardwareqemu_trusty earlyprintkserial consolettyAMA0,38400 root/dev/vda参数拆解-machine virt,secureon,virtualizationon启用 QEMU virt 平台的 secureEL3与 virtualizationEL2扩展这是 Trusty 运行的前提-bios bl1.bin加载 ATF BL1 固件进入 EL3 启动流程-dtb qemu-comb.dtb传入包含 Trusty 安全组件的设备树-semihosting-config enable,targetnative启用半主机semihosting支持Trusty 早期启动依赖它-hda rootfs.ext4 -snapshot以快照方式使用 rootfs保证每次启动状态干净-append androidboot.hardwareqemu_trusty ...告诉内核本次引导的是qemu_trusty硬件平台内核据此注册 Trusty IPC 设备/dev/trusty-ipc-dev0。登录验证ssh -i $BUILDROOT/key -p 10022 -o IdentitiesOnlyyes rootlocalhost若登录成功说明内核、Trusty 固件与 rootfs 三者已正确协同。运行 syzkaller 进行模糊测试编译并启动cd $SYZKALLER make TARGETARCHarm64 cd $TRUSTY/build-root/build-qemu-generic-arm64-test-debug/atf/qemu/debug $SYZKALLER/bin/syz-manager -config trusty.cfg其中make TARGETARCHarm64交叉编译出 arm64 版本的 executor 与 fuzzer 二进制syz-manager读取trusty.cfg并创建 VM 池开始模糊测试。trusty.cfg 配置详解官方给出的配置模板如下$KERNEL、$SYZKALLER、$BUILDROOT、$TRUSTY需替换为实际值{ name: trusty, target: linux/arm64, http: :10000, workdir: /workdir, kernel_obj: $KERNEL, syzkaller: $SYZKALLER, image: $BUILDROOT/output/images/rootfs.ext4, sshkey: $BUILDROOT/key, cover: false, procs: 4, type: qemu, vm: { count: 4, cpu: 1, mem: 1024, qemu: $TRUSTY/build-root/build-qemu-generic-arm64-test-debug/qemu-build/aarch64-softmmu/qemu-system-aarch64, qemu_args: -machine virt,secureon,virtualizationon -cpu cortex-a57 -bios $TRUSTY/build-root/build-qemu-generic-arm64-test-debug/atf/qemu/debug/bl1.bin -d unimp -semihosting-config enable,targetnative -no-acpi -dtb $TRUSTY/build-root/build-qemu-generic-arm64-test-debug/atf/qemu/debug/qemu-comb.dtb, cmdline: androidboot.hardwareqemu_trusty consolettyAMA0,38400 root/dev/vda, kernel: $KERNEL/arch/arm64/boot/Image }, enable_syscalls: [ openat$trusty*, write$trusty*, read, ioctl$TIPC_IOC_CONNECT*, ppoll, dup3, tkill, gettid, close ] }对照 pkg/mgrconfig/config.go 中各字段的语义name实例名称targetlinux/arm64指 arm64 架构的 Linux 内核目标httpsyz-manager 的 Web 界面监听地址如:10000workdir工作目录crash 输出位于workdir/crashes/、语料库位于workdir/corpus.dbkernel_obj内核对象目录用于 crash 报告符号化与覆盖率报告syzkallersyzkaller 源码/安装目录image启动镜像sshkeySSH 私钥cover: false明确关闭覆盖率采集。README 如此设置原因可从配置中推断Trusty IPC 驱动与 TEE 内部代码的覆盖率采集链路并不完整关闭后可避免覆盖率数据失真仅依赖 KCOV 驱动与崩溃报告进行测试procs: 4每台 VM 内并行测试进程数type: qemu选择 QEMU VM 后端。vm子对象对应 vm/qemu/qemu.go 中的Configcount为并行 VM 数、cpu为每台 VM 的 CPU 数、mem为内存MiB、qemu指定 QEMU 二进制路径、qemu_args为透传给 QEMU 的额外参数、cmdline为注入内核的启动命令行、kernel为-kernel传入的内核镜像。qemu_args与手动启动命令高度一致其中-bios、-dtb分别指向 Trusty 构建产物bl1.bin与qemu-comb.dtb这是 Trusty 环境能否启动的关键。enable_syscalls只测 Trusty 相关系统调用配置中通过enable_syscalls精确圈定测试范围这符合 docs/syscall_descriptions.md 中对enable_syscalls的说明列表中的系统调用只要依赖满足即被启用且支持通配符。列表含义openat$trusty*打开 Trusty IPC 设备/dev/trusty-ipc-dev0write$trusty*向已连接的 Trusty 端口写入 IPC 消息read读取设备/管道数据ioctl$TIPC_IOC_CONNECT*通过TIPC_IOC_CONNECTioctl 建立到指定 Trusty 端口的连接ppoll、dup3、tkill、gettid、close支撑性系统调用多路复用、复制 fd、线程控制、关闭句柄等保证上述 Trusty 调用能稳定编排。描述文件的底层支撑上述系统调用并非虚构syzkaller 仓库中有完整的描述sys/linux/dev_trusty.txt 描述 Linux 侧 Trusty IPC 设备接口resource fd_trusty[fd]声明 fd 资源openat$trusty打开设备ioctl$TIPC_IOC_CONNECT以端口字符串如com.android.trusty.gatekeeper、com.android.trusty.keymaster、com.android.trusty.avb、com.android.trusty.hwkey、com.android.trusty.hwrng等建立连接并完整定义了 gatekeeperenroll/verify、keymasterGENERATE_KEY、BEGIN_OPERATION 等、avbrollback index、lock state 等、storageopen/read/write/list/rpmb 等、hwkey、hwrng 各端口的消息结构体与命令常量sys/trusty/sys.txt 描述 Trusty 自身的系统调用write、read、ioctl、port_create、connect、accept、send_msg、read_msg、wait、mmap/munmap等其编号由 sys/trusty/sys_arm.const 提供如__NR_connect 17、__NR_send_msg 35常量提取由 sys/syz-extract/trusty.go 实现它使用 gcc 预处理并额外加入 Trusty 源码中的external/lk/include/shared与trusty/user/base/include头文件目录来解析类型与宏。由此可见当前 Trusty 模糊测试的路径是Linux 侧通过openat$trusty*→ioctl$TIPC_IOC_CONNECT*→write$trusty*依次作用于真实 Trusty 应用端口与 README 中「只通过实际应用端口测试 Trusty」的现状描述完全一致。现状与局限该支持仍处于 WIPissue #933不保证后续接口稳定当前仅覆盖 arm64 QEMU virtsecure/virtualization方案依赖 AOSPandroid-trusty-4.9内核分支与官方 Trusty manifest 的特定构建产物bl1.bin、qemu-comb.dtb配置中cover: false表明 Trusty 场景的覆盖率链路尚不完善模糊测试主要依赖 KCOV 覆盖率之外的崩溃反馈sys/linux/dev_trusty.txt中仍留有若干 TODO 注释如「describe interface for the rest of ports」「is DESTROY_ATTESTATION_IDS a thing?」说明各端口的协议描述仍在持续完善中。搭建该环境需要同步维护内核、Trusty、Buildroot、syzkaller 四个组件及其构建产物路径建议将所有路径统一写入环境变量$KERNEL、$TRUSTY、$BUILDROOT、$SYZKALLER并将trusty.config、syzkaller.config、syzkaller.sh、trusty.cfg一并纳入版本管理以便复现与排错。赞分享测试操作系统网络安全【免费下载链接】syzkallersyzkaller is an unsupervised coverage-guided kernel fuzzer项目地址https://gitcode.com/gh_mirrors/syz/syzkaller点击查看免费下载相关推荐syzkaller 对 Trusty TEE 的模糊测试支持内核、Trusty、镜像构建与 QEMU 实测全指南syzkaller 对 Trusty TEE 的模糊测试支持内核、Trusty、镜像构建与 QEMU 实测全指南 Trusty 是 Android 平台上支撑网络安全开发工具质量保障syzkaller 对 starnix 的模糊测试支持环境搭建、配置与运行全指南syzkaller 对 starnix 的模糊测试支持环境搭建、配置与运行全指南 本指南以 syzkaller 仓库中的 docs/starnix/READM网络安全开发工具质量保障使用 Syzkaller 对 macOSDarwin/XNU进行内核模糊测试从系统镜像构建、KASAN 内核编译到 Qemu 启动的完整实战指南使用 Syzkaller 对 macOSDarwin/XNU进行内核模糊测试从系统镜像构建、KASAN 内核编译到 Qemu 启动的完整实战指南 导读 本网络安全开发工具质量保障上一篇3秒精准找到商品用Haystack构建电商智能搜索与推荐系统下一篇告别回调地狱vue-pure-admin前端消息队列优雅实现方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考