白泽带你读论文|RSFUZZER

IoT 11个月前 admin
365 0 0

如需转载请注明出处,侵权必究。

论文题目:RSFUZZER: Discovering Deep SMI Handler Vulnerabilities in UEFI Firmware with Hybrid Fuzzing

发表会议:S&P 2023

本文是来自中国科学院信息工程研究所霍玮研究组投稿的最新研究RSFUZZER: Discovering Deep SMI Handler Vulnerabilities in UEFI Firmware with Hybrid Fuzzing,目前该工作发表于S&P 2023。

概述

系统管理模式(SMM)是UEFI固件上的一种安全操作模式,它为x86处理器提供了一种安全执行环境,以访问高度特权数据和控制底层硬件(例如电源管理)。SMM驱动程序在SMM中运行,并由系统管理中断(SMI)处理程序接收和处理外部数据。尽管SMM在操作系统受到威胁时可以提供额外的保护层,但SMM驱动程序中的漏洞(尤其是SMI处理程序)可能会导致保护机制失效,并对设备造成严重损害。因此,及早对SMM漏洞检测SMM漏洞对于确保UEFI固件的安全至关重要。

为了解决这些问题,本文提出了RSFUZZER,一种混合灰盒模糊测试技术。RSFUZZER能够学习输入接口和格式信息,并探测由调用多个SMI处理程序触发的深层隐藏漏洞。作者实现了叫做RSFUZZER的原型工具,并在六个供应商提供的16个UEFI固件映像上对其进行了评估实验。实验结果显示,相较于现有技术,RSFUZZER平均能够覆盖更多的基本块,覆盖率高出617%;并且能够检测到更多的漏洞,检测率高出828%。此外,作者在评估的UEFI固件映像中,发现并报告了65个0-day漏洞,其中14个漏洞获得了CVE编号。值得注意的是,这些0-day漏洞中有6个是在Intel的商业产品中发现的,而这些产品可能在发布之前经过了Intel官方混合模糊测试工具Excite的测试。这些结果证明RSFUZZER在提高UEFI固件安全性方面具有一定潜在的能力。

背景

相关工作现状

在过去的研究中,关于SMM驱动程序和SMI处理程序的漏洞检测技术主要集中在模糊测试方面。模糊测试是一种用于发现软件和固件漏洞的有效技术。模糊测试技术可以根据使用的程序内部信息的程度分为黑盒模糊测试、灰盒模糊测试和白盒模糊测试。在这三种技术中,灰盒模糊测试在实际应用中取得了平衡,具有高效和有效的特点。为了提高灰盒模糊测试对深层隐藏漏洞的发现能力,研究人员引入了符号执行技术,以帮助跨越程序分支约束。

然而,在应用现有的模糊测试技术进行SMI处理程序的检测时,存在一些挑战。现有的研究已经考虑了对SMI处理程序的模糊测试,但存在一些限制。例如,某些方法只处理单维输入空间(即内核空间程序和SMI处理程序之间的通信缓冲区),而忽略了SMI处理程序可能从硬编码的内存地址读取输入的情况。此外,现有方法在生成输入时没有考虑可能影响SMI处理程序执行的跨处理程序变量。此外,大多数SMI处理程序中的漏洞是静默损坏,而不是崩溃,这对于模糊测试工具来检测是具有挑战性的。

本文的挑战

在该问题中,存在五个挑战需要克服:

挑战1 需要考虑多样的输入接口。一些SMI处理程序需要从多个输入接口接收测试输入,包括CommBuffer和硬编码内存地址。这使得生成有效的测试输入变得更加复杂。

挑战2 需要满足复杂的输入格式限制。为了有效地测试SMI处理程序,测试输入需要满足特定的格式要求。如果不能正确地嵌入输入变量的内容,可能导致输入解析失败,无法充分测试使用了特定变量的处理程序。

挑战3 需要满足处理程序间的协同调用。触发某些漏洞需要多个SMI处理程序的参与。这些处理程序之间存在依赖关系,需要按照特定的顺序调用它们才能触发漏洞。

挑战4 (触发漏洞)需要满足路径约束。一些漏洞受到路径约束的保护,只有满足特定的路径条件才能触发漏洞。解决这些路径约束是检测漏洞的关键。

挑战5 需要具备感知静默损坏的能力。一些漏洞属于静默损坏,即不会导致处理程序崩溃。这种类型的漏洞很难通过监控崩溃来检测,需要采用其他方法来发现。

