记录黑客技术中优秀的内容,传播黑客文化,分享黑客技术精华

浅谈固件Fuzz

2021-09-21 18:58

## 前言


当前,由于固件数量的爆炸性增长,以及相较于发展至今的桌面系统、移动手机系统,其安全性较为薄弱且不成熟。随着智能家居等一系列产品都逐渐开始“上网”,固件若不安全对于个人信息的泄露是十分具体且全面的,有些固件漏洞甚至可能影响到人身安全。因此,对于固件设备的漏洞挖掘研究是目前较为热门的研究方向。本文将从综述出发介绍当前固件 Fuzz 的研究现状,并介绍一个较为前沿的固件 Fuzz 实现方案。


## 固件 Fuzz 综述


发表于 2018 年顶会上的《What You Corrupt Is Not What You Crash: Challenges in Fuzzing Embedded Devices》文章[1]全面地分析了当前固件 Fuzz 所面临的一系列问题。


固件设备从操作系统层面大致可以分为三类:


1. 基于 Linux OS 的嵌入式设备

2. 自定义操作系统的嵌入式设备

3. 没有抽象操作系统的嵌入式设备


基于 Linux OS 的嵌入式设备一般是基于 Linux OS 进行改装,相较于桌面 Linux 系统,通常更为简约,例如我们熟知的 busybox 和 uClibc 都是属于这类操作系统。对于初次接触固件漏洞挖掘的读者往往接触的都是这类嵌入式设备,如大部分的摄像头、路由器。


自定义操作系统的嵌入式设备顾名思义,该种嵌入式设备使用由厂商自定义的操作系统,一般适用于计算能力低的设备。该种类型的设备可能不存在内存管理单元(MMU),不过内核和用户层仍然存在逻辑分离。例如 uClinux、ZephyrOS、VxWorks 都属于这种类型的设备。


没有抽象操作系统的嵌入式设备被称为 monolithic firmware,一般基于单个控制循环与来自外围设备的中断进行实现。该种类型的设备可以完全自定义或者基于操作系统库(如 Contiki、TinyOS、mbed OS 2)进行实现。编译后的代码系统空间和用户空间是混在一起的,不存在内核与用户层的逻辑分离。例如 CD reader、WiFi cards、GPS。虽然后面会讲对于该种类型的设备进行 Fuzz 是比较困难的,但是对该种类型的设备进行 Fuzz 似乎本来就比较少见,因为该种类型的设备代码量一般较小,只用逆向说不定都可以还原。


对嵌入式设备进行 Fuzz 主要有这么几个难点:


1. 错误检测

2. 性能和可扩展性

3. 插桩


Fuzz 一般基于错误检测机制进行。例如在 AFL 中,标记产生 crash 的种子为漏洞样本,其中产生 crash 这个机制是由操作系统提供的。而错误检测机制也成为了固件 Fuzz 面临的主要问题,因为嵌入式设备中很可能不存在错误检测机制,即使存在错误检测机制,监控嵌入式设备中的崩溃也可能很复杂。文章挑选了各种类型的嵌入式设备对两个存在漏洞的开源库进行测试,两个开源库分别为 mbed TLS(SSL 库),expat(XML解析器)。其测试结果如图所示:




Type-1/2/3 分别对应上面提到的三种类型的嵌入式设备。打勾的代表可以监测的,打叉的代表不能监测的,Late Crash表示发生了错误不会立即产生错误,运行一段时间后会产生问题,Hang表示挂起或者陷入死循环。从图片中可以看到,可以看到第二种类型和第三种类型的错误检测是很有问题的,尤其是第三种类型几乎不能进行错误检测。当然,平时接触的摄像头、路由器固件很可能不存在这些问题。


当然,有时候异常发生程序并不会立即崩溃,而是会继续运行一段时间后再崩溃,即程序继续执行但会陷入非预期的状态。虽然桌面级操作系统也存在这个问题但由于这些操作系统存在很多保护机制所以不太会发生这个问题,而嵌入式设备则通常欠缺相应的机制。上图中的感叹号其实就是陷入非预期的状态了,可以看到第一种类型的嵌入式设备感叹号都是Late crash,也就是说第一种类型的设备一般还是可以通过崩溃来进行错误反馈的,就是有些崩溃需要人为判断问题到底出在哪里。


性能和可扩展性不用多说,一般采用环境仿真的方法来进行 Fuzz,其中必然会带来性能问题。还有对于不同类型的嵌入式设备、不同指令集体系的可扩展性问题。


固件 Fuzz 一般无法获得源代码,需要进行动态插桩,然而,当前的静态插桩和动态插桩方案都不适用于第二种类型和第三种类型的嵌入式设备,需要自己对虚拟机仿真做出相应的调整。


由于第二种类型和第三种类型的嵌入式设备不具备或者匮乏错误检测机制,所以我们需要自己添加一些方法来检测错误,文章中列出了六种机制,这些机制合起来就可以检测程序中存在的错误,如图所示。同样的,需要自己对虚拟机仿真做出相应的调整。



