SockFuzzer:XNU 内核模糊测试框架
项目状态
SockFuzzer 最初是面向 XNU 内核(用于 macOS 和 iOS)的网络模糊测试工具,现已发展成为一个全面的内核模糊测试框架。虽然保留了原名以纪念其起源,SockFuzzer 现在覆盖了广泛的内核子系统,包括 BSD、Mach、虚拟内存等。该项目实现了一种独特的方法,将 XNU 内核转换为可在用户空间中“启动”并进行模糊测试的库,从而能够在多个子系统中高效地发现和重现漏洞。
项目目标
- 在受控环境中全面测试 XNU 内核
- 发现并重现各种 XNU 子系统中的漏洞
- 为 XNU 安全的持续模糊测试和改进提供框架
- 展示在内核研究中实现先进模糊测试技术的价值
- 实现对复杂内核交互和子系统的高效测试
架构概述
SockFuzzer 采用宿主机/“XNU 客户机”设计,将 XNU 内核编译为库并在自定义用户空间环境中运行。该架构由以下几个关键组件组成:
- 宿主机环境
- XNU 客户机库
- 自定义调度器(基于 Concurrence)
- 模糊测试引擎(来自 Google fuzztest 项目的 Centipede)
- 测试运行器与测试框架
宿主机环境
宿主机环境为运行 XNU 客户机库和管理模糊测试过程提供了基础。它包括:
- 核心内核服务的自定义实现
- 用于宿主机与 XNU 客户机之间通信的超级调用接口
- 用于执行模糊测试的测试运行器与测试框架
XNU 客户机库
XNU 内核被编译为库(libxnu),只需极少的修改即可在用户空间中运行。关键方面包括:
- 符号前缀和管理,以避免与宿主机符号冲突
- 通过版本脚本选择性地暴露 XNU 内部函数
- 支持多个子系统:BSD、Mach、虚拟内存、线程、进程等
- 用于虚拟内存支持的 null pmap 层(计划在未来支持 ARM pmap)
自定义调度器
基于改进的 Concurrence 项目,自定义调度器现在支持完整的线程功能:
- Executor:提供线程创建、删除和上下文切换
- FuzzedScheduler:管理线程状态和调度决策
- 与 XNU 客户机库集成,以提供正确的多线程支持
测试运行器与测试框架
测试运行器和测试框架管理模糊测试的执行,并提供:
- XNU 客户机环境的初始化
- 跨各种子系统执行模糊测试输入
- 崩溃检测与报告
主要特性
- 全面的 XNU 内核覆盖:测试多个子系统,包括 BSD、Mach、虚拟内存、线程和进程
- 用户空间 XNU 执行:在受控的用户空间环境中运行 XNU 内核组件
- 完整线程支持:利用改进的 Concurrence 实现正确的多线程能力
- 虚拟内存支持:使用 null pmap 层,计划支持 ARM pmap
- MIG 模糊测试:支持对 Mach 接口生成器(MIG)接口进行模糊测试
- 超级调用接口:促进宿主机与 XNU 客户机组件之间的通信
支持的特性
- BSD
- Mach
- 虚拟内存(带 null pmap 层)
- 线程和进程
- 网络
- Mach 消息
- MIG 接口
工作流程
- XNU 内核以必要的修改编译为库
- 宿主机环境初始化 XNU 客户机库和自定义调度器
- Centipede 使用 protobuf 定义生成结构化输入
- 测试框架执行输入,调用系统调用、Mach 消息和其他内核接口
- 自定义调度器管理 XNU 客户机内的线程执行
- ASAN 监视内存损坏问题
- 收集并分析崩溃和覆盖率信息
局限性与未来工作
- IOKit 支持:当前实现不支持 IOKit 子系统
- 仅二进制模糊测试:当前方法依赖于源代码,而源代码并未包含所有模块
未来的工作包括:
- 实现 IOKit 支持
- 集成 ARM pmap 以支持虚拟内存
- 调整技术以适应仅二进制的模糊测试场景
- 继续扩展对 XNU 子系统的覆盖和支持
公开发布限制
为了使此仓库保持良好的结构,用户需要自行将一些依赖项添加到 third_party,例如 xnu、bootstrap_cmds 以及其他一些库。