论文题目:FIRM-AFL: High-Throughput Greybox Fuzzing of IoT Firmware via Augmented Process Emulation(本文为Usenix Security2019录用)
论文作者:Yaowen Zheng, Ali Davanian, Heng Yin,Chengyu Song, Hongsong Zhu, and Limin Sun
作者单位:中国科学院信息工程研究所,加州大学河滨分校,中国科学院大学
论文地址:https://www.inforsec.org/wp/wp-content/uploads/2020/04/sec19-zheng_0.pdf
论文代码:https://github.com/zyw-200/FirmAFL
PPT下载:
https://www.inforsec.org/wp/wp-content/uploads/2020/04/fx-slides.pdf
1.论文背景
2020年物联网设备数量将全面超过全球人口,当前,黑客极容易利用物联网设备漏洞侵入物联网设备,构建大规模的僵尸网络 (比如Mirai, VPNFilter和Prowli)。因此在黑客发现物联网设备漏洞之前挖掘并修复是极其重要的任务。而模糊测试(FUZZ)是一种高效的漏洞挖掘技术手段,通过随机产生测试样例使系统或程序崩溃以发现安全漏洞。
模糊测试用于物联网设备固件漏洞挖掘面临两个挑战:(1)当前模糊测试工具大多针对的是通用平台程序和库,在测试物联网设备专用程序时面临底层硬件不支持或系统资源不符的问题。(2)全系统仿真可以保证物联网设备专用测试的正常执行环境,但在系统态仿真下进行模糊测试,存在执行性能低的问题(通用程序测试效率可到达上千次/s,而全系统下不到100次/s)。
2.增强进程仿真
论文首先分析了全系统仿真的性能瓶颈,主要包含系统调用、代码指令翻译、内存地址访问三个方面的性能瓶颈。在此基础上,论文提出系统态仿真与用户态仿真相结合的增强进程仿真架构(如图1),以提高固件程序执行效率,为后续与通用模糊测试引擎集成,提高物联网设备固件程序模糊测试的效率打下基础。
如图1所示,增强仿真架构的核心思想是结合QEMU的系统态仿真和用户态仿真,让普通指令的翻译和执行在QEMU用户态仿真下进行,而系统调用在系统态仿真下进行(能正确使用固件内核资源),既保证了系统态仿真的高兼容性,也保证了用户态仿真的高性能。为了实现系统态与用户态在迁移过程中内存状态的高效同步,论文提出内存映射共享技术。而为了实现双态迁移过程执行的准确性,论文提出系统调用重定向技术,保证系统调用准确地执行。
图1 增强进程仿真架构
1)内存映射共享技术:系统采用以内存页为单位对同一物理内存进行映射的方式完成用户态和系统态之间的内存共享。最开始由系统态完成固件系统的初始化和被测程序的启动,保证完整的程序执行环境,之后转由用户态执行。在用户态仿真下对某内存页进行第一次访问时,由于系统将用户态最初所有虚拟页与物理页解除映射,因而会产生段错误。接着用户态捕获该错误,并向系统态询问该虚拟页在系统态下对应的物理页,并在用户下进行映射。通过该方法有效避开系统态下有较大开销的内存访问管理,同时,相比于直接拷贝内存的方法,可以有效减少系统态与用户态仿真之间的内存状态同步的开销。在此基础上,为了进一步降低内存同步开销,系统将对代码页等进行灰盒测试前的预映射,避免每次测试过程需要重复映射这些内存页,进一步提高灰盒测试的吞吐率。
2)系统调用重定向技术:系统让用户态仿真完成用户态的代码翻译和执行,当遇到系统调用,将挂起用户态并将当前CPU状态传输给系统态。接着,系统态陷入内核执行系统调用,同时实时对执行的每一个代码块进行插桩分析。当程序PC从内核态回到用户态,且与触发系统调用时处在同一个线程中,表示系统调用已完成。此时,系统态将控制权交还给用户态。在此基础上,对于文件操作相关的系统调用,将固件中包含的文件目录直接在宿主机上进行配置,并对文件目录写操作,或对已存在文件的读写操作,用户态直接执行,而不交由系统态执行。
3.灰盒测试系统实现
图2:基于增强进程仿真的灰盒测试系统实现
在增强进程仿真的基础上,论文使用AFL作为灰盒测试引擎,用于产生测试输入。AFL是代码覆盖率导向的的灰盒模糊测试工具。其中,核心引擎Afl-fuzz会从测试样例队列中选择测试例,进行随机变异生成输入,并输入给测试程序。对于测试子进程的创建,AFL启动fork server,并由它在指定位置(通常是main函数)使用fork系统调用创建子进程进行测试,减少重新启动程序的开销,从而加速fuzz过程。对于代码覆盖信息的收集,AFL在QEMU中代码块结束位置进行插桩,将执行过的代码块PC进行编码并存入位图。
为了让AFL实现对增强进程仿真中IoT程序的测试,论文设计并实现了如图2所示的灰盒测试系统。在初始化过程中,系统将Firmadyne和DECAF两个工具与增强进程仿真架构结合。其中Firmadyne实现固件的硬件与系统支持,保证顺利启动IoT固件镜像。DECAF用于实时获取系统中所有进程的状态信息,保证可以检测到程序测试开始的位置。对于测试子进程的创建,在系统仿真与用户仿真端,采用copy-on-write 轻量级快照机制来存储被写的内存页,用于下一轮fuzz之后的状态恢复,取代fork系统调用创建子进程的方法。对于程序的输入注入,系统对网络相关的系统调用进行插桩并实现输入注入。对于代码覆盖信息的收集,由于系统仿真端只进行内存映射查找和系统调用执行,因此只在用户态下进行插桩收集。
4.系统效果
论文从系统透明性、高效性、系统优化能力、漏洞挖掘能力四个方面对系统进行了评估。
1)有效性评估:有效性的评估将本系统与系统态仿真进行比对,分析程序执行结果是否一致。若一致,则认为系统能够正确执行IoT程序。论文使用nbench通用测试集和120个 IoT HTTP程序进行评测,结果显示nbench能够正确输出结果,IoT HTTP程序的系统调用序列也与系统仿真下一致。
2)高效性评估:高效性的评估将本系统与用户态仿真进行对比,分析程序在增强进程仿真下执行是否高效。论文使用nbench(CPU性能测试集)与lmbench(系统调用性能测试集)进行评测。通过结果分析,由于nbench测试集的程序较为简单,其执行效率基本与用户态仿真下相同。对于lmbench,除了网络系统调用,其余系统调用的执行效率接近于用户态仿真。
3)系统优化能力评估:论文通过7个IoT程序,评估本系统是否有效解决系统调用(瓶颈1)、代码指令翻译(瓶颈2)、内存地址访问(瓶颈3)带来的性能瓶颈问题。图3为全系统仿真与增强进程仿真的比对结果。在增强进程仿真下,用户空间代码执行时间(绿条)和代码翻译时间(蓝条)有很大的缩减,成功解决瓶颈3与瓶颈2。图4为在增强进程仿真的基础上,部署选择性系统调用优化,文件操作相关的系统调用在用户态直接执行,系统调用时间(红条)有很大的缩减,成功解决瓶颈1。
图3:全系统仿真 vs 增强进程仿真
图4:增强进程仿真 vs 增强进程仿真 + 选择性系统调用优化
4)漏洞挖掘能力评估:论文在Firmadyne的固件数据集上测试,最终在表1所示固件中发现15个已知漏洞和两个未知漏洞。实验对每个固件进行10轮测试,并与全系统仿真进行对比,得到图10的结果(虚线为10轮结果的95%置信度的上下限,实线为中位数结果)。通过与系统态仿真第一次发现crash时间的中位数进行比较,漏洞发现的性能有平均3-13倍的提升。
表1:物联网设备固件漏洞信息
图5:发现crash数量(全系统仿真 vs 本系统)
5.总结
本论文分析全系统仿真的性能瓶颈所在,并提出增强进程仿真框架,利用系统态仿真的高兼容性与用户态仿真的高效性,提高IoT设备固件程序灰盒测试的性能。通过在Firmadyne等数据集进行评估,发现灰盒测试吞吐率相比于系统态仿真提高了3-13倍,且能有效发现设备固件的真实漏洞。
作者简介:
郑尧文,男,博士在读,本科毕业于四川大学,现就读于中国科学院信息工程研究所。主要研究方向为物联网安全、漏洞挖掘。