论文阅读-Fuzzing of Embedded Systems: A Survey

论文阅读-Fuzzing of Embedded Systems: A Survey

1. Introduction

  • Fuzzing(即模糊测试)是“一种自动测试方法,它使用随机数据(来自文件、网络协议、API调用等)作为软件输入来生成大量测试用例,以发现可利用漏洞的存在”。
  • 尽管模糊测试是一种自动检测软件漏洞的有效技术,但将这种技术直接应用于不太明显且具有很强硬件依赖性的嵌入式设备具有挑战性。
  • 尽管由于这些原因,嵌入式系统模糊器的数量少于传统模糊器,但迄今为止已经开发了几种特定于嵌入式系统的模糊器(即模糊器),我们将在本文中对其进行分析和讨论。

1.1 Motivation

  • 许多嵌入式系统模糊测试工具(例如,Firm-AFL、Avatar2, 和 IoTFuzzer) 已被提议用于识别嵌入式设备中的错误。但是,没有安全分析师模糊嵌入 式系统或分析固件的综合指南。
  • 没有系统评价过嵌入式系统模糊测试 (ESF)「针对嵌入式系统和其固件的模糊测试」

2. SURVEY METHOD

2.1 研究问题

  • 本文的目标是回答以下问题:
    • RQ1: 传统fuzzing和ESF的区别是什么?
    • RQ2: 嵌入式系统的fuzzing技术有哪些类型,其之间各有什么不同?
    • RQ3: 目前的嵌入式fuzzing方法如何解决嵌入式模糊测试的难题的?
    • RQ4: 研究的挑战和未来的研究趋势是什么?

3. 嵌入式系统模糊测试

3.1 嵌入式系统及其固件

嵌入式系统

嵌入式系统是一种基于微处理器的系统,开发用于实现作为大型电气系统一部分的一些专用功能。

它与物理环境交互并与环境中的其他设备通信。

该系统通常由处理器、存储 器和外围设备组成。

用于操作嵌入式系统的软件存储在只读存储器 (ROM)或嵌入式系统的闪存芯片。

这种存储在ROM或闪存芯片中的软件被称为固件,其中包括引导加载程序,一个操作系统(OS),和一个文件系统。
固件控制嵌入式设备的硬件,通常是嵌入式系统的模糊测试目标。
通常,黑客会对整个固件进行模糊测试,包括操作系统和应用程序。
在单片固件设备的情况下,黑客将模糊测试用例输入到接口中,例如启动参数或外围 I/O 通道。

固件

固件通常由内核、文件系统和应用程序组成。
1890dbdbeb969e7b9.jpg
引导加载程序为操作系统(即内核)准备执行环境。
内核是操作系统的核心,控制着整个系统,应用程序通过内核来使用计算机的硬件。

大多数嵌入式模糊器的目标是应用程序,因为应用程序对 Internet开放,攻击者可以访问,并且由于其多样性和不成熟而容易出现漏洞。

尽管如此,一些模糊器使用全系统仿真可以测试嵌入式系统的内核。

作为模糊测试目标的两类应用程序是可从网络访问的应用程序和可通过仿真访问的应用程序

前一类是一些应用程序,而后者是很多,另一种模糊 测试目标的分类取决于嵌入式设备的类型。

3.2 嵌入式系统的分类

2.jpg
根据性能,嵌入式设备分为四类:实时、独立、联网和移动嵌入式设备。并根据微控制器的性能,将它们分为小型、中型和复杂的嵌入式设备。但是,由于我们对嵌入式软件测试感兴趣,所以我们遵循操作系统类型。在软件测试方面,嵌入式设备可以根据其操作系统分为三类。因为模糊测试(即安全测试)取决于操作系统。操作系统既为应用程序提供了执行环境,也为它的复杂性提供了漏洞来源。

  • 类型一(T1):具有通用操作系统的嵌入式设备。由于通用操作系统具有大量的功能、兼 容性和开发人员的持续支持,它们也被用于嵌入式设备。然而,由于性能限制,操作系统的最 小形状经常用于嵌入式设备。
  • 类型二(T2):具有定制操作系统的嵌入式设备。第二类嵌入式设备具有定制的操作系统,例如实时操作系统 (RTOS)。RTOS 用于处理数据的实时应用程序,因为它没有缓冲延迟。这些操作系统适用于低功耗设备。例如,VxWorks或 QNX是具有代表性的RTOS,广泛应用于嵌入式设备。另一个例子是 uClinux(即微控制器 Linux),它没有内存管理单元 (MMU).
  • 类型三(T3):带有单片软件的嵌入式设备。这种嵌入式设备类具有通过编译充当系统和 应用程序的单片软件。例如,许多小型设备,如智能卡、GPS 接收器或恒温器,都采用这种形 式。这些设备通常没有隐藏物理硬件并提供编程接口的硬件抽象层。

