今天为大家带来的是来自USENIX Security 2024的论文A Friend’s Eye is A Good Mirror: Synthesizing MCU Peripheral Models from Peripheral Drivers,由东南大学凌振研究组、德雷塞尔大学张悦研究组、马萨诸塞大学Xinwen Fu研究组共同投稿。
研究背景
随着物联网的快速发展,嵌入式设备被广泛应用于智能家居和工业物联网等领域。微控制器单元(MCU)是嵌入式设备的重要组成部分,MCU上运行的固件直接与硬件交互,控制着设备的运行,保障MCU固件的安全性十分必要。然而,MCU硬件异构性强,MCU固件对硬件耦合度高,对MCU固件进行安全分析困难重重。
为此,研究者们提出了固件托管(firmware rehosting)技术,通过为固件提供虚拟执行环境实现对固件的安全分析。然而,现有的技术如Laelaps、P2IM、Emu和Fuzzware大多是固件导向的,这些技术的目的是为了增大固件的覆盖率而寻找最合适的外设寄存器取值,而非真实地模拟外设硬件。SEmu是第一个致力于自动化模拟真实硬件的工作,其通过NLP技术自动化地从硬件手册中推断硬件行为并据此对硬件进行模拟。然而,SEmu需要使用者人工在硬件规范文档中定位相关的外设行为描述,并且由于技术限制,无法从硬件手册中提取出较为完善的硬件行为已进行固件模拟,在实际应用中有诸多限制。
设计思路
本文观察到,硬件通常需要相应的硬件驱动程序,以便固件可以访问和使用硬件,而这些硬件驱动程序包含了对底层硬件行为的假设(本文称之为software belief)。基于这一观察,本文提出从硬件驱动程序中提取外设模型。由于驱动程序必须遵守底层硬件才能正常运行,从驱动程序中推断出的硬件模型具有较强的通用性和真实度。据此,本文设计并实现了一套从外设驱动代码中推断外设硬件模型的系统Perry,其基本步骤如下图所示:
预处理:Perry接受硬件元数据(CPU型号、内存布局、中断向量表初始地址)和驱动程序源代码作为输入。Perry从硬件元数据中解析要分析的外设的名称和地址范围。在将驱动程序源代码编译为LLVM bitcode时,Perry提供了一个Clang插件以自动收集三种类型的源码级信息供后续分析使用:循环头位置、成功返回值和外设结构体名称。
Trace收集:Perry对驱动程序进行符号执行,并在执行过程中收集外设访问的trace。驱动程序通常由若干API构成,因此,Perry首先根据硬件元数据对MMIO区域进行映射、符号化和污点标记,然后从驱动程序中识别出顶层API作为符号执行的入口,最后为每个API准备好符号执行的上下文(参数和全局变量),并对data buffer类型数据的进行污点标记,以及对回调函数进行hook。在符号执行过程中,Perry通过主动跳出循环来避免路径爆炸,并通过checkpoint来移除阻碍了符号执行的硬件相关的局部约束。
模型推断:Perry随后利用收集到的驱动程序中的外设访问trace进行外设模型推断。本文首先提出了4种常见的software belief,Perry能够基于trace对这些software belief进行自动识别,并将其转化为外设硬件行为。对于更为复杂的software belief(如DMA),Perry提供了一套按需分析机制使得分析人员能够高效地对分析过程进行引导。
模型综合:Perry使用了一种基于模板的综合方法,能够基于推断出的外设硬件行为自动地生成硬件模型代码。这些代码可以直接被集成到现有的模拟器(例如QEMU)中,最终实现对MCU硬件的自动化模拟。
实验评估
Perry基于Clang/LLVM,KLEE和Z3实现,支持ARM Cortex-M系列的MCU,包含了约19K行的C++和Python代码。Perry从来自ST、NXP和Microchip的10套驱动程序中自动化地为30余款MCU生成了硬件模型,在此基础上,本文对Perry进行了如下评估:
性能:对于大部分驱动程序,Perry可以在较短的时间内(33分钟)生成MCU硬件模型。对于较为复杂的驱动程序,Perry则需要较长的时间(约9个小时)。
一致性:本文使用P2IM提供的66个单元测试验证生成的硬件模型是否与实际硬件具有一致的行为。经过实验,由Perry自动生成的硬件模型在没有人工干预的情况下通过了74.24%的单元测试,然而,由于未能从手册中推断出与时钟相关的外设行为,本文的最大竞争对手SEmu在没有人工干预的情况下则无法通过任何单元测试。通过对有问题的硬件模型进行修复(约6行代码),Perry成功通过了所有的单元测试。
通用性:本文使用生成的硬件模型对29个固件进行了模拟,并在没有人工干预的情况下成功模拟了20个固件。通过进一步的检查,被成功模拟的固件可以正常地与外界环境进行交互,并执行预期的功能逻辑。
可扩展性:本文共使用了约35行代码来修复所有有问题的硬件模型,并且每个硬件模型至多仅需4行代码即可完成修复(详情见Table 3的最后一行和Table 4的最后一列)。
安全应用
本文还通过三个案例阐释了Perry可能的安全应用:
挖掘驱动程序中的硬件违规bug:在生成硬件模型时,Perry通过从驱动程序中推断硬件行为,本文将这些推断的硬件行为与硬件手册进行比较,以验证驱动程序的实现是否符合硬件规范。我们对从STM32Cube和MCUXpresso驱动程序推断出的硬件行为进行手动检查,并成功识别出两个硬件违规bug。我们将这两个bug报告给了相应的供应商,并得到了承认与修复。
复现固件漏洞:本文选取了Zephyr蓝牙协议栈中的两个漏洞(CVE-2022-1041和CVE-2022-1042)进行复现。这两个漏洞均需要通过外设注入恶意的报文进行触发,基于Perry生成的硬件模型,本文能够成功地复现这些漏洞。
对RTOS进行模糊测试:本文基于Perry生成的硬件模型为LiteOS实现了一套基于QEMU的模糊测试系统,并成功触发了10个漏洞,其中7个是0-day漏洞。
本项目已经开源:https://github.com/VoodooChild99/perry
投稿作者介绍:
雷重庆,东南大学计算机科学与技术专业博士生,导师为凌振教授,主要研究兴趣为系统与软件安全、程序分析,相关研究成果发表于NDSS和USENIX Security。