这些机制都是已经有人做过的,并存在相应的论文和实现方式,感兴趣的读者可以去该篇文章原文相应段落查找每一种机制对应的论文。比如说检测堆溢出就可以监控堆的分配和释放来判断内存访问是否是一次合法的访问。当然,这些机制都是需要在仿真环境下实现的,因为直接在机器上跑的话这些机器是不具备错误检测机制的。


该篇文章主要针对的是所有嵌入式设备,对三种类型的嵌入式设备都做出了相应的分析。而我们平时接触的摄像头、路由器大部分都属于第一种类型的嵌入式设备,对其进行漏洞研究需要考虑的问题要少得多,其与 Linux OS 较为相似。接下来要介绍的固件 Fuzz 实现方案就是基于第一种类型的嵌入式设备进行讨论的。


## 固件 Fuzz 实现方案


发表于 2019 年顶会的《FIRM-AFL: High-Throughput Greybox Fuzzing of IoT Firmware via Augmented Process Emulation》[2]提出了一种提高固件 Fuzz 性能的方案,该方案在 github 上存在相应的[开源代码](https://github.com/zyw-200/FirmAFL)。


我们都知道,QEMU 存在两种运行模式,分别为用户模式和系统模式。用户模式仅模拟 CPU 的运行,而系统模式除了模拟 CPU 的运行,还要管理、模拟外围的设备。该文章通过实验评估说用户模式的执行速度大概比系统模式快了10倍。虽然用户模式运行速度更快,但是在不少情况下,仅用用户模式的 QEMU 是无法运行程序的。该文章的核心思路就是,把用户模式与系统模式相结合,用系统模式提供用户模式无法运行时的环境,将用户模式作为主要的运行状态来提高虚拟性能。


我们先来看看 AFL[3] 的整体架构:



AFL启动程序,在main函数的时候forkserver再次fork出真正运行程序子进程。这篇文章做的也差不多,先启动一个系统模式的实例,在某个特定点的时候,fork出大部分时间在运行程序的用户模式的实例。在特定点的地方保存快照,这样跑第二个测试用例的时候就不需要启动实例的开销了。



该图为 FirmAFL 的系统架构。首先,IOT 固件在系统模式的仿真环境下 boot,并在该仿真环境下启动各种需要的用户程序,当然也包括要 fuzz 的程序。当要 fuzz 的程序运行到某个特定点的时候(比如 main 函数的入口、接收数据包的函数入口),该进程的执行就切换到用户模式的仿真环境下执行以获得更高的性能。仅在某些比较罕见的场景,会将执行流切换回系统模式仿真环境下执行以保证执行的正确性。


为了最小化切换的开销,在两个模式的仿真环境下的内存状态被共享。具体地说就是系统模式仿真环境下的物理内存被分配为 memory-mapped file,也就是图中的 RAM File。这个 RAM File 也被映射到用户模式仿真环境的地址空间中。当在用户模式仿真环境下访问没有建立页面映射的页面时,就需要切换回系统模式仿真环境下执行来建立映射。


有了这个页面映射功能后,在用户模式仿真环境下运行的进程除了遇到 syscall 时就都能够正常运行了。直接在宿主机上(host)执行 IOT 固件的 syscall 显然是不可行的,因此需要把 syscall 切换到系统模式仿真环境下执行,当系统调用返回时,再把执行流切换回用户模式仿真环境下执行。


简单来说,系统模式的实例和用户模式的实例共享一些东西来进行同步,然后在用户模式需要的时候,比如系统调用、与外围设备交互,切换回系统模式的实例执行,并同步到用户模式的实例下,再切换回用户模式下继续执行。文章通过实验得出结论,使用这种方法的性能要比纯系统模式仿真的性能高8倍。感兴趣的读者可以到 github 上阅读实现源码。


## 参考文献


[1] Muench M, Stijohann J, Kargl F, et al. What You Corrupt Is Not What You Crash: Challenges in Fuzzing Embedded Devices[C]//NDSS. 2018.


[2] Zheng Y, Davanian A, Yin H, et al. FIRM-AFL: high-throughput greybox fuzzing of iot firmware via augmented process emulation[C]//28th {USENIX} Security Symposium ({USENIX} Security 19). 2019: 1099-1114.


[3] M. Zalewski. American fuzzy lop. http://lcamtuf.

coredump.cx/afl/.




知识来源: id=78d74b4a71384b1ef63e3cc51a9f3c93&source_url=https%3A%2F%2Fmp.weixin.qq.com%2Fs%2FIL-wIM8wePZL07l9YJnX_Q

阅读:72199 | 评论:0 | 标签:无

想收藏或者和大家分享这篇好文章→复制链接地址

“浅谈固件Fuzz”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

黑帝公告 📢

永久免费持续更新精选优质黑客技术文章Hackdig,帮你成为掌握黑客技术的英雄

广而告之 💖

标签云 ☁