3.3 传统Fuzzing与ESF的比较

32cc7b1b21ae0287c.jpg

3.3.1 硬件依赖性强

嵌入式设备有各种微控制器(即MCU)和操作系统。常⻅的MCU类型有 ARM、MIPS(32/64bit)、Alpha、x86-64、IA-64、MSP430、PowerPC(32/64bit)、 SPARC-V8、V9等10余种,OS超过5种包括 Linux、VxWorks、QNX、uClinux 和 TinyOS,而桌面系统通常具有 x86-64 CPU 和 Linux 操作系统。桌面模糊器通常在目标系统上工作, 但嵌入式系统模糊器在另一个系统上工作,因为目标系统功率低且资源有限。因此,大多数嵌入式系统模糊器使用仿真或重新托管固件。PC模糊器的目标程序是真实世界的数据集,例如 Binutils, LAVA-M,或CGC datasets,而嵌入式系统模糊器的目标是固件中的可执行程序。

MCU架构有两种主要类型:精简指令集计算 (RISC)和 复杂指令集计算 (CISC). RISC 的示例 是 ARM、MIPS 和 PowerPC 架构,而 CISC 的示例是 x86-64 架构. RISC 体系结构旨在使用 在一个时钟周期内执行的简单指令。相反,CISC 架构专注于通过在目标硬件上构建丰富的指令 集来使用更少的汇编指令。例如,CISC 的“ADD”指令在 RISC 中分为三个独立的指 令:“LOAD”、“ADD”和“STORE”。由于指令被拆分,RISC 架构具有流水线和更好的硬 件使用的优点。因此,许多嵌入式系统都使用 RISC 体系结构。

3.3.2 崩溃检测

4d32704d42f510035.jpg
如算法1所示,监控模糊测试结果(即崩溃检测)是 ESF 的关键步骤。崩溃检测在 ESF 中并不容易,但在PC模糊测试中相对容易。T1、T2 和 T3 的碰撞检测率分别为 70%、40% 和 0%。因此,嵌入式系统的崩溃检测率仅为桌面系统的 37%。这是因为桌面系统在崩溃或故障时配备了各种检测机制(例如,错误消息、安 全警告和系统日志)。当正在执行的程序被致命信号(如分段错误)终止时,Linux 中的模糊器会检测到崩溃。这是因为用任意值覆盖返回地址的内存错误会在访问时产生分段错误或中止。这种检测方法简单有效,因为只有模糊器在没有操作系统干预的情况下捕获信号。然而,由于嵌入式操作系统在大多数情况下不提供故障生成机制,因此模糊器很少能检测到故障或崩溃。更糟糕的是,由于嵌入式设备通常没有输出设备(例如监视器),因此用户无法注意到崩溃检测。

3.3.3 Instrumentation

检测方法有两种类型:

  • 在静态分析期间对源代码执行的源代码检测和对编译的二进制文件执行的二进制检测。

  • Instrumentation 在PC系统中经常使用,以通过源代码检测或二进制检测收集所提供输入的代码覆盖率信息或对感兴趣的变量进行跟踪污点分析。

然而,通常情况下,固件或应用程序的源代码无法从嵌入式设备获得。更糟糕的是,由于异 构嵌入式设备具有其 CPU 架构、操作系统和 I/O 设备,因此无法重新编译该程序。另一种解决方案不是使用源代码检测,而是使用动态二进制检测工具,例如Pin或 Valgrind。例如,QSYM在通过利用 Pin 的检测技术测试程序二进制文件时使用覆盖率信息。但是,这仅适用于基于通用操作系统的设备,嵌入式操作系统特定设备或没有操作系统的设备除外。

3.3.4性能和可扩展性

嵌入式系统具有低功耗和有限资源导致的计算性能限制。已经为当前的嵌入式系统开发了几种技术来克服性能限制。首先,嵌入式系统有功能升级. 由于供应商降低了生产成本,他们通过在保持硬件不变的情况下更改软件来更改和升级嵌入式系统。这种功能升级通常包括克服计算性能的功能限制。其次,在时间限制内处理数据和事件的 RTOS 或实时处理消除了计算性能限制。 第 三,通过优化的编译器去除数据依赖性可以提高计算性能。数据独立性使并行化成为可能,并有助于提高计算性能。最后,让程序使用寄存器、缓存和 DMA 而不是内存对于计算性能更好。