实例

白泽带你读论文|RSFUZZER

图1展示了一个任意写漏洞的实例代码片段。在代码的第18行,程序执行到此处时发生了漏洞。变量buffer的值由用户输入控制,因此攻击者可以将值0写入任意内存地址。下面对该实例和挑战的关系进行阐释。

为了对一个SMI处理程序进行模糊测试,首先需要确定其输入接口,以便提供测试输入。一个SMI处理程序可以有多个输入接口。例如,在图中的Handler1中有两个输入接口:CommBuffer变量和硬编码的内存地址0x40E。该现象对应挑战1,即尽管CommBuffer在UEFI中被正式指定为SMI处理程序与内核空间程序之间的通信通道,但实际上许多SMI处理程序也通过硬编码的内存地址从内核空间程序接收数据。

确定了输入接口后,就可以尝试生成测试输入。然而,为了有效地测试SMI处理程序,这些测试输入需要具有良好的结构。例如,变量buffer是从输入的CommBuffer中提取的结构体。该现象对应挑战2,即如果无法将buffer的内容正确地嵌入到为CommBuffer生成的测试输入中,由于输入解析失败,无法充分测试使用buffer变量的处理程序。

要触发漏洞并执行第18行的代码,需要调用Handler3并满足第16行和第17行的if条件。这些条件涉及到signature和buffer变量,它们的值分别在Handler1和Handler2中进行了初始化。因此,在触发漏洞之前,需要先调用Handler1和Handler2。该现象对应挑战3,即触发某些漏洞需要多个SMI处理程序的参与。由于signature和buffer在多个SMI处理程序中被使用,本文将它们称为跨处理程序变量。

在第18行之前,signature的值必须等于0x54768345。该现象对应挑战4,即一些漏洞受到路径约束的保护。

对于具有高于ring-1特权级别的程序来说,写入任意内存地址可能会导致程序崩溃,从而被模糊测试工具捕获。但是,SMI处理程序具有ring-2的特权级别,可以访问任何内存位置,即使有时它们不应该使用这种特权。因此,无论如何调整buffer的值,Handler3都不会在第18行崩溃。因此,模糊测试工具无法通过监控崩溃来检测到图中展示的漏洞。该现象对应挑战5,即一些漏洞只是静默损坏,不会导致SMI处理程序崩溃。

方法

威胁模型

在本文中,作者假设攻击者具有ring-0权限但没有ring-2权限,因此他们可以在物理上修改所有内存,但无法直接操作SMRAM(System Management RAM)。在这一点假设下,攻击者可以通过向CommBuffer输入可控内容来提供测试输入,并利用SMM handler(系统管理中断处理程序)的漏洞来实现权限提升和恶意攻击。


RSFUZZER流程

图2展示了RSFUZZER的概览。整体输入是UEFI固件镜像中的所有SMI处理程序,整体输出是能够触发UEFI固件中SMI处理程序崩溃的Proof-of-Concept (PoC)输入。RSFUZZER有两种模式:单处理程序模糊测试模式和跨处理程序模糊测试模式。

白泽带你读论文|RSFUZZER

RSFUZZER是一种用于UEFI固件镜像的模糊测试工具。它接收UEFI固件镜像中的所有SMI处理程序作为输入,并生成能够触发SMI处理程序崩溃的Proof-of-Concept (PoC)输入作为输出。RSFUZZER包含两种执行模式:单处理程序模糊测试模式和跨处理程序模糊测试模式。

在单处理程序模糊测试模式下,RSFUZZER选择一个SMI处理程序和一个种子,并通过测试用例来报告新的基本块覆盖率,将其保留为种子,并进行输入知识提取。同时,它记录SMI处理程序的变量处理行为并识别跨处理程序变量。

当在给定时间限制内没有发现新的基本块时,RSFUZZER切换到跨处理程序模糊测试模式。它搜索跨处理程序变量,获取与该变量相关的SMI处理程序队列,并生成相应的测试用例。RSFUZZER通过在单处理程序模糊测试模式和跨处理程序模糊测试模式之间切换,逐步学习输入格式和函数关系,以有效测试UEFI固件镜像中的SMI处理程序。


输入知识的提取

为了提取输入知识,RSFUZZER采取以下步骤,如图3所示:

