Fuzzware论文笔记

Eutopia's Blog

Posted by Eutopia on December 20, 2023

Fuzzware: Using Precise MMIO Modeling for Effective Firmware Fuzzing

摘要

实现了模拟器Fuzzware,特点:减少了fuzz的input开销,节省了时间。

解决问题

针对当前几种对固件模拟fuzz的方法的局限性进行了分析

  • high-level模拟:通过挂钩完全绕过MMIO的模拟。局限:过于high-level,无法发现外设驱动代码的漏洞。
  • pattern-based MMIO模拟:通过根据固件对MMIO的访问模式来对MMIO进行分类,然后对分类好的MMIO执行特定的访问处理方式,从而可以减少fuzz的输入局限:(分类需要大量人力,P2IM),且存在寄存器误分类的问题
  • 基于符号化执行模拟:在pattern-base模拟上的改进。不需要人力对MMIO访问pattern进行分类,而是通过将固件的访问认作符号,每当需要访问特定MMIO具体值时,就求解约束获取最佳路径。局限:(存在路径消失问题,uEmu),代码覆盖率不够

主要贡献

  • 提出了一种细粒度的MMIO访问建模方法,将其与基于覆盖率引导的模糊测试结合

    • 能够识别比特级别的硬件行为(相较于P2IM的寄存器级别)

    • 保留了固件的所有路径,没有路径消除(相较于uEmu的路径消除)

    • 使用局部范围的动态符号执行分析硬件值的哪些部分实际有意义

  • 实现了Fuzzware,相较于uEmu,P2IM,代码覆盖率和通用性均有较大提升

尚存不足

  • 没有对DMA实现自动化建模。
  • 由于没有进行路径消除,导致会在一些位置陷入死循环或卡死的情况,可以通过针对卡死情况的路径消除进行改进。

主要思路

通过DSE(动态符号化执行)将MMIO的输入进行建模,查看其输入是否是全部都要用到(32bit全部有用),或者输入只需为常数或有限值即可。并根据建模结果对其输入进行特定的修剪。

性能比较

当前对固件未知外设接口的模拟(主要是为了能够确定fuzz输入点并减少fuzz内容,以便提高性能)有三种方法:分别为high-level模拟,基于access-pattern的模拟,基于符号化执行的模拟。

  • high-level模拟:通过挂钩完全绕过MMIO的模拟
  • pattern-based MMIO模拟:通过根据固件对MMIO的访问模式来对MMIO进行分类,然后对分类好的MMIO执行特定的访问处理方式,从而可以减少fuzz的输入(分类需要大量人力)
  • 基于符号化执行模拟:在pattern-base模拟上的改进。不需要人力对MMIO访问pattern进行分类,而是通过将固件的访问认作符号,每当需要访问特定MMIO具体值时,就求解约束获取最佳路径。(存在路径消失问题)

具体细节

  1. 定义了两种输入开销:full input overhead(只有一个输入能让程序继续执行①);Partial input overhead(③,32bit中只有8bit可以用到),figure 3中的case A,B,C,Default只需两个特定bit即可,mmio->status只需一个bit代表即可,而实际fuzzing input需要32bit代表输入,因此可以显著减少开销。1-2/32(94%)和1-1/32(97%)。

    figure_2

    figure_3

  2. 模型大致结构,fuzzing engine产生输入raw input,输入到MMIO,模型查看对应MMIO是否存在已建模的MMIO Access Model,如果是则将其根据分类模型将raw input转为实际输入,如果没有,则根据当前情况进行DSE对其进行分类建模。一轮输入停止后,获取反馈,优化输入。

    figure_4

  3. DSE过程:

    • 确定建模分析范围:跟踪MMIO的访问,如果内存或寄存器中存在其符号表达式则表明其存活,一直进行直到MMIO符号dead或函数返回或超时

    • 模型分类定义

      Table_1

      model_definition_1

      model_definition_2

    • 实际建模:使用angr工具。

      angr