通常,模糊测试需要重新执行被测程序 (PUT)为每个测试输入保持干净的状态。通过恢复虚拟机快照,这种技术对于桌面系统来说很容易。然而,这对于需要大量时间来重置设备的嵌入式设备来说是困难的。此外,在桌面系统中可以并行执行模糊测试。然而,并行化在嵌入式设备中通常是不可能的,例如嵌入式操作系统设备或没有操作系统的设备。因此,重复试验是不可能的,或者嵌入式系统需要很⻓时间才能进行模糊测试。处理增加的需求的能力被称为可伸缩性,这就是模糊测试领域的并行执行。桌面系统通常支持并行模糊测试,但由于资源和经济原因,在嵌入式设备中是不可能的。由于在嵌入式系统中 构建用于并行模糊测试的环境需要许多实际设备,因此成本很高。例如,AFL(即流行的桌面模 糊器)通过单系统并行化或多系统并行化支持并行模糊测试,这取决于所需的系统数量。总之,ESF 不能期望最先进的作品具有可扩展性。

3.4 Fuzzer的传统分类

传统的模糊测试根据他们在测试期间需要的关于 PUT 的信息量分为三类,此信息可以包括检测、代码覆盖率、总路径数、路径约束或任何引导测试用例生成的信息
54e954ad50ba8f63d.jpg

3.4.1 黑盒fuzzer

只确定程序的接口,而不是PUT的数据结构或算法等细节,黑盒fuzzer根据预定义的规则随机变异种子测试用例,而不识别PUT的内部信息。

3.4.2 白盒fuzzer

白盒模糊测试是一种基于 PUT 的内部结构和执行期间生成的信息生成测 试用例的技术利用了程序分析技术,例如动态符号执行 (DSE),生成合适的测试用例。DSE 最初执行程序,生成路径约束,并解决约束。

  • 白盒模糊测试的优点是:原则上每一个新的测试用例都会覆盖程序中一个新的执行路径。因此,白盒模糊测试提供了更好的代码覆盖率,并且比黑盒模糊测试方法可以发现更多的软件漏 洞。它还能够暴露位于代码深处的漏洞。
  • 但是,白盒模糊测试有一个缺点:也就是说,解决约束需要很多时间,或者有时由于路径爆炸等各种问题无法解决约束或大量的资源消耗。此外,它需要大量的信息,例如源代码或信息的前期工作。
3.4.3 灰盒fuzzer

灰盒模糊器介于黑盒模糊器和白盒模糊器之间,只需要目标程序的部分信 息(即PUT)。此部分信息通常是通过检测生成的代码覆盖率或通过污点分析生成的污点流信息。例如,最流行的灰盒模糊器 AFL 在运行时收集路径覆盖信息,并有效地利用覆盖图 来改变测试用例(即测试输入)。具体来说,它为测试用例提供权重以找到新路径,并且测试用例发生变异。因此,灰盒模糊器非常有效,因为它不需要初步分析并且只收集部分相关信息。

4. 嵌入式系统Fuzzer的分类

4.1 分类

当我们测试嵌入式系统时,我们发现连接类型非常不同而且很重要。换句话说,由于嵌入式系统难以操作、仿真和分析,我们选择连通性作为第一个分类标准。因此,我们分类的第一类是直接模糊测试、基于仿真的模糊测试和固件分析。我们根据第一种类型设置第二个标准。然后我们应用传统分类法(即对程序信息的依赖)作为第三个标准。分类的第一个标准是每种方法用来对目标设备进行模糊测试的连接类型。我们确定了三种连接类型:直接连接和模糊测试、基于仿真的模糊测试和固件分析。

4.1.1 直接模糊测试

这种方法直接连接目标设备并在没有干预的情况下测试系统固件。这个类别有两种类型的模糊测试:

  1. 通过网络进行模糊测试可以只测试网络应用程序,这很简单,但是只能进行黑盒fuzz。
  2. 其他通过调试接口的fuzzing,比如UART或 JTAG,可以测试操作系统和应用程序。

因此,第二种方法更有利。然而,它需要大量的前置工作(即制作调试环境),而且由于删除了调试接口,并不总是可行的。

