(c) Airbus 2021, sduverger
GUSTAVE 是一个用于嵌入式操作系统内核的模糊测试平台。它基于 QEMU 和 AFL(以及所有它的 forkserver 同类工具)。它允许像对待简单应用程序一样对操作系统内核进行模糊测试。
得益于 QEMU,它是多平台的。可以将 GUSTAVE 视为 QEMU 内部的一个 AFL forkserver 实现,具有细粒度的目标检测能力。
GUSTAVE 主要设计用于针对嵌入式操作系统内核。它可能不是对 Windows、Linux 或 macOS 中的大型复杂内核进行模糊测试的最佳工具。
然而,如果你有一个底层目标,它可以准备一两个应用程序,无需任何用户交互即可启动,那么尝试一下 GUSTAVE 可能会很有趣。
AFL 项目中的 afl-fuzz 工具用于自动模糊测试你的目标。然而,AFL 无法直接对操作系统内核进行模糊测试,它期望其目标直接解析生成的测试用例。
简而言之,afl-fuzz 将运行集成了 GUSTAVE 的 QEMU 作为其目标。反过来,GUSTAVE 将处理 :
与 AFL++ 项目中的 AFL/QEMU 用户模式类似,GUSTAVE 实现了 QEMU TCG IR 级别的二进制插桩,用于代码覆盖率。
然而,你可以选择禁用它,并重新构建目标内核代码,仅使特定部分进行代码覆盖率分析。不过,你需要在构建时注入 AFL 填充层来更新追踪位图。这是我们最初的方法(参见出版物)。
在现有解决方案中不太常见的是,GUSTAVE 不关心监控 kernel panics。我们将它们视为已管理的错误,并希望发现未触发任何警报的非法行为。
为此,GUSTAVE 依赖于一个 O(1) 面向字节的内存过滤位图来检测内核的 非法 访问。关于从内核角度定义什么是非法行为,可能存在很大争议。但在受限的嵌入式、高度确定性的环境中,你可能会觉得为固件定义 合法 内存区域并跟踪越界访问是合适的。
存在类似的方法,例如:
GUSTAVE 的设计选择意味着以下差异:
然而,你仍需告诉 GUSTAVE:
目前仅支持 x86 宿主机,由于许多工作环境都基于此架构,我们不认为这是一个限制因素。
该限制源于我们最初在 tcg-target 级别为 QEMU 加载/存储快速路径实现内存过滤后端的方式。最近的 TCGPlugin 内存回调架构可能是支持任何宿主机的替代方法。
我们已实现并测试了 Intel x86 和 PowerPC 支持。GUSTAVE 的实现与架构无关。如果你能用 QEMU 运行目标,那么无需费力即可用 GUSTAVE 对其进行模糊测试。
我们提供了集成 GUSTAVE 的示例 Intel 440FX 和 PowerPC PREP 板卡。实现自己的板卡非常简单,只需包装给定架构的 MACHINE_INIT 函数即可。
我们还为 afl-gcc 添加了 x86 和 PowerPC GUSTAVE 插桩填充层支持,以防你不想进行 TCG 二进制插桩。
我们提供了 POK 微内核的特定开发内容:
你需要:
阅读 手册 以了解 POK 目标。
关于 GUSTAVE 的不同演讲资料可在 https://airbus-seclab.github.io/ 找到。