Gustave
Gustave是一款功能强大的嵌入式操作系统内核模糊测试工具,该工具是一个模糊测试平台,专为嵌入式操作系统内核而设计,该工具基于QEMU和AFL实现其功能,可以帮助广大研究人员对操作系统内核进行模糊测试,整个过程就向对一款简单的应用程序进行模糊测试一样轻松。
多亏了QEMU的多平台特性,我们可以将Gustave视为QEMU内部的AFL forkserver实现,并且提供了细粒度的目标检查功能。
支持哪些内核?
从功能设计来看,Gustave主要针对的是嵌入式操作系统内核,因此如果你想要对一个大型复杂的Windows或Linux内核进行模糊测试的话,Gustave可能就不是最佳选择了。
不过,如果你针对的是那些嵌入式操作系统内核,并且是由一些应用程序启动且不需要用户交互的硬件设备,那么Gustave绝对是你最佳的选择。
工作机制
来自AFL项目的afl-fuzz工具可以帮助我们以自动化的方式对目标进行模糊测试。但是,AFL无法直接对操作系统内核进行模糊测试,也无法让其目标直接解析生成的测试用例。
简而言之,afl-fuzz将会运行QEMU并将Gustave整合进目标项目之中。与此同时,Gustave将会处理:
forkserver同步
生成的测试用例转换为目标系统调用
目标内核监控
跟现有解决方案进行对比
Gustave的设计选择意味着跟现有项目有着以下区别:
你需要在目标内核中注入AFL指令;
目标内部不需要特定的开发;
只要QEMU提供支持,就可以真正瞄准目标进行模糊测试(OS、体系结构);
甚至可以将硬件虚拟化与kvm结合使用;
涵盖目标内核中实现的所有系统调用;
当前状态
硬件
我们已经实现并在Intel x86和PowerPC上进行了测试,Gustave实现是架构独立的,如果你使用QEMU来对目标进行测试的话,只需要稍做配置即可结合Gustave来对目标进行模糊测试了。
目前,我们提供了已整合Gustave的Intel 440FX和PowerPC PREP样本,我们在主板上实现的样例比较简单,感兴趣的同学可以参考这篇【文档】。
软件
我们还提供了POK 微内核目标特定的开发:
针对x86/PRC的系统调用ABI生成器;
X86内存;
工具使用
1、首先,你需要准备好需要进行模糊测试的目标,使用afl-gcc进行重构或代码修复。
2、接下来,针对目标实现翻译器。
3、整合Gustave构建QEMU。
4、针对目标编写一个JSON配置文件。
5、最后,在命令行终端窗口中运行工具即可。
工具要求
除了目标和QEMU的工作编译环境之外,还需要以下Git树:
$ git clone -b gustave https://github.com/airbus-seclab/afl $ git clone -b gustave https://github.com/airbus-seclab/qemu
项目地址
Gustave:【GitHub传送门】
参考资料
https://github.com/airbus-seclab/qemu/blob/gustave/hw/i386/fuzz/afl.c
https://github.com/airbus-seclab/gustave/blob/master/doc/README.md
https://airbus-seclab.github.io/GUSTAVE_thcon/GUSTAVE_thcon.pdf
https://github.com/airbus-seclab/gustave/blob/master/GUSTAVE_SSTIC/GUSTAVE_SSTIC_slides.pdf
https://github.com/airbus-seclab/gustave/blob/master/GUSTAVE_SSTIC/GUSTAVE_SSTIC_paper.pdf
https://static.sstic.org/videos2019/1080p/SSTIC_2019-06-06_P05.mp4