4.1.2 基于仿真的模糊测试

另一种方法使用通过 UART 或 JTAG 从嵌入式设备提取或从固件更新网站下载的固件进行仿真。这种模拟是一种系统模式模拟,它在模拟硬件上的操作系统内部执行一些应用程序。但是,由于对支持的内核和支持的 CPU 的一些限制,无法模拟每个硬件。

因此,部分仿真将外设 API 请求转发到真实设备。这种方法与没有完全支持的系统模式仿真具有相同的效果,但是需要大量的工作来准备实际的设备和转发机制。用戶模式仿真通过使用具有系统模式仿真的共享内存状态(即 RAM 文件),仅将用戶级程序迁移到主机操作系统。这种迁移只有在 系统模式模拟器和用戶模式模拟器中的内核相同时才有可能。用戶模式仿真器具有高吞吐量的 优点。

4.1.3 固件分析

第三种方法是固件分析,当需要固件执行或仿真的动态分析在某些嵌入式系统中很困难时,这很有用。例如,Firmalice包含三个主要组件:静态程序分析模块、符号执行和身份验证绕过检查模块。静态程序分析模块开发固件的程序依赖图,并创建从起点到目标点的执行路径切片。符号执行引擎找到到达目标点的执行路径和满足约束的输入。身份验 证绕过检查模块确认输入是否导致身份验证绕过漏洞。另一个例子,KARONTE,还分析多二进制交互(即静态分析)并使用污点信息(即流信息)。这种方法通常需要全面的程序信息。因此,只能使用白盒Fuzz。

4.2 主流的Fuzzer(闭源/开源)

635b18df3c597cb3d.jpg
7b6beeaddfa4c5a1e.jpg
表中T1 是具有通用操作系统的嵌入式设备,T2 是具有定制操作系统的嵌入式设备,T3 是单片软件嵌入式设备。

大多数嵌入式模糊器都针对 T1 和 T2 设备,因为 T3 固件很难获得和模拟。T3 固件很难获得,因为它是公司财产或具有定制的固件文件格式。

最常⻅的固件文件格式是 .bin,但定制的固件文件格式是 .npk(Mikrotik公司)、.chk (Netgear公司)、.fw(Cambrionix公司)等。此外,它很难模拟,因为它具有定制的外围设备,例如 UART,实时时钟 (RTC), 通用输入/输出 (GPIO),模数转换器 (ADC),数模转换器 (DAC) ,和内部集成电路 (I2C).

表中的目标列具有固件、程序和服务器应用程序之一:

  1. 固件指示固件本身 (即,模糊器测试整个固件)。
  2. 程式意味着模糊器可以测试所有程序文件。
  3. 服务器应用程序表示模糊器针对服务器应用程序。

5. 详细的Fuzz步骤

算法1描述了ESF的算法。其中ESF 需要额外的预处理步骤,例如获取固件或识别接口。然后应用传统的模糊测试步骤,例如输入生成、发送输入和目标监控。表6介绍了流行的嵌入式系统模糊器的模糊测试步骤。

8290029657d0fd267.jpg

5.1 固件获取

现有的一些研究方法通过网络爬虫收集了很多固件镜像,所有固件镜像都很难收集,因为它们是公司的财产。有时,可以通过 UART 或 JTAG 提取固件映像,但现在设备供应商倾向于禁用调试端口。另一种方法,转储嵌入式设备的闪存,有时是可行的。然而,它需要对闪存进 行拆焊,因此变得更加困难。这种固件获取 对于基于仿真的模糊测试至关重要,因为后续工作无法继续进行。总之,固件获取是基于仿真的模糊测试中不可或缺的步骤。

为了克服这个限制,IoTFuzzer针对物联网设备的网络协议。在基于网络的模糊测试的情况下,模糊测试目标主要是从网络可⻅的网络应用程序。这种狭隘的观点是基于网络的模糊器的局限性,而通过固件仿真进行模糊测试可以测试任何固件应用程序。此外,调试端口(例如 UART 或 JTAG)可用于将模糊测试系统连接到目标设备。例如, 有的研究将 UART 连接用于模糊器,而Avatar2在用实际设备编排仿真器时使用了调试接口。

5.2 接口

嵌入式设备的fuzzing接口有固 件、网络、UART、JTAG。

5.2.1 固件

