avatar

Chunlin

因为见过伟大,所以不甘平庸

What You Corrupt Is Not What You Crash-Challenges in Fuzzing Embedded Devices

1. Basic Information

Conference: NDSS’18
Author: Marius Muench, Jan Stijohann, Frank Kargl
Affiliation: EURECOM

2. Introduction

本文证实了嵌入式设备上的内存破坏 (Memory Corruptions) 所产生的行为通常是静默的,大大降低了传统动态测试技术的有效性,尤其是模糊测试。

为此,作者分析了几类嵌入式设备中内存破坏所带来的影响的差异,同时,展示了它们对固件分析的影响。并且介绍了一些相对简单的启发式方法,它们可以在分析嵌入式设备期间检测以前无法检测的内存破坏问题。

3. Problem

嵌入式设备上的内存破坏所触发的异常行为不明显,传统动态分析工具难以使用。

4. Design

4.1 Classes of Embedded Devices

  • Type-I: General purpose OS-based devices
  • Type-II: Embedded OS-based devices (Custom)
    • uClinux,ZephyrOS or VxWorks
  • Type-III: Devices without an OS-Abstraction (Monolithic Firmware)
    • Based on Contiki, TinyOS or mbed OS

4.2 Main Challenges of Fuzzing Embedded Devices

  • Fault Detection:
    • 嵌入式设备中缺少触发崩溃和异常的机制,使得动态测试难以根据崩溃和异常信息寻找到BUG,即使提供触发崩溃的机制对于崩溃的检测也异常复杂。通常使用以下两种动态检测(探测)方法:
      • Active probing:将特殊请求插入到与设备或其环境的通信中,会影响被测试软件的状态
      • Passive probing:不改变设备状态的情况下获取设备状态信息,观察设备对输入的响应和可见崩溃
  • Performance and Scalability:
    • 并行测试技术很难应用到嵌入式测试中
    • 每个测试用例中的设备重启(状态还原)比较耗时
  • Instrumentation:已有的动态插桩技术难以应用到:
    • 单用途设备(下图Type-II)
    • 没有操作系统抽象的设备(下图Type-III)

TABLE II

4.3 Experiment Survey

为了研究内存损坏在不同系统中的行为,在不同的系统上触发相同的内存损坏条件,以分析它们会导致可见崩溃,还是导致静默的损坏,结果如下:
TABLE III
注:

  • mbed TLS->为嵌入式和桌面系统设计的SSL库
  • expat->流行的XML解析器
  • √->可观察的内存错误
  • ×->没有明显的行为
  • malfunc.->继续运行,但返回的数据都是错误的
    结果表明:
  • 嵌入式平台提供的功能越少,检测到内存损坏的可能性就越小。对于基于堆的缓冲区溢出和双释放问题,嵌入式Linux(Type I)会继续运行,并在稍后的时间点崩溃
  • Type-II和Type-III设备的输入错误很少会触发崩溃,进一步说明在嵌入式系统中,静默内存损坏是及其常见的

4.4 Six different options to mitigation

  • Static Instrumentation
    • 需要源码,编译工具连
    • 传统的插桩工具难以应用的嵌入式中
  • Binary Rewriting
    • 需要固件镜像,设备
    • 固件反汇编复杂,内存语句,内存边界以及相应的数据结构会在编译中丢失
    • 嵌入式设备内存空间小,留下很少的空间用于插桩
  • Physical Re-Hosting
    • 需要源码,编译工具链,不同设备
    • 将源码重新编译成其他类型的设备固件,例如Type-II编译成Type-I
    • 编译器不同,可能导致原类型中的漏洞可能不会被在新类型中触发
  • Full Emulation
    • 需要固件镜像,设备仿真器
    • 要求所需的架构以及设备可以被仿真
  • Partial Emulation
    • 需要固件镜像,设备
    • 性能以及可扩展性较差
  • Hardware-Supported Instrumentation
    • 需要设备以及一些高级的调试特征

4.5 Fault Detection Heuristics

