P2IM

Scalable and Hardware-independent Firmware Testing via Automatic Peripheral Interface Modeling

abstract

嵌入式固件的动态测试或模糊严重限制了硬件依赖和较差的可伸缩性,部分导致了普遍存在的脆弱的物联网设备。我们提出了一种软件框架,它可以持续地执行给定的固件二进制文件,同时从现成的模糊器引导输入,从而支持独立于硬件的、可扩展的固件测试。我们的框架使用了一种名为P2IM的新技术,对各种外设进行抽象,并根据自动生成的模型动态地处理固件I/O。 P2IM与外围设备设计无关,与固件实现通用,因此适用于广泛的嵌入式设备。我们使用70个样本固件和10个来自真实设备(包括无人机、机器人和PLC)的固件来评估我们的框架。在没有任何人工协助的情况下,它成功地执行了79%的样本固件。我们还对真实的固件进行了有限的模糊测试,发现了7个独特的未知bug。

Limitation

  • 由于DMA的复杂性和特定于外围设备的特性,不支持DMA
  • 超越模糊化的固件分析:虽然我们的工作最初是受到固件模糊化所面临的公开挑战的启发,但它并不是专为支持模糊化而设计的。其他类型的动态固件分析不需要完全准确的固件输出,可以使用我们的框架来实现硬件独立性和可伸缩性。例如,数据或代码的可达性分析,例如污染分析和某些调试任务,可以从我们的框架中受益。

uEmu

Automatic Firmware Emulation through Invalidity-guided Knowledge Inference

abstract

由于硬件和固件之间的紧密耦合,对微控制器进行固件仿真具有挑战性。这极大地阻碍了动态分析工具在固件分析中的应用。最先进的工作是通过观察未知外设的访问模式来自动建模,然后利用启发式来计算当未知外设寄存器被访问时的适当响应。但是,我们根据经验发现,这种方法和相应的启发式方法通常不足以模拟固件。在这项工作中,我们提出了一种新的方法,称为μEmu来模拟固件与未知的外设。与试图为每个外设构建通用模型的现有工作不同,我们的方法学习如何正确地模拟在各个外设访问点上的固件执行。它将固件镜像作为输入,并通过将未知的外围寄存器表示为符号来象征性地执行它。 在符号执行期间,它推断出响应未知外设访问的规则。这些规则存储在一个知识库中,在动态固件分析期间将引用该知识库。μEmu在外设驱动程序单元测试中,在没有任何人工辅助的情况下,达到93%的通过率。我们还用真实的固件样本评估μEmu,发现了新的bug。

Limitation

  • 缺少对DMA的支持
  • 模糊测试用例不能通过I2C外设的数据寄存器提供给模拟器。
  • 根据特征来识别数据寄存器存在FN
  • μEmu只在上下文包含一个或多个符号时检测无限循环/长循环。真实世界更复杂,循环的计数器可能是一个具体的数字,同时依赖外面的符号。

AutoMap

Automatic Firmware Emulation through Invalidity-guided Knowledge Inference

abstract

在嵌入式设备开发中,同桌面计算机最大的不同之一在于开发者需要对硬件资源进行直接管理(而中间往往没有OS),所以经常会涉及到peripheral也就是我们常说的“外设”的一些操作。下图展示了常见的一些嵌入式设备的外设通信模型。在实际使用中,每一类外设都会在内存中划定一块区域(地址范围),用来作为它们同MCU通信的中间地带。MCU在执行固件代码时,通过读写特定的地址上的值,就实现了同外设的交互。这些特定地址上的基本单元, 在嵌入式开发里面被叫做寄存器(register,注意这种寄存器和桌面、服务器端的CPU上的寄存器差别)。

image