许多嵌入式系统模糊器使用从实际设备中提取的固件或从 Internet 获取作为模糊测试目标。获取固件后,它被用作仿真的输入或进一步分析. 当固件用 作仿真的输入时,它可以在执行环境中动态运行和分析。基于仿真的模糊测试受益于在短时间内测试大量固件而没有准备真实设备或创建实验环境的困难。

5.2.2 网络

仿真是正确的选择,但它需要大量的工作,例如固件获取、固件解包和可执 行文件分析。此外,模仿并不总是可行的,尤其是当至少有一个作品无法解决时。另一种解决方案是通过网络对嵌入式设备进行模糊测试,通常称为网络模糊器。网络模糊测试通常是一种黑盒Fuzz,它不分析程序源代码或二进制代码,只捕获网络数据包当模糊器检测到异常时,它会存 储网络数据包以供进一步分析。

同时,IoTFuzzer 分析了 IoT 应用程序和物理设备之间通信 中使用的协议,并执行了协议引导的模糊测试。IoTFuzzer 执行连续的活性检查以检测故障。然而,这种类型的模糊测试有三个局限性:

  1. 目标应用程序应该可以从网络访问
  2. 通常很慢
  3. 固件崩溃或故障由于静默内存损坏而难以检测
5.2.3 串口

串口是异步串行通信的接口,是嵌入式设备中最常⻅的协议之一。因此,它被用作模糊测试的桥梁。例如,beSTORM是一种自动动态测试工具(即模糊器),用于验证任何使用高速 UART的软件或产品的安全性。虽然这个工具是一个黑盒模糊器,但它通常会产生令人满意的结果,因为它包含许多协议标准,例如 UART,并支持审计特定协议,从而执行智能模糊测试。其他研究人员使用了Arduino模糊嵌入式设备上的调试引脚,然后 使用Arduino作为 USB 转串口转换器与设备通信并获得外壳。此外,UART通常用作模糊测试 桥,并经常用作连接介质以促进仿真。在其他的一些研究中,UART被用作传输内存状态的通信通道。另外,由于UART支持串口通信,可以作为数据通道,如发送中断或数据等。

5.2.4 JTAG

JTAG是一种标准接口,用于验证印刷电路板的设计和测试引脚。JTAG模糊测试不存在。然而,JTAG 可以用作连接介质,以促进类似于 UART 的仿真。在几项研究中,通过带有内存存根的JTAG调试器将外设输入和输出转发到 实际设备。此外,当仿真和物理设备之间需要通信时,JTAG接口支持访问 CPU 状态、寄存器 和内存。总之,JTAG通常用于连接仿真器和真实设备,而不是模糊测试目标接口。

5.3 固件仿真

5.3.1 仿真粒度

系统模式仿真中,固件映像类似于虚拟机进行仿真,并且应支持所有外围设备。该仿真是 QEMU 提供的基本仿真. 但是,它的工作量是庞大的并且比用戶模式仿真慢。

用戶模式仿真执行为一个编译的进程中央处理器(CPU)在另一个CPU上提供便利和效率。因此,它支持系统调用翻译、信号处理和线程。系统调用翻译是指将PUT的系统调用转换为主机的系统调用。此外,用戶模式仿真可以将PUT中的所有信号重定向到主机的信号处 理程序。它还可以模拟克隆系统调用并为每个模拟线程创建一个真正的主机线程。总之,系统模式模拟将固件模拟为整个系统,而用戶模式模拟为方便起⻅模拟另一个CPU上的进程。

系统模式仿真需要手动提取,例如文件系统提取、自定义内核配置和运行系统模式QEMU。因此,Firmadyne作者通过在系统模式仿真中添加自动工作来进行全系统仿真。添加的自动化工作包括从固件中提取文件系统、配置定制内核、开发虚拟网络接口以及运行系统模式QEMU。同时,一些作品使用部分仿真,因为上面提到的仿真并不完美和准 确。部分仿真,也称为混合仿真,将仿真环境与实际设备相结合,将仿真无法处理的所有项目 转发给实际设备。因此,部分仿真具有准确性和可扩展性的优点,但也有需要实际设备的缺点。

另一种混合仿真是 Firm-AFL 使用的增强过程仿真. 增强过程仿真将系统模式仿真与用戶 模式仿真相结合,以提高模糊测试的吞吐量。因此,他们实现了内存映射,一个 RAM 文件,它是系统模式和用戶模式模拟器之间共享的内存映射文件,以及系统调用重定向。因此,Firm-AFL 显示了高吞吐量的模糊测试结果,并发现了两个未知漏洞。

5.3.2 主流的仿真器