本文实现一组启发式方法,来模拟现有的编译时和运行时技术,借助它们检测固件中的内存崩溃。

  • Segment Tracking:
    • 观察所有内存读写,并验证它们是否发生在有效的位置,从而在某种程度上模仿MMU来检测段错误(非法内存访问),
    • 需要trace信息和逆向操作
  • Format Specifier Tracking:
    • 验证格式字符串描述在printf()族函数中输入时是否指向一个有效的位置(如果没有动态生成的格式字符串说明符,那么这些有效的位置必须位于只读段中)
    • 不仅需要了解格式处理函数的位置,还需要了解输入其中一个函数和参数顺序时的寄存器状态。通过逆向工程或固件的自动静态分析,可以获得相应函数的位置及其参数顺序。
  • Heap Object Tracking:
    • 通过计算分配和回收函数的参数和返回值,并记录堆对象的位置和大小来检测与堆相关的时间和空间错误
    • 依赖于各种信息:已执行的指令、寄存器的状态、内存访问,以及有关分配和释放函数的知识
  • Call Stack Tracking:
    • 通过监听所有直接和间接函数调用和返回指令,来识别基于堆栈的内存损坏(覆盖函数返回地址)
    • 嵌入式设备通常是中断驱动的,所以可能导致漏报
  • Call Frame Tracking:
    • 调用堆栈跟踪技术的一个更高级的版本,通过跟踪函数调用来定位,然后检查连续内存访问是否交叉堆栈帧,用于检测基于堆栈的粗粒度的缓冲区溢出,不存在漏报
    • 需要识别执行的指令以及寄存器值,以便在函数项上提取堆栈指针值。然后,必须观察内存访问以检测实际的损坏。
  • Stack Object Tracking:
    • 可以完成对栈变量越界访问的细粒度检测,使用在调试符号中出现的变量信息(大小和位置),观察在执行过程中的内存读写

TABLE IV
注:

  • 活性(liveness)检查:在每次模糊测试输入之后,模糊测试器都会收到设备的响应,并评估它是否与预期的行为匹配。当接收到的响应与预期的不同,或者连接超时时,模糊器会报告崩溃并重启目标

4.6 Implementation

使用PANDA替换Avatar的后端仿真器S2E,使用PANDA来模拟固件,并依赖它的插件系统(实现启发式算法)来获得部分或完全模拟固件执行时的实时反馈,并借助Avatar在设备初始化后保存并重放设备状态(在初始化完成后保存设备状态的快照,并重用它来初始化模拟器)。

模糊器使用Boofuzz,它不仅生成和发送变异输入,而且还允许定义目标监视和重置钩子,允许模糊用户定义的通信通道,并为串行和TCP连接提供现成的实现。

5. Evalution

5.1 Fault Detection

FIG1
注:

  • NAT: Native(在实际设备上执行,不使用任何错误检测)
  • PE/MF: Partial Emulation with Memory Forwarding,使用PANDA仿真固件+借助I/O转发与物理设备交互
  • PE/PM: Partial Emulation with Peripheral Modeling,使用PANDA仿真固件+使用Avatar仿真设备交互行为
  • FE: Full Emulation,固件和设备均使用PANDA
  • PC:对模糊器插桩,强制以指定概率触发漏洞
    由上图可见,组合启发式(每组中最右边的条)总是成功地检测到所有的损坏,而依赖于活动检查(最左边的条)总是留下大量未检测到的错误

5.2 Performance

FIG2
由上图可知,在性能方面,

  • 使用内存转发的部分仿真(PE/MF)会引入较大的开销。它将模糊测试的速度降低了一个以上的数量级。这种开销是由固件和设备外设之间的通信引入的,这会导致频繁调用Avatar的编排特性
  • 使用纯软件仿真,具由最接近于原始物理设备的速度

6. Conclusion or Limitations

本文讨论的解决方案没有在现实场景下进行测试,可能不适用于所有的场景和所有的嵌入式系统设备。

方法或工具或研究人员 描述
Alimi et al. 使用遗传算法生成测试输入来模糊部分的MasterCard M/Chip规格,并借助部分仿真完成综合测试
Kamel et Lanet 为web服务器的HTTP实现设计了一个基于生成的模糊器,能够触发一些BUG,包括智能卡中的错误
Koscher et al. 使用逆向工程和包嗅探以及模糊测技术对汽车系统进行了安全测试
Almgren et al. 开发了几种基于突变和生成的模糊器,用于测试各种plc和智能仪表
Mulliner et al.和Van den Broek et al. 根据GSM规范开发了基于生成的模糊器,用于测试GSM在功能手机和智能手机上的实现
PROSPECT 通过转发可能访问物理设备的外设的系统调用来模拟基于Linux的系统,完成固件模糊测试

8. Comments

本文对嵌入式系统和桌面系统中出现内存破坏时的行为进行对比,观察到嵌入式系统对内存异常问题的处理通常是静默的,难以直接使用模糊测试工具。因此,作者提出解决这类问题的启发式方法,综合利用Avatar、PANDA、Bootfuzz等工具的优势完成实验设计和评估。

注:解读如有错误或不当之处,麻烦在评论区批评指正。