安全分析人员经常会使用模拟器来模拟执行嵌入式固件,其中最让人头疼的部分莫过于和外设交互这部分的模拟——外设的执行逻辑并没有体现在任何指令中,单纯一条I/O指令完全反映不出可能的行为模式。 所以很多嵌入式固件模拟分析的工作都试图用一些技巧性的方式来弥补这方面的不足。实际上,现在已经有非常多的同类工作(见下表)

image

本文作者指出,在实际的实现过程中,模拟器常常会不正确地模拟嵌入式设备的一些行为 。本文讨论的主要问题就是其中一种“奇异”的行为:在嵌入式设备外设的寄存器中,有一些特定的寄存器之间存在隐性关联关系,一旦其中的一个寄存器发生了变化,其余的也会跟着关联变化,而且这种变化不需要经过MCU的任何干预。 作者把这种现象命名为hidden memory mapping,可以想象,在模拟执行分析时,如果模拟器不知道hidden memory mapping的存在,那么在对一个特定的寄存器进行操作后,并不会去把其他相关寄存器也更新一遍,这可能会导致模拟结果谬以千里。(P2IM和uemu)

既然知道了问题所在,为了解决这个痛点,作者在Unicorn模拟器的基础上实现了名为AutoMap的系统。按照下图的示意,AutoMap为模拟器准确处理hidden memory mapping增加了一个中间层,可以基于领域知识(domain knowledge)来处理寄存器的隐式关联变化。

作者在NRF52832,STM32F103和STM32F426进行实验。

Limitation

  • 为了提取外设寄存器的隐藏内存映射,AutoMap需要相应的硬件MCU,这限制了AutoMap的可扩展性。
  • 不能处理这些数据外围寄存器

Further Work

  • 为更多MCU构建知识库
  • P2IM和uemu因为隐藏的内存映射而产生不正确的结果,可以去改进
  • 改进算法,提高效率
  • 当我们在每个外设上获得足够的内存映射知识时,我们可以使用机器学习来建模外设。这种实现可能是可行的,因为内存映射可能会有一些清晰的模式和统计特征。最终目标是在没有硬件的情况下从训练过的模型推断内存映射,使AutoMap更具可扩展性和效率。

可能的研究方向

  1. 基于AutoMap,从hidden memory mapping改进 P2IM或者uemu。 AutoMap可以进一步集成到模糊处理组件中,这可能有助于在考虑隐藏内存映射时发现更多的漏洞,从而减少误检。
  2. 基于AutoMap,使用机器学习来建模外设。 当我们在每个外设上获得足够的内存映射知识时,我们可以使用机器学习来建模外设。这种实现可能是可行的,因为内存映射可能会有一些清晰的模式和统计特征。最终目标是在没有硬件的情况下从训练过的模型推断内存映射,使AutoMap更具可扩展性和效率。
  3. 基于P2IM,做一个不是模糊测试的固件测试。 最初P2IM是受到固件模糊化所面临的公开挑战的启发,但它并不是专为支持模糊化而设计的。其他类型的动态固件分析不需要完全准确的固件输出,可以使用这个框架来实现硬件独立性和可伸缩性。例如,数据或代码的可达性分析,例如污染分析和某些调试任务。

pre

基于hideen memory mapping的固件仿真及检测框架

  • 研究方向
    • 固件仿真,固件动态测试
  • 研究的对象
    • Iot固件
    • 车辆固件(可选)
  • 研究的目标
    • 对固件二进制文件,在不依赖硬件的前提下,进行仿真;
    • 对外设进行仿真;
    • 在成功仿真的基础上进行包括但不限于模糊测试的动态测试方法试图检测固件漏洞
  • 拟解决的问题
    • 仿真固件的多样性
    • 外设仿真的准确性
    • 自动化仿真
    • 固件仿真后的动态测试
  • 输出的软件/系统,功能,需求
    • 固件仿真/测试框架
  • 研究的创新点
    • hidden memory mapping未与已有的框架结合
    • 自动化仿真
    • 针对固件检测,使用除了模糊测试的动态测试方法