9bc18522926f1919b.jpg
QEMU 和 Simics 模拟一个完整的系统,包括 CPU 和外围设备,所以它们很重。同时,Unicorn 只模拟 CPU,因此它是轻量级的。由于Unicorn在没有执行环境的情况下模拟 CPU,因此非常灵活。但是,当需要更准确的仿真时,它需要其他实现。虽然 QEMU 有很多相关的漏洞,但 Unicorn 和 Simics 目前还没有漏洞。

**QEMU(即Quick Emulator)**是一个通用的开源模拟器,具有模拟处理器和外围设备的独特功能,支持多架构和多平台,并且长期维护。它同时翻译几个基本块,提供一套虚拟硬件和设备,运行各种操作系统。QEMU 还可以模拟用戶级进程,这些进程在另一个 CPU 上执行为一个 CPU 编译的进程。由于 QEMU 发明后,许多模糊测试研究人员使用 QEMU 作为仿真引擎。 尽管 QEMU 的功能不足,但一些研究人员将其与其他功能相结合,例如实际的硬件支持 [70,138 ] 或增强过程仿真. Firmadyne 的作者添加了四个功能来解决当前仿真的局限性。首 先,他们修改了 QEMU 以支持 NVRAM 相关功能,因为原始 QEMU 没有提供此类支持。其次, QEMU 使用预编译内核启动提取的文件系统,因为它无法支持从所有固件中提取的每个内核。 有了这些用于 ARM 小端、MIPS 小端和 MIPS 大端平台的预编译内核,它们可以覆盖 90.8% 的 数据集。第三,他们的 QEMU 有一种学习模式,在这种模式下,他们修改后的内核会记录所有 系统交互。最后,Firmadyne 启动提取的固件映像并执行网络连接检查。

Unicorn是一个轻量级的多架构CPU仿真器框架。它源自 QEMU,但它比 QEMU 有几个优点,如表所示7. 首先,Unicorn 是一个框架,任何人都可以在其中开发工具。其次,它只模拟 CPU,因此轻巧灵活。它可以在没有执行环境的情况下模拟原始二进制代码,但 QEMU 需要整个系统映像或可执行二进制文件。第三,QEMU 不能提供动态检测,而 Unicorn 支持针对多种类型的 CPU 事件的自定义处理程序。这种支持使专家可以创建用于仿真的仪器工 具。最后,根据 CVE 网站 ,而且都是来自外围设备、输入输出设备等子系统。但是, Unicorn 目前没有任何暴露的漏洞。因此,它比 QEMU 更安全。

Simics是一个商业全系统模拟器,模拟复杂数字系统的硬件和软件。由于 Simics 提供指令级保真度和硬件模型,可支持ARM、MIPS(32/64位)、Alpha、x86-64、 IA-64、MSP430、PowerPC(32/64位)、SPARC-V8、V9等10余种处理器。它还支持通用操作 系统(即Windows、Linux、Solaris 等)以及实时操作系统(即VxWorks 和QNX)。由于 Simics 是一个足够快的商业模拟器,具有足够的保真度和准确性,已广泛应用于各行各业。另一方面,QEMU 是一个开源机器仿真器,并在学术界广泛使用。因此大多数基于仿真的模糊器、使用 QEMU 作为他们的仿真平台。

5.4 Fuzz

第一种 ESF 是网络模糊测试。Prospect、FirmFuzz 和 IoT-Fuzzer 包括网络模糊器。Prospect使用黑盒模糊测试,它设置了一个代理来将仿真环境连接到实际的嵌入式系统。代理捕获网络数据包,内部模糊器生成随机流量。具体来说,它从捕获的网络流量中获取数据包,在任意位置随机化 1 个字节,然后不跳过地重放通信。这是一个典型的黑盒模糊测试操作,但并不智能。因此,智能模糊器 FirmFuzz被提议。FirmFuzz 采用基于生成的灰盒模糊器。它进行静态分析并使用无需创建标准 HTTP 数据包的命令行浏览器,从而轻松创建基于生成的模糊器。IoTFuzzer进行了动态分析以识别物联网应用程序的消息,并对消息进行变异以制定目标设备的测试用例。这种突变既是一种无需复杂协议分析的简单方法,也是一种有用的技术,因为它不需要考虑加密。
10b0ea6857d38c0ec1.jpg
Prospect使用简单的黑盒模糊测试,不需要预处理,所以速度很快,但结果并不理想。同时,FirmFuzz 利用静态分析进行智能模糊测试,获得了令人满意的结果。最后,IoTFuzzer 需要动态的物联网应用分析;因此,它相对较慢,但显示出可喜的结果。总之,每个网络模糊器都根据其策略和目的有利有弊。

