0 引言
随着物联网技术的飞速发展,嵌入式设备在人类生产生活中起着越来越重要的作用,嵌入式设备安全也与个人乃至国家信息安全息息相关。根据IOT ANALYTICS的数据预测
[1],2027年全球连接到物联网的嵌入式设备数量将达到300亿。然而大部分嵌入式设备厂商为了节省成本,在开发过程中不会引入必要的安全机制,也未采取第三方代码审计等措施,致使当前大量嵌入式设备的安全防护能力低下,针对此类设备的攻击面不断扩大。根据CNVD披露的嵌入式设备漏洞数量统计显示
[2](如
图1所示),近年来,在网络设备、物联网终端、工业控制系统等嵌入式设备中存在大量的漏洞,严重威胁了嵌入式系统的安全。
为了快速发现嵌入式系统中的安全问题,研究人员已经提出了多种分析技术。其中动态分析技术的自动化程度高且误报率低,是一种高效的安全分析技术。然而,嵌入式设备体积功耗小,计算资源有限,无法在设备上直接应用大型的动态分析工具或长时间运行分析任务。对此,研究人员提出了固件系统仿真技术,通过对外围设备进行各种形式的建模,或为外设寄存器分配预定义的通用访问模型,并以此响应固件中的外设访问,尽可能地还原固件在真实硬件上的运行状态,实现固件的仿真运行。
为了减少系统仿真环境构建中的人工工作,进一步提高外设模型的保真度,利用信息检索及生成式人工智能的检索增强生成(Retrieval-Augmented Generation, RAG)技术构建仿真环境。检索增强生成技术,通过从可用数据库中检索相关对象来增强大语言模型生成内容的准确性和鲁棒性。基于该技术,所提方法可在无法获取硬件设备的情况下,对芯片数据手册信息进行提取和分析,快速构建高保真度的全系统仿真环境,提升固件安全分析的效率。
1 固件系统仿真研究现状
固件系统仿真通常需要对嵌入式系统的外围设备进行建模,并以此响应固件中的外设访问,实现固件的仿真运行。根据外设模型构建方法的不同,现有技术可分为基于硬件在环的固件系统仿真、基于寄存器模式匹配的固件系统仿真、基于抽象层函数替换的固件系统仿真,以及基于自然语言处理的固件系统仿真。
1.1 基于硬件在环的固件系统仿真
PRETENDER
[3]通过跟踪固件对内存映射(Memory-Mapped I/O, MMIO)区域的访问并将其转发到真实的物理设备中来收集硬件的响应数据,基于响应数据为识别出的外设训练模型。Conware
[4]使用相同的外设转发机制收集固件与外设的交互记录,在模型生成阶段首先将交互记录转化为有向无环图,然后根据有向无环图生成对应外设的自动机,以此响应固件中的外设访问。文献[
5]提出了自动映射,用于解决外设寄存器存在的隐式内存映射(无需微控制器干预值的更新)问题。该方法使用差分硬件内存自检技术来自动地发现外设寄存器之间的隐式内存映射。在固件读写外设寄存器时,自动映射将读写请求转发到真实的设备上,不断检查读写前后的硬件内存变化,获取隐式内存映射。此类方法通过将外设访问转发到真实物理设备获取精确的外设响应,生成外设模型具有较高的保真度,但需要获取硬件设备,限制了其使用场景。
1.2 基于寄存器模式匹配的固件系统仿真
P2IM
[6]定义了固件在访问处理器—外设接口时可接受输入的通用模式和约定,并将抽象的模型具体化,形成通用的寄存器访问模型。在分析过程中,基于固件的行为模式为寄存器匹配控制寄存器、状态寄存器、数据寄存器及控制&状态寄存器模型,以此响应固件中的外设访问。DICE
[7]在P2IM的基础上,通过识别直接内存存取(Direct Memory Access, DMA)输入通道的创建、访问和处理,监控所有的DMA数据传输,使其在不使用实际外设硬件或不了解DMA控制器内部工作机制的情况下,完成对DMA设备的仿真。此类方法,通过为固件执行过程中访问的寄存器分配预定义的通用访问模型响应外设访问,无需硬件设备的参与,具有较好的适用性。但预定义模型的保真度较低,无法处理复杂的外设行为。
1.3 基于抽象层函数替换的固件系统仿真
Firmadyne
[8]是第一个大规模的网络设备自动化动态分析系统,其中包括了嵌入式网络设备的固件仿真。在仿真过程中,Firmadyne通过自定义用户空间函数库来劫持系统对非易失性随机访问存储器(Non-volatile Random Access Memory, NVRAM)相关函数的调用,实现固件正常运行。HALucinator
[9]将每个抽象层函数的功能分解为编码的硬件抽象层(Hardware Abstraction Layer, HAL)函数语义,外设类型以及外设通用功能的处理程序,通过库匹配定位HAL函数地址。当固件调用这些库函数时,HALucinator实际上运行对应的简单外设模型,以抽象的方式实现库函数的功能。Para-rehosting
[10]抽象并实现了一个使用可移植操作系统接口的便携式为控制单元(Micro Control Unit, MCU),对MCU核的常用功能进行建模。针对外设特定逻辑,Para-rehosting提出基于HAL的外设功能替换技术,将硬件的功能替换为主机中的具有相同功能的后端驱动,实现MCU软件的移植。此类方法将硬件抽象层函数替换为简单的外设模型代码,以绕过或满足固件内部检查机制,具有较好的适用性,但实现复杂多样的抽象层函数替换需要较多人工工作。
1.4 基于自然语言处理的固件系统仿真
SEmu
[11]在自然语言处理阶段,首先提取寄存器内存映射表中的寄存器名作为初始命名实体集,递归搜索数据手册中包含命名实体的句子,每当在句子中发现新的命名实体,就将其加入到命名实体集合中,直到命名实体集合不再变化。使用Stanford CoreNLP Natural Language Processing Toolkit
[12]对搜索出的包含命名实体的句子进行语法分析,提取出对应的条件—行为规则,当固件访问外设时使用已经提取出的条件—行为规则进行外设响应。SEmu使用类似μEmu
[13]的无效状态指导,如果固件执行进入了无效状态,就说明提取出的条件—行为规则存在缺失或错误,使用符号执行技术求解出进入无效状态前的最后一个分支,依据该分支访问的外设寄存器地址倒序排列与该寄存器相关的条件—行为规则,人工对规则进行修改。该方法基于外设寄存器行为的自然语言描述生成符合硬件行为的状态转换规则,响应固件中的外设访问。该方法无需硬件支持,生成的外设模型保真度较高,但此方法依赖芯片数据手册中的外设行为描述。
2 系统设计
为了减少仿真环境构建过程中的人工工作并提高仿真环境的保真度,本文提出一种基于检索增强生成的固件系统仿真技术,通过收集数据手册中与仿真环境构建相关的自然语言描述形成知识库,构建检索增强生成系统,进而生成外围设备模型代码,综合模板代码生成QEMU
[14]虚拟机器。系统主要分为3个模块:预处理模块、检索增强生成模块和代码生成模块。系统整体架构如
图2所示。
2.1 预处理模块
预处理的目的是获取系统仿真环境构建所必需的信息,并去除手册中对固件仿真无用的信息。因此,需要确定数据手册中的哪些信息对于仿真环境的构建是必须的,并进行数据的提取。数据手册预处理阶段需要提取的信息以及对应的功能如
表1所示。
表格是芯片数据手册中的重要数据,与内存映射相关的信息通常使用表格的形式展示。为了提取PDF中的表格,同样采用光学字符识别(Optical Character Recognition, OCR)技术,通过识别表格的边框线对表格进行定位并将其中的数据表示为列表。本文根据表格的表头,即列表的第1行数据将分布在多个页面的同一表格合并。如果连续两个列表的第1行数据(即表头)相同,则将第2个列表中的元素附到第1个列表之后,最终得到以列表表示的表格数据,提取出的表格数据如
图3所示。
文本是芯片数据手册中的另一种重要数据,外围设备的部分自然语言描述以文本的形式展示。为了获取外围设备的自然语言描述,需要从PDF中外围设备的章节提取文本。首先定位到包含外围设备信息的章节,对其中的页面进行处理,使用光学字符识别OCR技术识别出页面中的文本后,根据文本元素的缩进信息将整个页面的字符串分块,提取出包含外围设备描述信息的文本块。
2.2 检索增强生成模块
检索增强生成是一种在自然语言处理中使用的模型架构,它将信息检索和文本生成两个过程结合起来,以提高生成式任务的性能。RAG模型的核心思想是在生成文本时,利用从外部知识库或语料库中检索到的相关文本来辅助生成过程。这使得模型能够更准确地理解输入的上下文,并生成更加相关和有意义的文本。同时,由于检索过程可以在离线阶段进行,因此在实际应用时,检索增强生成模型通常能够保持较快的响应速度。
为了更加高效地生成合乎行为规则的外设模型,基于数据手册预处理阶段提取出的原始表格和文本数据构建向量知识库,用于外设模型的检索增强生成。数据手册中文本和表格混合的半结构化数据对传统的检索增强生成来说具有挑战性,主要存在以下原因:1)文本分割可能会破坏表格,破坏检索时的数据;2)嵌入的表格可能会对语义相似性搜索构成挑战。因此,使用多向量检索器来存储原始表格文本数据以及更适合检索的表格文本概要。首先,对上一节预处理过程中提取出的原始表格和文本数据生成概要;其次使用字典类型数据存储原始表格和文本;使用向量存储文本嵌入后的概要;最后将这两种数据传入多向量检索器形成知识库。
2.3 代码生成模块
为了综合生成快速仿真器(Quick EMulator, QEMU)虚拟机器仿真运行目标固件,对QEMU虚拟机器代码进行了抽象,如
图4所示,可分为QEMU机器模板代码、QEMU外设模板代码和QEMU外设行为代码。其中,QEMU机器模板代码包括MCU的初始化及注册代码,其格式较为固定,故本节的重点为外设代码的生成。
基于检索增强生成技术,外设代码生成可分为两个阶段:
图4中左侧的外设模板代码生成及右侧的外设行为代码生成。外设模板代码生成指的是通过大模型的归纳综合能力,自动地生成格式相对固定的外设模板代码;外设行为代码生成主要针对外设寄存器中的隐式内存映射,基于大模型的信息抽取能力,查找外设寄存器之间存在隐式内存映射的字段并给出合理的模型代码编写建议,辅助人工编写条件语句内的外设行为代码,提高外设模型代码编写和固件系统仿真的效率。
2.3.1 外设模板代码生成
外设模板中除了必要的头文件引用代码外,还包括具有固定格式的用于外设寄存器复位、外设寄存器读写、外围设备初始化及注册等一系列函数。除了外设寄存器读写函数中条件语句需要针对特定寄存器的行为代码外,其余大部分代码在不同外围设备内结构相同,函数及关键字的名称不同。外围设备中可自动生成的模板代码及所需的信息如
表2所示。借助这些信息,可以自动化地生成外设模板代码。
2.3.2 外设行为代码生成
寄存器中的隐式内存映射
[5]会使条件语句判断错误,导致固件异常退出或进入死循环等待正确的外设寄存器响应。因此,外设读写函数中寄存器行为代码,除了按照读写操作从外设寄存器中读取值或往外设寄存器中写入值,还需要额外的逻辑确保相关寄存器的值随着读写目标寄存器的值变化。
图5展示了MK66F中一个典型的具有隐式内存映射的例子。MEMORY[0x40064000]表示多用途时钟发生器MCG中的第1个控制寄存器C1,由反编译代码可知灰色代码行将MCG_C1的高两位清零。MCG_C1第7-6比特的描述如
图6所示,这两位表示MCG输出时钟源的选择,当为b“00”时代表输出时钟为FLL或PLLCS(取决于PLLS这一控制位);当为b“01”时代表输出时钟为内部引用时钟;当为b“10”时代表输出时钟为外部引用时钟。
灰色代码执行后,CLKS域清零,此时时钟源为FLL或PLLCS。接着下方while循环检查MCG_S寄存器的CLKST域,如果不为b“11”,程序进入死循环。由
图7中CLKST域的自然语言描述可知,CLKS域与CLKST域之间存在隐式内存映射,当写MCG_C1寄存器时,MCG_S中的CLKST域随写入的值变化。
由
图6中CLKS域的自然语言描述可知,CLKST的值除了与CLKS域相关,还与MCG_C6域的值相关,CLKS域的值为b“00”时分两种情况。如
图8所示,当PLLS域的值为1时,PLLCS为PLL源,当为0时FLL为PLL源,对应CLKST域中的b“00”和b“11”。由此可归纳出,MCG外设模型代码中的一个条件语句如
图9所示。
借助知识库中的外设信息原始数据,大模型可以抽取其中存在隐式内存映射的寄存器域,并总结出寄存器域之间的映射关系,开发人员无需对手册进行复杂的理解即可编写生成外设行为代码。
3 实验与评估
为了评估本文提出方法的有效性,本节将从以下几个方面进行评估。1)提出的预处理方法能否提取必要原始数据并减少对无用数据的收集。2)多向量检索知识库能否快速响应目标寄存器的检索需求。3)生成的外设模型能否正确模拟真实的硬件设备,使固件在仿真环境中正常运行。
3.1 数据手册预处理
为了评估提取出的原始数据的质量以及提出的方法能否减少对无用数据的收集,根据MK66F数据手册中MMIO内存映射表,提取出了38个外围设备以及系统内存映射信息。结果表明,本文采用的光学字符识别技术能够正确识别并提取出原始PDF中的表格及文本块数据。经过预处理后,MK66F数据手册中的字符由3 325 109个降为了2 118 998个,去除了无用的章节和数据,初步对知识库中的知识进行了清洗,提升了PDF处理的效率。
3.2 知识库评估
为了评估生成的知识库能否根据关键词返回概要和原始数据,本节基于原始数据生成向量知识库。其中使用ID根据概要获取原始数据,基于文本相似度对原始数据概要进行搜索。生成的向量数据库能够根据给出的提示词查找概要内的有关内存映射的内容,并返回ID用于匹配原始数据,根据ID获取的原始数据包含表格和文本数据,满足了多向量检索器快速响应关键词检索的需求。
3.3 外设模型评估
为了评估生成的外设模型能否正确模拟真实的硬件设备,基于本文提出的方法生成了MK66F中19个外设模型,其中包括字符设备、通用输入/输出口(General Purpose Input Output, GPIO)、数模转换器、时钟发生器、定时器、载波调制器、振荡器、看门狗等。以Laelaps
[15]中的NXP_FRDM-K66F ADC固件为例,其指令位图如
图10所示。该图将执行的指令地址转化为地址空间中的位图色块,用以表示程序的执行轨迹。其中:橙色的轨迹代表Laelaps中该固件的指令执行轨迹;蓝色代表该固件在本文所构建仿真环境中的指令执行轨迹;紫色代表两种仿真环境中指令执行轨迹的重叠部分。图中:■符号代表固件板级初始化函数执行完毕;●符号代表系统配置完成,进入主功能循环。可以看出,图中存在较多额外的蓝色路径,其中包括多种外设状态检查代码。说明相较基于符号执行的固件托管技术Laelaps,本方法构建的系统仿真环境可以触发更多的功能代码,提升了仿真环境的交互性和程序的覆盖率。
4 结束语
提出了一种基于检索增强生成的嵌入式设备固件系统仿真技术,以较低门槛快速构建高保真度的系统仿真环境,为固件的动态分析技术提供分析基础。针对现有系统仿真技术所需人工工作较多的问题,通过对数据手册的预处理,构建了高效的检索增强生成系统,通过代码生成模块为QEMU虚拟机器生成了外设模板代码以及外设行为代码,实现了QEMU虚拟机器的快速构建。基于提出的方法成功生成了19个外设模型,并仿真运行了目标固件,减少了系统仿真环境构建过程中的人工工作。
目前所提方法在生成外设行为代码的过程中,仍然需要部分人工参与。在下一步工作中,拟基于隐式内存映射的自然语言描述和对应的人工代码,对代码生成大模型进行微调,进而实现直接生成符合硬件行为描述的外设行为代码,进一步提高仿真环境构建效率。