白泽带你读论文|RSFUZZER


测试用例生成

RSFUZZER通过以下方法提取输入知识:

基于结构的种子生成策略。每当RSFUZZER获取到与输入格式相关的新知识时,它会根据相应的格式分配内存,并填充随机数据生成一个新的测试用例种子。

基于限制条件的测试用例突变策略。如果约束求解在一段时间内无法解出,RSFUZZER对与未触发的分支相关的变量进行突变,使其变异为与分支条件相同或略大、略小的值。如图4所示。

白泽带你读论文|RSFUZZER

基于污点的测试用例突变策略。由于SMI处理程序拥有ring-2级权限,对内存的污染很可能不会导致崩溃。为了解决这个问题,RSFUZZER在执行混合符号执行之前,分配了一块不可读、不可写、不可执行的Red Zone内存。在混合符号执行过程中,RSFUZZER会标记所有用户可控的内存指令为危险指令,并通过变异潜在的危险指令,使其指向Red Zone内存,从而触发崩溃。通过这些策略,RSFUZZER能够有效地提取输入知识,并在后续的测试用例生成和执行过程中应用。


跨处理程序知识提取

在跨处理程序知识的提取方面,RSFUZZER采取以下步骤:在单处理程序模糊测试模式下,RSFUZZER记录SMI处理程序的变量处理行为,并识别跨处理程序的变量。具体而言,RSFUZZER通过分析SMI处理程序的变量处理行为,确定其是某一特定跨处理程序变量的生产者还是消费者。为了识别跨处理程序变量,RSFUZZER考虑了跨处理程序代码段的三个特征:1. 跨处理程序代码段总是访问相同的内存位置;2. 至少有一个代码段可以对内存位置进行写操作;3. 跨处理程序变量可以在不同的SMI处理程序之间传递。通过分析指令执行轨迹,RSFUZZER能够确定内存访问指令中的变量是生产者还是消费者。


跨处理程序模糊测试模式的调度

在跨处理程序模糊测试模式的调度方面,RSFUZZER根据跨处理程序变量的生产者-消费者关系来安排SMI处理程序的执行顺序。为了确保跨处理程序变量在被另一个SMI处理程序消费之前先由一个SMI处理程序产生,RSFUZZER首先执行产生跨处理程序变量的SMI处理程序。然后,RSFUZZER以随机顺序执行消费者的SMI处理程序。通过这样的调度策略,RSFUZZER能够有效地进行跨处理程序的知识提取和模糊测试。

评估

有效性评估

为了评估RSFUZZER的有效性,作者在选取的数据集的UEFI固件镜像上运行RSFUZZER,以发现新的漏洞。对于所有测试的固件,RSFUZZER能够自动识别SMI处理程序的输入通道,并将模糊测试生成的输入数据提供给分析的SMI处理程序。总体而言,RSFUZZER发现了65个新漏洞,其中20个得到了相应供应商的确认。其中14个已被分配CVE号并由供应商修复,如表II所示。值得注意的是,许多固件镜像(特别是来自Intel、Dell、ASUS、AMD和Lenovo)已经被安全研究人员广泛研究和测试,并发现了许多漏洞。尽管如此,RSFUZZER仍能够发现大量新的漏洞,说明其在生成高度结构化输入并在复杂的健全性检查下推动模糊测试进入更深层次路径的能力。

白泽带你读论文|RSFUZZER

此外,表I展示了两类漏洞:(i)单处理程序漏洞,使用单处理程序知识提取模块检测到;(ii)跨处理程序漏洞,使用跨处理程序知识提取模块检测到。总体而言,RSFUZZER发现了58个单处理程序漏洞和7个跨处理程序漏洞,证明了其在检测两种类型漏洞方面的有效性。

白泽带你读论文|RSFUZZER

如表II所示,RSFUZZER发现了6类变量、不受信任的指针解引用和使用后释放等漏洞。其中,不正确的输入验证是最常见的漏洞类型。当SMI处理程序未能正确验证输入时,攻击者可以利用该漏洞并发起可能导致控制流改变、任意内存访问或任意代码执行的攻击。