第二种ESF是符号执行. 符号执行将变量视为符号。当满足路径约束时,符号 可以是满足约束的任意值。因此,**理论上,符号执行会探索程序中的所有路径。**例如,FIE使用 KLEE符号执行引擎提供固件程序的可扩展检查。然而,符号执行有以下缺点:状态爆炸,它会产生许多它应该探索的程序路径。

混合模糊测试结合了模糊测试和 concolic(或符号)执行,以实现更广泛和更深入的程序测 试覆盖率. 到目前为止,ESF 域中没有可用的混合模糊器。

作为基于覆盖的灰盒模糊器在传统的模糊测试中表现出了典范的性能,它们可以适应ESF。基于覆盖率的模糊器通过计算已执行的基本块和程序的基本块总数的比例来测量代码覆盖率,然后使用此信息来识别未访问的程序块(即扩大代码覆盖率)。基于覆盖的模糊器旨在测试程序的每个路径分支(即 PUT)。这些模糊器的一个典型例子是 Firm-AFL. 该模糊器具有高吞吐量,因为其增强的过程仿真使在用戶模式仿真中快速测试目标程序成为可能。

虽然基于覆盖的模糊器的特点是扩大代码覆盖范围,但定向模糊器将大部分执 行时间花在到达特定目标点(例如,bugsuspicious 区域)上。例如,FirmCorn使用易受攻击的代码搜索算法进行定向模糊测试。由于漏洞代码搜索算法的有效性,FirmCorn 可以实现非常有效的崩溃时间。传统模糊研究中的定向模糊测试有两种类型:定向灰盒模糊测试和定向白盒模糊测试。

AFLGo的作者引入了定向灰盒模糊测试,它生成引导模糊器到目标点的输入。他们提出了一种新的功率调度器,可以为通向目标点的测试输入分配更多功率。在另一个例子中,Hawkeye进行了静态分析以收集有关程序和目标位置的信息,然后根据这些信息执行程序。该策略使 Hawkeye 对目标进行模糊测试并显示出更好的结果。

BuzzFuzz利用动态污点跟踪来模糊测试一个检测程序,然后在生成的输入上运行该程序以确定输入是否包含任何错误。这种方法使随机模糊测试能够探索深层程序代码,同时保留输入的语义形式。这种方法在用戶识别程序攻击点时很有用,但它不能检测出意想不到的错误,并且需要很⻓时间来测试很多点。在另一个例子中,TaintScope使用动态污点分析和符号 执行来绕过阻止程序执行到达深层程序代码部分的校验和机制。TaintScope中的执行监视器识 别哪些输入字节控制参数以及哪些输入字节与校验和相关。然后,它生成一个旁路输入。当一个程序有校验和机制,但这需要预处理开销(即动态污点跟踪)。此外,白盒模糊测试有一个缺点,即需要很⻓时间来探索所有可能的路径。

5.5 目标监控

嵌入式系统中的崩溃很难检测到。因此,已经提出了几种响应监测方法。首先,网络心跳检查广泛用于基于网络的模糊器,以检测某些嵌入式系统的挂起或无效。其次,传统模糊测试中的崩溃检测方法也可以在ESF中使用signal handlers和memory sanitizers,例如,当模糊器发现崩溃时,会发出诸如信号 11(分段违规)或信号 10(SIGUSR)之类的信号。模糊器中的监控模块捕获并处理该信号。第三,一些嵌入式设备在遇 到内存损坏时会重新启动。这种现象通常发生在 Type 3 设备中,但模糊器不会自动处理它。

首先,基于网络的模糊器,例如IoTFuzzer,检查目标设备的活跃度。它通过发送任意实时检查消息来猜测程序的活跃度。有些研究方法还使用了 liveness 检查。值得注意的是,他们彻底分析了目标设备的响应行为,并将响应分为六种类型:可观察到的崩溃、重启、挂起、后期崩溃、故障和无效。FirmFuzz通过监控模拟固件生成的日志来检测漏洞。当它模拟目标固件时,这种技术是有利的。此外,它还可以 检测其他漏洞,例如命令注入, 空指针取消引用,以及跨站脚本因为这些漏洞可 以通过执行日志检测到。内存损坏的另一种检测方法是由信号处理程序进行的. 他们在仿真器中监视程序执行并检测到诸如分段错误之类的信号。这种方法在传统的fuzzing中被广泛 使用,与AddressSanitizer (ASAN). ASAN还可以通过使用编译器工具和运行时库来帮助 检测内存错误。

