基于错误场景生成的物联网固件漏洞挖掘方法及系统
技术领域
本发明涉及物联网安全技术领域,尤其涉及一种基于错误场景生成的物联网固件漏洞挖掘方法及系统。
背景技术
随着物联网技术发展的不断推进,各种物联网设备已经广泛应用于行政、商业和金融等领域中。智能摄像头、路由器、智能门锁等各类物联网设备在日常生活中发挥着越来越重要的作用。然而,最近的研究和现实中的攻击事件表明在物联网设备给我们的生活带来便利的同时,物联网生态系统的安全现状令人担忧。由于缺乏有效的方法来对安全性弱的物联网设备进行监督,我们在日常生活中正时刻面临前所未有的安全威胁。攻击者通过利用物联网设备的漏洞,实现了对自动驾驶汽车的远程控制、对智能摄像头监控画面的偷窥、对智能存储设备中用户隐私数据的窃取等严重危害公共安全的攻击,对个人、家庭、社会、乃至国家的安全造成了严重的威胁。
为了对各个领域中部署的物联网设备进行监督,缓解易受攻击的物联网设备带来的日益增长的安全问题,研究人员提出了各种监督和检测系统以用于挖掘物联网固件中的漏洞。这些检测系统有的通过使用污点分析、符号执行、图匹配等静态分析方法来检测物联网设备固件潜在的漏洞。然而,由于静态分析存在无法精确处理别名和间接调用等固有缺陷,这些基于静态分析的方法的检测结果可能非常不准确。相比之下,以模糊测试为代表的动态分析方法的检测结果是精确的。为了动态测试固件,最近的方法通常通过在模拟的执行环境中运行物联网固件,然后利用概念验证(PoC)或模糊测试的方法来测试物联网固件。学术界和工业界都广泛使用模糊测试技术来监督和检测物联网固件中的关键漏洞,并已经发现了一些有严重危害的安全漏洞。攻击者可以利用这些漏洞对物联网设备实施拒绝服务攻击甚至劫持物联网设备。
尽管动态检测系统在监督物联网设备安全方面已经起到了一定的效果,但它们在测试固件方面仍然有很大的限制:它们无法有效地监督和测试物联网中的错误处理代码。然而,检测错误处理代码中存在的漏洞是非常重要的。由于复杂的硬件依赖性以及有限的硬件和系统资源,物联网设备在运行过程中需要处理各类运行时错误,例如内存分配故障等。因此,在可能影响安全性或可靠性的错误发生时,就需要错误处理代码来处理运行时错误;如果错误处理代码存在漏洞,则预期的保护就会无效。其次,由于错误处理代码在动态测试时很难被覆盖到,错误处理代码本身容易出错甚至存在漏洞。我们的实证分析表明,物联网固件中超过28%的补丁与错误处理中的更新相关。我们相信,在物联网固件的错误处理代码中隐藏了更多未知的漏洞,因为大多数已知的漏洞仍然是通过手动分析发现的。第三,虽然在正常执行中很少触发错误处理代码,但其中的漏洞与正常代码中的漏洞同样重要。已经有研究证明攻击者可以故意地触发错误以利用错误处理代码中的漏洞。因此,对物联网固件的错误处理代码进行全面、有效的测试,以发现隐藏的漏洞是必要和关键的。
为了覆盖错误路径,研究人员采用了错误注入技术,错误注入技术有意地生成运行时错误以强制执行错误路径。错误注入是测试错误处理代码的有效策略,因为许多运行时错误,如硬件故障、内存分配故障等,与标准输入无关,在正常执行过程中很少发生;传统的基于变异或生成标准输入的模糊测试方法,无法有效地触发错误,更无法有效地测试错误处理代码。
虽然故障注入已经被应用于现有的测试技术中,但是设计一个有效的故障注入解决方案来监督和测试物联网固件中的错误处理代码仍然面临以下挑战:(1)识别潜在的运行时错误。首先,由于复杂的硬件依赖和执行环境,在不同的物联网设备中可能会出现大量不同的运行时错误。手动识别所有错误是不切实际的。其次,物联网固件的通常都是闭源的,这使得在没有源码的情况下识别潜在错误变得更加困难。(2)深度误差路径测试。被测物联网固件的执行路径可能包含各种错误点,错误处理代码经常会终止固件程序的执行;如果早期的错误导致了固件程序执行的终止,动态测试将无法覆盖深层错误路径。(3)测试效率的提高。由于错误处理代码导致的频繁程序终止也降低了物联网固件动态测试的效率,因为测试系统必须频繁地重新启动程序甚至重启设备以进行下一次动态测试。
物联网固件中的错误处理代码是关键而有缺陷的,而且目前还没有监督和分析物联网错误处理代码的有效方法,测试物联网固件中的错误处理代码对于检测物联网中隐藏的漏洞是重要和必要的。
发明内容
本发明提供了一种基于错误场景生成的物联网固件漏洞挖掘方法,该方法是能够对物联网二进制固件进行高效安全监督。
具体技术方案如下:
一种基于错误场景生成的物联网固件漏洞挖掘方法,包括如下步骤:
(1)收集物联网设备的多个版本的固件,对待测固件进行预处理,形成大规模的固件仓库;
(2)对固件仓库中的待测试固件,采用二进制固件安全薄弱点定位方法识别出与偶发异常事件相关的函数,定位待测固件中的待测试点;
(3)根据所述的待测试点,动态地生成测试样例;
(4)在物联网设备中运行待测固件,根据测试样例进行动态地错误注入以触发待测试点,并动态监测是否有crash出现;若发生crash,则记录当前测试样例的信息和运行时的信息;
(5)当前测试样例测试完成后,根据测试结果动态地生成新的测试样例;
(6)在待测固件的整个生命周期中,在物联网设备之上循环进行步骤(4)-(5),迭代地产生不重复的测试样例并进行测试;
(7)最终将测试过程中记录的疑似漏洞信息转化为便于人工分析的形式,辅助漏洞确认和分析。
本发明的基于错误场景生成的物联网固件漏洞挖掘方法适用于监督目的。
步骤(1)中,对待测固件进行预处理包括:
(1-1)利用解包工具对待测固件进行解包,获取待测固件中的程序;
(1-2)对获取的待测固件中的程序进行反汇编并进行静态分析,以确定程序中是否含有循环;若程序中有循环,则记录循环的起始地址;
(1-3)将远程访问程序插入到待测固件的程序中以获得待测固件的调试接口,并修改待测固件程序的自动启动脚本,使远程访问程序在待测固件启动时使用自定义的身份验证密钥自动启动;
(1-4)将自定义的库加载器插入到待测固件的程序中,以使其支持调试功能;
(1-5)将错误场景生成器和监视器放入待测固件的程序中。
步骤(2)包括:
(2-1)通过静态分析,在闭源的二进制固件中识别出频繁被检查的函数返回值;
(2-2)通过分析所述的函数返回值在函数中的返回条件,识别出与偶发异常事件相关的函数;
(2-3)将与偶发异常事件相关的函数作为待测固件的待测试点。
在待测试点处,通过hook技术控制函数的返回值,主动触发错误处理代码的执行。
步骤(2)的核心是自动化地二进制固件安全薄弱点定位方法。基于经验的,偶发异常事件处理代码作为软件代码中的关键部分,由于模糊测试等常规动态测试方法难以对其进行有效检测,其中经常包含难以发现的安全漏洞。因此,在本发明中,以偶发异常事件的处理代码作为待检测的安全薄弱点。
步骤(2-2)中,通过以下方法识别与偶发异常事件相关的函数:
检查返回条件中的变量类型来判断返回条件是否与标准输入无关;若返回条件的变量类型与标准输入相关,则该返回条件为依赖输入,否则该返回条件为,输入无关;若函数中的返回条件与输入无关,则该函数为与偶发异常事件相关的函数。
步骤(2-3)中,所述的待测试点即为错误函数调用点。
步骤(3)包括:
(3-1)定位待测试点,根据约束选择错误注入点;
(3-2)基于上下文的错误场景高效生成方法动态地生成测试样例。
所述的测试样例即为错误场景。
步骤(3-1)中,所述的约束包括:
约束一:在一个错误场景中,错误注入点的数量(即产生的错误的总数量)不大于一个事先规定的阈值;
约束二:在一个错误场景中,第一个错误注入点与最后一个错误注入点之间的错误函数调用点数量不大于一个事先规定的阈值;所述的错误函数为与偶发异常事件相关的函数。
步骤(3-2)包括:
(3-2a)在测试过程中,记录错误注入点的状态,包括该错误注入点的调用栈和前序错误序列;
(3-2b)在待测固件程序崩溃时记录导致其崩溃的错误注入点的状态,形成崩溃日志;
(3-2c)在一错误注入点上生成运行错误之前,先检查当前错误注入点是否在崩溃日志中;若是,则进一步检查当前错误注入点的状态是否与崩溃日志中的状态相同,若当前错误注入点及其状态出现在崩溃日志中,则避免在该错误注入点注入错误。
步骤(3)的核心是基于上下文的错误场景高效生成方法。基于经验的,如果一个在特定上下文中的错误注入点触发了crash,那么之后同一个错误注入点在相同的上下文中依然大概率会触发相同的crash。而在测试中反复触发相同的crash是无助于找的新的漏洞的,因此触发相同的crash实际是降低了测试的效率。同时,如果测试过程中始终在同一个位置触发crash,将无法对更深层次的错误处理代码进行测试。因此,为了提高测试效率和覆盖更深层次的错误处理代码,本发明提出了基于上下文的错误场景生成方法。
步骤(4)包括:
(4-1)在多个物联网设备中运行物联网固件以构建测试环境,将待测固件的程序分配到测试环境中进行并发测试;
(4-2)在测试过程中,若待测固件的程序运行到循环的起始地址,则在起始地址处复刻(fork)一个新的进程;
(4-3)在复刻新的进程之后,生成新的测试样例,对新的进程进行测试;
(4-4)在测试过程中监控进程总数,若进程数量达到事先规定的阈值,则将最早复刻产生的进程结束;
(4-5)在测试过程中,若发现程序崩溃,则记录导致崩溃发生的错误注入点的状态,形成崩溃日志;
(4-6)在完成一定时间的测试后,对崩溃日志进行分析,识别待测固件的漏洞。
步骤(4)的核心是免于重启固件的动态测试方法,该方法首先定位固件服务程序的循环起始点,然后在该点fork产生新程序,这样不但可以避免服务程序崩溃导致的设备重启,还可以提高并发性,有助于提高测试效率。
基于同样的发明构思,本发明还提供了一种基于错误场景生成的物联网固件漏洞挖掘系统,包括:
固件预处理模块,对待测固件的程序进行提取并进行预处理;
错误函数识别模块,采用二进制固件安全薄弱点定位方法识别出待测固件的程序中与偶发异常事件相关的函数,定位待测固件中的待测试点;
错误场景生成模块,根据所述的待测试点,动态地生成测试样例;
动态分析模块,在待测固件运行的全生命周期中,根据测试样例触发安全薄弱点代码的执行,以测试其中是否包含疑似漏洞,同时动态监测漏洞表征。
与现有技术相比,本发明的有益效果为:
在本发明给出了一个物联网固件漏洞挖掘系统,提出了基于错误场景生成的物联网固件漏洞挖掘技术,解决了物联网固件错误处理代码高效测试问题,能够有效发现真实物联网固件中存在的漏洞,具有实用性;本发明给出了基于二进制的自动化错误函数识别方法,为闭源的物联网固件错误函数识别与定位提供了一种有效的方法,为测试物联网固件错误处理代码提供了依据;本发明给出了基于状态感知的有界错误场景生成方法,解决了物联网固件错误处理代码测试中的错误场景爆炸和嵌套错误路径覆盖问题。这种方法有效的提高了错误路径的覆盖率,有助于发现深度错误路径中的漏洞;本发明给出了无重启错误循环检测技术,有效地避免了错误处理代码测试导致的频繁崩溃带来的频繁重启问题,提高了测试效率。
附图说明
图1为基于错误场景生成的物联网固件漏洞挖掘系统的整体模块结构示意图;
图2为基于错误场景生成的物联网固件漏洞挖掘方法的流程示意图;
图3为固件预处理方法示意图;
图4为自动化的二进制固件安全薄弱点定位方法示意图;
图5为基于上下文的错误场景高效生成方法示意图;
图6为免于重启固件的动态测试方法示意图。
具体实施方式
下面结合附图和实施例对本发明作进一步详细描述,需要指出的是,以下所述实施例旨在便于对本发明的理解,而对其不起任何限定作用。
如图1所示,本发明基于错误场景生成的物联网固件漏洞挖掘系统,包括:固件预处理模块、错误函数识别模块、错误场景生成模块以及动态分析模块。
整个物联网固件漏洞挖掘系统的工作流程如图2所示,包括以下步骤:
(1)收集各种类型智能设备各个版本的固件,并通过固件解包等技术对待分析的固件进行预处理,形成大规模的固件仓库;
(2)对固件仓库中的每一个固件,采用固件二进制分析技术自动化提取待测试点信息;
(3)测试样例生成模块根据测试点信息,生成初始化测试样例;
(4)在物联网设备中运行待测固件,并根据测试样例进行动态的错误注入,以触发待测试点,并动态监测是否有crash等情况出现。在发生crash时记录测试样例信息和运行时信息;
(5)一个测试样例测试完成后,根据测试结果动态的生成新的测试样例;
(6)在固件的整个生命周期中,在物联网设备之上循环进行(4)-(5),迭代的产生不重复的测试样例并进行测试;
(7)最终将测试过程中记录的疑似漏洞信息自动化转化为便于人工分析的形式,辅助漏洞确认和分析。
步骤(2)的核心是自动化的二进制固件安全薄弱点定位方法。基于经验的,偶发异常事件处理代码作为软件代码中的关键部分,由于模糊测试等常规动态测试方法难以对其进行有效检测,其中经常包含难以发现的安全漏洞。因此,在本发明中,我们将偶发异常事件的处理代码作为待检测的安全薄弱点,主要包括:
(2-1)固件安全薄弱点定位技术通过静态分析,首先在闭源的二进制固件中识别出频繁被检查的函数返回值;
(2-2)然后通过分析这些在返回值在函数中的返回条件,识别出跟偶发异常事件相关的函数;
(2-3)最终将识别出的目标函数作为安全薄弱点的入口,通过hook技术控制函数的返回值,主动触发错误处理代码的执行。
步骤(3)的核心是基于上下文的错误场景高效生成方法。基于经验的,如果一个在特定上下文中的错误注入点触发了crash,那么之后同一个错误注入点在相同的上下文中依然大概率会触发相同的crash。而在测试中反复触发相同的crash是不能帮助我们找的新的漏洞的,因此触发相同的crash实际是降低了测试的效率。同时,如果测试过程中始终在同一个位置触发crash,那么我们将无法对更深层次的错误处理代码进行测试。因此,为了提高测试效率和覆盖更深层次的错误处理代码,我们提出了基于上下文的错误场景生成方法,主要包括:
(3-1)首先在测试过程中记录错误注入点的调用栈和前序错误序列,并将它们作为一个错误注入点的上下文;
(3-2)当发现某个上下文中的错误注入点已知能够触发crash时,本技术将避免在后续的测试之中再次在该点注入错误。
步骤(4)的核心是免于重启固件的动态测试方法,该方法首先定位固件服务程序的循环起始点,然后在该点fork产生新程序,这样不但可以避免服务程序崩溃导致的设备重启,还可以提高并发性,有助于提高测试效率。
以下通过各个模块分别进行说明。
1、固件预处理模块
对于待分析的固件,本发明首先采用固件解包技术完成固件文件系统提取、识别固件的体系结构等预处理准备工作,具体流程如图3所示,过程如下:
(1)利用binwalk等解包工具对固件镜像进行解包,以获取每个固件中的程序。
(2)通过程序逆向技术对固件程序进行反汇编,利用IDA等工具对反汇编得到的代码进行静态分析,以确定固件程序中是否含有循环,如果有循环,则记录循环开始的程序地址,以供后续动态分析时无重启错误循环测试方法使用。
(3)启用测试固件的调试接口。与向用户提供完整交互和调试接口的PC不同,物联网设备的业界实践标准要求剥离或禁用调试接口。因此,为了获得调试接口以进行后续的测试,我们将telnet等远程访问程序插入到提取的文件系统中。同时,我们修改了文件系统中的自动启动脚本,使telnet服务在固件启动时使用自定义的身份验证密钥自动启动。之后,我们可以通过插入的工具和身份验证密钥来操作固件。
(4)将自定义的库加载器插入到提取的文件系统中,以支持调试功能,例如LD_PRELOAD以支持库函数的hook。
(5)将错误场景生成器和运行时监视器放入提取的文件系统中。
2、错误函数识别模块
采用二进制固件安全薄弱点定位技术识别出跟偶发异常事件相关的函数,为后续测试错误处理代码提供基础支撑。如图4所示,过程如下:
(1)识别自定义错误返回值。首先对测试固件的汇编代码进行静态分析,提取所有函数的返回值。直观地说,如果返回的值是一个错误返回值,那么在调用者使用它之前应该检查它。因此,我们检查调用者是否检查了返回值,以推断返回值是否是错误返回值。
(2)在获得固件中所有潜在的错误返回值后,我们进一步对可能返回错误的函数进行反向分析,以找到错误返回的条件。
(3)通过检查条件中变量的类型来检查条件是否与标准输入无关。例如,如果变量与标准输入(如文件描述符)相关,则我们将此条件报告为依赖输入。相反的,如果变量与标准输入不相关(如由内存分配、设备分配生成的指针),则我们将此条件报告为输入无关。如果函数中的条件与输入无关,则将此函数被报告为潜在的错误函数。
3、错误场景生成模块
通过定制的测试样例生成策略,根据固件二进制分析模块的分析结果,动态地生成测试样例。如图5所示,过程如下:
(1)根据识别得到的错误函数,定位物联网固件中的错误函数调用点。
(2)在动态测试开始之前,在以下两个约束范围内选择本次测试的错误注入点,即注入错误的错误函数调用点:
(a)约束一:在一个错误场景中,错误注入点的数量,即产生的错误的总数量,不大于一个事先规定的阈值;
(b)约束二:在一个错误场景中,第一个错误注入点与最后一个错误注入点之间的错误函数调用点数量不大于一个事先规定的阈值。
(3)在静态的选择了错误点之后,在测试过程中,记录错误注入点的状态,包括错误注入点的调用栈和其先前的错误序列。
(4)在固件程序崩溃时记录导致崩溃的错误注入点的状态,形成崩溃日志。
(5)在错误注入点上生成运行时错误之前,首先检查此错误注入点是否在崩溃日志中;如果是,则进一步检查当前错误注入点的状态是否与崩溃日志中的状态相同。若当前错误注入点及其状态出现在崩溃日志中,则避免在此错误注入点生成错误。
4、动态分析模块
运行在真实的智能设备中,并在固件运行的全生命周期中根据测试样例触发安全薄弱点代码的执行,以测试其中是否包含疑似漏洞,同时动态监测漏洞表征。如图6所示,过程如下:
(1)在多个模拟器和物理设备中运行物联网固件以构建测试环境。然后将固件程序分配到这些环境中进行并发测试。
(2)在测试固件程序时,若程序运行到了步骤固件预处理模块所定位和记录的循环起始地址,则在此处fork一个新的进程。
(3)在fork产生新的进程之后,生成新的测试样例,即错误场景,对新的进程进行测试。
(4)在测试过程中监控进程总数,若进程数量达到事先规定的阈值,则将最早fork产生的进程结束。
(5)在测试过程中若发现固件程序崩溃,则记录导致崩溃发生的错误注入点的状态,形成崩溃日志。
(6)在完成一定时间的测试后,对崩溃日志进行分析,识别固件漏洞。
以上所述的实施例对本发明的技术方案和有益效果进行了详细说明,应理解的是以上所述仅为本发明的具体实施例,并不用于限制本发明,凡在本发明的原则范围内所做的任何修改、补充和等同替换等,均应包含在本发明的保护范围之内。