此外,为了展示这些漏洞的实际安全影响,作者针对两个受影响设备成功创建了两个漏洞的POC(Proof of Concept),例如,一个内核空间程序成功获取了SMM权限并在SMRAM中运行任意代码,从而实现了恶意能力,如修改通常限制在SMM的SPI Flash内容,并执行永久的恶意攻击。由于本文无法获取所有受影响的设备,剩余漏洞的POC是使用本文的模拟器创建的,并确认了其他18个以前未知的漏洞也是可利用的。正如表II所示,对于所有确认的具有分配的CVSS v3评分的漏洞,报告漏洞的平均CVSS v3基础分数为7.7(供应商预留的CVE条目除外),说明报告漏洞的安全影响较高。


和基准对比

为了评估RSFUZZER生成的测试用例的性能,本文与Syzgen的模糊测试实验进行比较。本文跟踪了基本块覆盖率的增长趋势,并且图6展示了每个模糊测试工具生成的代码覆盖率情况。结果显示,RSFUZZER在所有固件镜像上以更快的速度覆盖了更多独特的基本块,因为RSFUZZER覆盖率的95%置信区间下界高于Syzgen覆盖率的95%置信区间上界。

具体来说,如图6所示,RSFUZZER在所有固件镜像的覆盖率方面优于Syzgen。根据Mann-Whitney U检验,所有p值都小于5.00e-2,表明RSFUZZER将基本块覆盖率提高了高达617%。在本文的设置中,Syzgen表现不佳,原因如下:1. 为了恢复嵌套对象,Syzgen追踪创建嵌套对象的内部API,但是在UEFI固件中,不存在从内核空间到SMRAM执行深层复制的API函数。2. Syzgen侧重于识别不同接口之间的返回值和参数关系。在独特漏洞方面,如图7所示,RSFUZZER检测到了总共65个独特漏洞,而Syzgen只检测到了7个,这意味着RSFUZZER在漏洞检测方面的提升达到了828%。作者对结果进行了手动分析,发现Syzgen和SPENDER找到的所有漏洞都能被RSFUZZER找到。总体而言,本文的结果显示,相较于Syzgen和SPENDER,RSFUZZER在检测更广泛的漏洞方面具有很好的效果。

白泽带你读论文|RSFUZZER
白泽带你读论文|RSFUZZER


知识提取模块评估

作者比较有无提取知识的RSFUZZER在漏洞和代码覆盖率上的差异来确认提取的知识对RSFUZZER的影响。对于不具有知识的模糊测试,作者移除了知识提取模块,只对输入数据进行随机变异。

表格III显示了独特基本块和漏洞的数量结果。在具有知识的模糊测试中,RSFUZZER发现了65个漏洞,而在不具有知识的模糊测试中只发现了6个漏洞。换句话说,知识提取模块帮助RSFUZZER比不具有知识的模糊测试发现的漏洞数量增加了983%。在代码覆盖率方面,具有知识的模糊测试比不具有知识的模糊测试提高了545%。这些结果强烈表明知识提取模块的有效性。

白泽带你读论文|RSFUZZER

为了进一步评估输入格式知识和跨处理程序知识对漏洞检测的贡献,本文分析了检测到的漏洞与这两种知识之间的关系。如表IV所示,对于涉及复杂输入格式的漏洞,输入格式推断是必要的。提取跨处理程序知识对于调度SMI处理程序和检测跨处理程序漏洞也很重要。

白泽带你读论文|RSFUZZER

总结

RSFUZZER是一种用于检测系统管理模式(SMM)漏洞的混合灰盒模糊测试技术。它学习输入接口和格式信息,并发现多个SMM处理程序调用中的深层隐藏漏洞。通过在16个UEFI固件映像上的评估实验,实验结果显示,相较于现有技术,RSFUZZER平均能够覆盖更多的基本块,覆盖率高出617%;并且能够检测到更多的漏洞,检测率高出828%。此外,它还发现了65个0-day漏洞,其中14个获得了CVE编号。这些结果证明RSFUZZER在提高UEFI固件安全性方面具有一定潜在的能力。

供稿:高卜凡

审稿:彭诗言、邬梦莹、洪赓

排版:边顾

戳“阅读原文”即可查看论文原文哦~

复旦白泽战队

一个有情怀的安全团队

还没有关注复旦白泽战队?

公众号、知乎、微博搜索:复旦白泽战队也能找到我们哦~

原文始发于微信公众号(复旦白泽战队):白泽带你读论文|RSFUZZER

版权声明:admin 发表于 2023年6月14日 下午5:38。
转载请注明:白泽带你读论文|RSFUZZER | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...