5.6 异常分析

在模糊器检测到 PUT 的崩溃或错误后,它会确认发现的错误是否易受攻击。此步骤由分析师手动执行,或由模糊器中包含的程序工具自动执行. 如果模糊器发现大量崩溃,模糊器或分析师会检查数据重复。因此,分析师会发现独特的漏洞。请注意,分析师在调试嵌入式系统应 用程序时使用 GNU 调试器和 gdbserver. 这具有通过在远离目标系统的主机系统中执行实 际调试来减少性能开销的优势。此外,大多数模糊器使用异常分析的结果作为对下一次模糊测 试运行的反馈。例如,基于覆盖的模糊器使用代码覆盖率信息来选择下一个种子。同时,基于污点的定向模糊器使用从程序入口点到目标的动态污点结果或距离信息.

5.7 种子调度

分析异常后,模糊器生成种子并选择下一个种子。基于覆盖的模糊器生成新种子以扩大代码覆盖范围,定向模糊器生成新种子以更接近目标点。例如,Firm-AFL使用轻量级仪器来扩大分支覆盖范围,并且该仪器在计算分支覆盖范围时包括粗略的分支命中计数. 另一个模糊器,FirmCorn,在静态分析阶段计算API函数的漏洞特征排名,hook可疑函数,并改变函数的输入以扩大代码覆盖范围。特别是,FirmCorn 使用基于启发式的突变,例如位翻转操作。同时,AFLGo(即,定向灰盒模糊器)测量所选种子与目标点集之间的距离。然后,它计算到目标点的最短路径控制流图(CFG)并使用触发种子沿着路径执行程序。这个触发种子将模糊器引导到特定的程序点。

6.性能比较

根据我们的分类法比较基于三组的嵌入式模糊器。直接模糊测试、基于仿真的模糊测试和固件分析。然而,由于使用固件分析的模糊器很少,而且它们的运行环境非常不同,我们讨论了两组的性能比较:直接模糊测试和基于仿真的模糊测试。

基于网络的嵌入式模糊器的性能比较:
115036887d93aef241.jpg

基于仿真的嵌入式模糊器的性能比较:
1229cc1d6d3929d7fd.jpg

7. 工具的使用

7.1 模糊测试框架

Avatar和Avatar2提出了一个多目标编排框架,将仿真器或调试器等动态分析系统与真实设备相结合。当分析师为嵌入式系统制作调试或测试系统时,此框架很有用。但是,它不是完全自动化的,需要进行一些将真实设备连接到框架的工作。

7.2 固件模糊器

许多模糊测试系统将整个固件作为输入,只有少数系统测试文件系统程序之外的引导加载程序或操作系统等部分。

7.3 文件系统程序的模糊器

许多嵌入式模糊器可以测试嵌入式设备文件系统中的每个程序。许多模糊器可以分析固件中的可执行程序。当他们从设备中提取固件并在模拟器中执行时,他们可以访问文件系统中的每个程序。如果模糊器可以访问某些程序,则接收程序文件的文件模糊器可以开始执行程序。然而,攻击者对向 Internet 提供网络服务的服务器程序特别感兴趣,因为它们可以从网络外部访问(即攻击者)。因此,虽然模糊器可以测试系统中的每个程序,但模糊测试文章通常表明漏洞主要存在于服务器程序中。尽管攻击者对服务器程序以外的漏洞不感兴趣,但安全专家需要解决这些漏洞,因为它们可能会被其他攻击所利用,例如本地权限提升。

7.4 服务器程序的模糊器

模糊服务器程序(即守护进程)的访问方法有三种类型。首先,一些模糊器从模拟器 中的固件中提取并运行文件系统,然后对服务器程序进行模糊测试。该方法具有性能高、结果好的优点。其次,基于网络协议的模糊器是最适合模糊服务器程序的类型。这种方法直观方便,但缺点是目标程序有限。考虑到黑客通常从 Internet 进行攻击,这个范围就足够了。最后,一些模糊器使用JTAG或UART等调试接口可以测试服务器程序。这种方法的优点在于它可以用调试信息对服务器程序进行模糊测试。但是,此方法需要创建调试环境的手动工作。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值