论文笔记:FIRM-AFL: High-Throughput Greybox Fuzzing of IoT Firmware via Augmented Process Emulation
作者:Yaowen Zheng123*, Ali Davanian2, Heng Yin2, Chengyu Song2, Hongsong Zhu13, and Limin Sun13
机构:物联网信息安全技术北京市重点实验室;中国科学院信息工程研究所;加州大学滨江分校;中国科学院大学网络安全学院
源码:https://github.com/zyw-200/FirmAFL.https://github.com/zyw-200/FirmAFL.
目录
1. 概述
2. 背景
3. 本文贡献
4. 论文方法
4.1. 增强流程仿真(Augmented Process Emulation)
4.2. 内存映射
4.3.System Call Redirection
5. 评估
5.1. 有效性评估
5.2. 高效性评估
5.3. 系统优化能力评估
5.4. 漏洞挖掘能力评估
6. 结论
1. 概述
作者提出FIRM-AFL,第一个高吞吐量的物联网固件灰盒模糊器,解决了IOT模糊化两大问题:
1.通过为可在系统仿真器中仿真的POSIX兼容固件启用模糊处理来解决兼容性问题
2.通过将系统模式仿真和用户模式仿真相结合,提供了系统模式仿真的高兼容性和用户模式仿真的高吞吐量
2. 背景
- 由于对实际硬件配置的强烈依赖性,直接在物联网固件上应用模糊测试通常是不可行的。例如,简单地从基于Linux的固件中提取用户级程序并使用AFL对该程序进行模糊处理在大多数情况下是行不通的
- 全系统仿真运行时巨大的开销,一部分来自于内存管理单元的软件实现,另一部分开销来自系统调用仿真开销。
- 主要挑战:包含系统调用、代码指令翻译、内存地址访问三个方面的性能瓶颈
3. 本文贡献
- 作者指出,完整的系统仿真会产生运行时开销,并且远不适合作为物联网固件模糊的基础。我们进一步调查这个运行时开销的根本原因。·
- 作者提出了一种新的技术,称为“增强过程仿真”,以调和全系统仿真(高通用性和低效率)和用户模式仿真(低通用性和高效率)的矛盾特性。·
- 作者设计并实现了第一个覆盖-引导的物联网固件灰盒模糊测试平台FIRM-AFL。
- 作者广泛评估我们的系统,并显示我们系统的每个部分的开销。我们的改进导致平均8.2倍的加速。因此,FIRM-AFL可以在1天内找到漏洞,比全系统仿真快3到13倍,并且能够在单台机器上在8小时内找到两个新漏洞。
- FIRM-AFL的当前实现支持三种CPU架构,包括mipsel、mipseb和armel,它们覆盖了Firmadyne数据表中90.2%的固件映像
4. 论文方法
- Afl- fuzzy。它从种子队列中挑选一个种子,执行一个随机突变,生成一个输入,并将这个输入输入到目标程序
- AFL每次从Fork server中fork出一个子进程
- 对比子进程的位图和之前执行的累计位图,来确定突变的输出是否应该作为一个新的seed重新进入seed队列
此外,将用户模式QEMU替换为增强的流程模拟
在初始化过程中,系统将Firmadyne和DECAF两个工具与增强进程仿真架构结合。其中Firmadyne实现固件的硬件与系统支持,保证顺利启动IoT固件镜像。DECAF用于实时获取系统中所有进程的状态信息,保证可以检测到程序测试开始的位置。对于测试子进程的创建,在系统仿真与用户仿真端,采用copy-on-write 轻量级快照机制来存储被写的内存页,用于下一轮fuzz之后的状态恢复,取代fork系统调用创建子进程的方法。对于程序的输入注入,系统对网络相关的系统调用进行插桩并实现输入注入。对于代码覆盖信息的收集,由于系统仿真端只进行内存映射查找和系统调用执行,因此只在用户态下进行插桩收集。
作者的创新点:
- 利用Firmadye+DECAF来模拟固件镜像(DECAF开启VMI(Virtual Machine Introspection)功能,对于VM停启时间精准把握)
- Fork点位不再是默认的主程序入口,改为System call的第一次调用;同时需要fork两种模式:用户模式和系统模式,二者同步进行
- 对于VM实例的资源消耗问题,作者实现了基于Copy-on-Write principle的轻量级快照技术
首先将映射到系统模式QEMU的RAM文件标记为只读。然后内存写入将导致页面错误。我们复制这一页,然后标记这一页为可写。因此,作者记录在一次fuzzing执行中被修改的所有内存页。在恢复快照时,我们只需要将这些记录的页面写回。
简单点说:在需要进行写入时,设置为只读并打上快照,在完成所以fuzzing后,把对于RAM处理的所以内存页保存,并恢复快照即可,重新写回即可
4.1. 增强流程仿真(Augmented Process Emulation)
前提:
- 需要能够在QEMU等仿真软件上实现————借助Firmadye实现
- 符合POSIX兼容标准——本实验采用的是LinuxOS,无冲突
将用户模式仿真和系统模式仿真相结合
流程:
- 固件在系统模式模拟器中启动,用户级程序(包括要模糊化的程序)在模拟器中正确启动,直到被模糊化的程序到达预定的点(fork点位)
- 建立内存映射,将RAM内部虚拟地址映射到用户模式模拟的地址空间,系统模式认为RAM为物理地址,用户模式通过映射访问
- 在用户模式模拟中正确执行,直到它到达系统调用,此时将执行迁移到系统执行;当调用返回时,我们将执行迁移到用户模式模拟
4.2. 内存映射
程序将遍历指定进程的页表,收集虚拟到物理页映射信息,并将其发送到用户模式模拟端。然后,对于每个虚拟地址(va)到物理地址(pa)的映射,用户模式仿真端通过调用mmap建立一个映射
系统采用以内存页为单位对同一物理内存进行映射的方式完成用户态和系统态之间的内存共享。最开始由系统态完成固件系统的初始化和被测程序的启动,保证完整的程序执行环境,之后转由用户态执行。在用户态仿真下对某内存页进行第一次访问时,由于系统将用户态最初所有虚拟页与物理页解除映射,因而会产生段错误。接着用户态捕获该错误,并向系统态询问该虚拟页在系统态下对应的物理页,并在用户下进行映射。通过该方法有效避开系统态下有较大开销的内存访问管理,
同时,相比于直接拷贝内存的方法,可以有效减少系统态与用户态仿真之间的内存状态同步的开销。在此基础上,为了进一步降低内存同步开销,系统将对代码页等进行灰盒测试前的预映射,避免每次测试过程需要重复映射这些内存页,进一步提高灰盒测试的吞吐率。
4.3.System Call Redirection
系统让用户态仿真完成用户态的代码翻译和执行,当遇到系统调用,将挂起用户态并将当前CPU状态传输给系统态。接着,系统态陷入内核执行系统调用,同时实时对执行的每一个代码块进行插桩分析。当程序PC从内核态回到用户态,且与触发系统调用时处在同一个线程中,表示系统调用已完成。此时,系统态将控制权交还给用户态。在此基础上,对于文件操作相关的系统调用,将固件中包含的文件目录直接在宿主机上进行配置,并对文件目录写操作,或对已存在文件的读写操作,用户态直接执行,而不交由系统态执行。
5. 评估
论文从系统透明性、高效性、系统优化能力、漏洞挖掘能力四个方面对系统进行了评估。
5.1. 有效性评估
有效性的评估将本系统与系统态仿真进行比对,分析程序执行结果是否一致。若一致,则认为系统能够正确执行IoT程序
本文使用nbench通用测试集和120个 IoT HTTP程序进行评测,结果显示nbench能够正确输出结果,IoT HTTP程序的系统调用序列也与系统仿真下一致
5.2. 高效性评估
高效性的评估将本系统与用户态仿真进行对比,分析程序在增强进程仿真下执行是否高效。论文使用nbench(CPU性能测试集)与lmbench(系统调用性能测试集)进行评测。通过结果分析,由于nbench测试集的程序较为简单,其执行效率基本与用户态仿真下相同。
对于lmbench,除了网络系统调用,其余系统调用的执行效率接近于用户态仿真。
5.3. 系统优化能力评估
论文通过7个IoT程序,评估本系统是否有效解决系统调用、代码指令翻译、内存地址访问带来的性能瓶颈问题。
图3为全系统仿真与增强进程仿真的比对结果。
在增强进程仿真下,用户空间代码执行时间(绿条)和代码翻译时间(蓝条)有很大的缩减。
全系统仿真 vs 增强进程仿真
图4为在增强进程仿真的基础上,部署选择性系统调用优化,文件操作相关的系统调用在用户态直接执行,系统调用时间(粉红条)有很大的缩减
增强进程仿真 vs 增强进程仿真 + 选择性系统调用优化
5.4. 漏洞挖掘能力评估
作者在Firmadyne的固件数据集上测试,最终固件中发现15个已知漏洞和两个未知漏洞。
实验对每个固件进行10轮测试,并与全系统仿真进行对比,得到图5结果(虚线为10轮结果的95%置信度的上下限,实线为中位数结果)。通过与系统态仿真第一次发现crash时间的中位数进行比较,漏洞发现的性能有平均3-13倍的提升。
6. 结论
本论文分析全系统仿真的性能瓶颈所在,并提出增强进程仿真框架,利用系统态仿真的高兼容性与用户态仿真的高效性,提高IoT设备固件程序灰盒测试的性能。通过在Firmadyne等数据集进行评估,发现灰盒测试吞吐率相比于系统态仿真提高了3-13倍,且能有效发现设备固件的真实漏洞。
作者:小吗喽_jie