掌桥专利:专业的专利平台
掌桥专利
首页

实时操作系统的模糊测试方法、装置和计算机设备

文献发布时间:2023-06-19 19:38:38


实时操作系统的模糊测试方法、装置和计算机设备

技术领域

本申请涉及系统测试技术领域,特别是涉及一种实时操作系统的模糊测试方法、装置、计算机设备、存储介质和计算机程序产品。

背景技术

随着物联网技术的发展,各种实时操作系统(Real Time Operating System,简称RTOS)也应运而生,例如新能源汽车、路由器、交换机、打印机等都运行着大量实时操作系统,以此应对各类对实时性要求较高的功能任务。由于万物互联的大趋势,大量的实时操作系统被有意或者无意的暴露到互联网环境中,使得他们可以被外部访问,但他们的安全性却未得到有效的测试,这也造成了各类安全事件频发,从近年来针对打印机、交换机、新能源汽车的各类攻击都涉及到实时操作系统的安全性问题就可见其危害性。

传统技术中,工业领域针对实时操作系统及其中各类任务的安全性测试主要是在真实硬件中进行。这样一方面增加了测试难度,在安全测试前必须调试好硬件状态使其能够完全正常工作;同时也增加了调试的难度,例如程序的实时运行状态以及出现错误时的状态都无法实时捕获,从而无法获取任意时刻硬件(如寄存器及内存)状态以及程序运行调用栈。导致对于程序异常行为及业务逻辑的调试都相对困难。另一方面这类测试方法效率较低,通过硬件特殊通讯信道(例如蓝牙,WiFi,NFC(Near Field Communication,近场通信)等)发送和接收消息数据会受到信道通讯逻辑及信道数据传输能力的限制,在测试业务逻辑安全前的信道链接建立等前置阶段也会消耗大量的测试时间。

因此,传统的在真实硬件中对实时操作系统进行测试存在测试难度大、效率低的问题。

发明内容

基于此,有必要针对上述在真实硬件中对实时操作系统进行测试存在测试难度大、效率低的技术问题,提供一种实时操作系统的模糊测试方法、装置、计算机设备、计算机可读存储介质和计算机程序产品。

第一方面,本申请提供了一种实时操作系统的模糊测试方法。所述方法包括:

根据待测试实时操作系统创建模拟器,并确定测试关键点;

通过所述模拟器运行所述待测试实时操作系统,获取所述待测试实时操作系统运行过程中的内存状态;

基于所述测试关键点执行目标测试任务,获取执行结果;

根据所述内存状态和所述执行结果生成所述待测试实时操作系统的测试结果。

在其中一个实施例中,所述确定测试关键点,包括:根据所述待测试实时操作系统识别对应的函数信息;根据所述函数信息生成与所述目标测试任务对应的函数调用关系图;根据所述函数调用关系图以及预设的测试数据,确定所述目标测试任务的测试开始点和测试结束点;将所述测试开始点和所述测试结束点作为所述测试关键点。

在其中一个实施例中,所述函数信息包括函数名和函数体;所述根据所述函数信息生成与所述目标测试任务对应的函数调用关系图,包括:根据所述函数名和函数体,识别各类任务,根据所述各类任务确定上层任务集合;根据所述函数名和函数体,识别所述目标测试任务的函数集合,通过控制流分析法为所述函数集合中各函数生成上层调用关系图;根据所述上层调用关系图和所述上层任务集合生成与所述目标测试任务对应的所述函数调用关系图。

在其中一个实施例中,所述根据所述函数调用关系图以及预设的测试数据,确定所述目标测试任务的测试开始点和测试结束点,包括:根据所述函数调用关系图以及预设的测试数据,通过追踪方式定位所述测试数据被写入的内存位置以及所在函数,将定位的内存位置及所在函数确定为所述测试开始点;通过所述函数调用关系图识别循环跳转点和任务退出点,根据所述循环跳转点和所述任务退出点确定所述测试结束点。

在其中一个实施例中,所述基于所述测试关键点执行目标测试任务,获取执行结果,包括:在所述测试开始点加载与所述目标测试任务对应的测试数据的生成及写入逻辑和模糊测试处理逻辑,并在所述测试结束点加载所述模糊测试处理逻辑;当所述待测试实时操作系统运行到所述测试开始点时,根据所述生成及写入逻辑生成并填充所述测试数据,进入所述模糊测试处理逻辑;当所述待测试实时操作系统运行到所述测试结束点时,执行所述模糊测试处理逻辑,并获取执行结果。

在其中一个实施例中,所述通过所述模拟器运行所述待测试实时操作系统,获取所述待测试实时操作系统运行过程中的内存状态,包括:获取配置的内存监控策略;在所述模拟器运行所述待测试实时操作系统的过程中,运行所述内存监控策略,并获取运行结果;根据所述运行结果确定所述待测试实时操作系统运行过程中的内存状态。

在其中一个实施例中,所述根据待测试实时操作系统创建模拟器,包括:根据所述待测试实时操作系统识别对应的函数信息和使用的外部设备;根据所述函数信息确定所述待测试实时操作系统的运行起始点以及各程序段的加载地址;根据所述程序段的加载地址将所述程序段映射到预先分配的第一虚拟内存空间;将预先分配的所述外部设备的第二虚拟内存空间初始化为虚拟设备;根据各程序段的加载地址、映射的第一虚拟内存空间、所述虚拟设备以及所述待测试实时操作系统的运行起始点,生成模拟器。

第二方面,本申请还提供了一种实时操作系统的模糊测试装置。所述装置包括:

模拟器创建模块,用于根据待测试实时操作系统创建模拟器,并确定测试关键点;

内存状态获取模块,用于通过所述模拟器运行所述待测试实时操作系统,获取所述待测试实时操作系统运行过程中的内存状态;

测试执行模块,用于基于所述测试关键点执行目标测试任务,获取执行结果;

测试结果生成模块,用于根据所述内存状态和所述执行结果生成所述待测试实时操作系统的测试结果。

第三方面,本申请还提供了一种计算机设备。所述计算机设备包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现如上第一方面所述方法的步骤。

第四方面,本申请还提供了一种计算机可读存储介质。所述计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现如上第一方面所述方法的步骤。

第五方面,本申请还提供了一种计算机程序产品。所述计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现如上第一方面所述方法的步骤。

上述实时操作系统的模糊测试方法、装置、计算机设备、存储介质和计算机程序产品,根据待测试实时操作系统创建模拟器,并确定测试关键点,通过模拟器运行待测试实时操作系统,获取待测试实时操作系统运行过程中的内存状态,基于测试关键点执行目标测试任务,获取执行结果,并根据内存状态和执行结果生成待测试实时操作系统的测试结果。由于本实施例是基于虚拟硬件即模拟器对待测试实时操作系统进行全系统模拟的模糊测试,相对于传统技术在真实硬件中对实时操作系统进行测试而言,能够有效降低测试难度,提高测试效率。

附图说明

图1为一个实施例中实时操作系统的模糊测试方法的流程示意图;

图2为一个实施例中创建模拟器步骤的流程示意图;

图3为一个实施例中确定测试关键点步骤的流程示意图;

图4为一个实施例中获取内存状态步骤的流程示意图;

图5为一个实施例中获取执行结果步骤的流程示意图;

图6为一个实施例中实时操作系统的模糊测试装置的结构框图;

图7为一个实施例中计算机设备的内部结构图。

具体实施方式

为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。

由于传统的在真实硬件中对实时操作系统进行测试存在测试难度大、效率低的问题。又由于实时操作系统不同于Windows等桌面级系统,例如Vxworks(一种实时操作系统)、FreeRTOS(一种面向微控制器和小型微处理器的实时操作系统)等实时操作系统大都没有内存监控和异常检测逻辑,这导致动态测试时无法依赖系统或硬件功能对内存异常等漏洞进行有效的检测,从而降低了目前基于真实设备的动态测试的有效性。

基于以上问题,目前工业和学术研究领域对实时操作系统的安全性分析主要依赖于代码静态扫描的方法,或者是对于局部代码的定向分析方法。这类分析方法由于缺失了系统和任务代码运行时的完整上下文(系统运行时不同任务会共享大量的全局变量,单纯的静态分析无法系统地对全局变量的初始化操作,以及各任务对全局变量的设置),从而还会导致误报较高,影响测试的准确性。

基于此,本申请实施例提供了一种实时操作系统的模糊测试方法,本实施例以该方法应用于终端进行举例说明,可以理解的是,该方法也可以应用于服务器,还可以应用于包括终端和服务器的系统,并通过终端和服务器的交互实现。本实施例中,如图1所示,该方法可以包括以下步骤:

步骤102,根据待测试实时操作系统创建模拟器,并确定测试关键点。

其中,实时操作系统是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统做出快速响应,调度一切可利用的资源完成实时任务,并控制所有实时任务协调一致运行的操作系统,其具有及时响应和高可靠性的特点。待测试实时操作系统则是指将要进行测试的实时操作系统,通常为保证实时操作系统的性能,在上线使用前都会进行一系列的测试。

模拟器可以是采用硬件虚拟化技术模拟的对待测试实时操作系统进行测试的虚拟硬件,通过该虚拟硬件运行待测试实时操作系统,可以对待测试实时操作系统的内存访问行为、变量使用行为等进行监控,从而实现对待测试实时操作系统的测试。测试关键点可以是测试过程中的关键因素,其对测试流程的运行起决定性作用。具体地,测试关键点可以是测试开始点和测试结束点。

在本实施例中,终端可以根据待测试实时操作系统的源代码或通过逆向分析的方法,基于指令粒度模拟并创建模拟器,以得到对待测试实时操作系统进行测试的虚拟硬件。终端还可以根据待测试实时操作系统的源代码或通过逆向分析的方法,识别并确定测试关键点,从而提高测试效率及准确度。

步骤104,通过模拟器运行待测试实时操作系统,获取待测试实时操作系统运行过程中的内存状态。

其中,内存状态包括但不限于待测试实时操作系统运行过程中的内存访问行为、变量使用行为等行为状态。具体地,终端通过上述步骤创建模拟器后,则可以通过模拟器运行待测试实时操作系统,并获取待测试实时操作系统运行过程中的内存状态,以对待测试实时操作系统的内存状态进行监控,从而弥补传统技术中不支持对实时操作系统的内存状态进行检测的功能缺陷。

步骤106,基于测试关键点执行目标测试任务,获取执行结果。

其中,目标测试任务是指为达成某一测试目标而制定的测试任务,体现测试方案、方法、技术和策略,其内容包括测试目标、测试环境、输入数据、测试步骤、预期结果、测试脚本等。执行结果则是指执行目标测试任务后得到的实际结果,通常,基于实际结果与预期结果的比较可以知晓该待测试实时操作系统是否存在异常或问题。在本实施例中,终端可以根据测试关键点执行目标测试任务,并获取对应的执行结果。

步骤108,根据内存状态和执行结果生成待测试实时操作系统的测试结果。

其中,测试结果则可以是运行待测试实时操作系统并执行目标测试任务后输出的对待测试实时操作系统的评价性结果。具体地,终端可以根据上述得到的内存状态和执行结果而生成待测试实时操作系统的测试结果,从而帮助测试人员发现并验证系统的异常或问题,有利于提高系统性能。

上述实时操作系统的模糊测试方法中,终端根据待测试实时操作系统创建模拟器,并确定测试关键点,通过模拟器运行待测试实时操作系统,获取待测试实时操作系统运行过程中的内存状态,基于测试关键点执行目标测试任务,获取执行结果,并根据内存状态和执行结果生成待测试实时操作系统的测试结果。由于本实施例是基于虚拟硬件即模拟器对待测试实时操作系统进行全系统模拟的模糊测试,相对于传统技术在真实硬件中对实时操作系统进行测试而言,能够有效降低测试难度,提高测试效率。

在一个实施例中,如图2所示,在步骤102中,根据待测试实时操作系统创建模拟器,具体可以包括:

步骤202,根据待测试实时操作系统识别对应的函数信息和使用的外部设备。

其中,函数信息包括但不限于待测试实时操作系统中的函数名或函数体。外部设备则是待测试实时操作系统运行过程中,中断触发或处理逻辑等所依赖的外部硬件设备,例如时钟中断设备等。

在本实施例中,终端可以根据待测试实时操作系统的源代码或通过逆向分析的方法,而识别系统内部的函数信息,以及识别系统所依赖的外部设备。

步骤204,根据函数信息确定待测试实时操作系统的运行起始点以及各程序段的加载地址。

其中,程序段是基于待测试实时操作系统的源代码而确定的各个程序段。运行起始点则是指待测试实时操作系统运行时的开始点。

具体地,终端可以根据上述识别的函数信息,从待测试实时操作系统中提取运行起始点。通常基于不同架构的实时操作系统的固件都有确定运行起始点的对应方法,例如可以确定Reset_Handler(重置处理器)函数的起始地址,作为待测试实时操作系统的运行起始点。同时,终端还可以获取待测试实时操作系统的固件中不同程序段(例如text段等)的加载地址,即程序段的放置地址,在存储媒介中的可执行文件的偏移地址。

步骤206,根据程序段的加载地址将程序段映射到预先分配的第一虚拟内存空间。

其中,第一虚拟内存空间是预先为程序段分配的虚拟内存空间。在本实施例中,终端根据程序段的加载地址,可以为其分配第一虚拟内存空间,进而将各个不同程序段按照加载地址映射到对应的虚拟内存中,从而实现对各个程序段的内存映射。

步骤208,将预先分配的外部设备的第二虚拟内存空间初始化为虚拟设备。

其中,第二虚拟内存空间是预先为外部设备分配的虚拟内存空间。虚拟设备则是与硬件相对应的一种软件应用。在本实施例中,对于上述识别的待测试实时操作系统所依赖的外部设备,终端可以按照各架构的要求将对应的第二虚拟内存空间初始化为虚拟设备,从而当模拟执行涉及到该虚拟设备对应的内存空间时会触发对应的中断并触发预设值的处理逻辑,以实现相应硬件的功能。

具体地,对于待测试实时操作系统所依赖的外部设备,可以针对外部设备的类型进行针对性的处理和模拟,在保证系统正常运行的前提下最小化模拟外部设备所需的人工成本,同时尽可能完整的模拟外部设备的功能逻辑。

例如,对于实时操作系统运行时对其进行状态判断的外部设备(比如判断某类外部设备是否存在或者是否就绪),系统对这类外部设备寄存器的使用特征表现为不断请求对应外部设备状态寄存器的某些比特位的数值,若不满足约束条件,则继续循环直到外部设备状态变为满足约束的值。在真实环境下,这些比特位的设置都是外部设备完成初始化或存在时会自行设置、或者由其他共享外部设备的系统进行设置,而在模拟中,由于难以在准确的节点进行这些非显性(如实时操作系统的固件中没有对应的指令来完成操作时)的状态设置操作,所以对应外部设备寄存器的值始终不会变化,若不进行处理,则系统的运行将阻塞在这些操作循环中。对于这类外部设备,可以通过分析其状态判断对应的指令序列的特征并通过对固件的静态分析进行全局检索,从而找到所有类似的操作,并提取各循环判断处状态寄存器需要满足的数值,并在固件运行到对应位置时将数值填入到对应外部设备的状态寄存器中,以实现虚拟设备的初始化。

在一种场景下,对于操作逻辑相对复杂,完整的按照系统对外部设备的操作指令进行模拟将无法实现操作逻辑,例如对FlexSPI(一种控制接口)的操作本身并不是固件代码完成,而是在调用API(Application Programming Interface,应用程序编程接口)时由外部设备硬件完成对应操作。同时系统对这些外部设备的操作通常还伴随着状态信息的记录和维护,如果只模拟外部设备行为而不维护外部设备的状态信息,会导致系统对外部设备的操作因为缺乏历史操作记录信息状态而出错。因此,对这类外部设备可以既模拟其行为,同时也维护每次行为过后的状态信息。针对这种外部设备进行模拟的方案一般包括两种,其中,第一种是通过直接模拟底层对外部设备的操作接口。例如FlexSPI外设的FLEXSPI_TransferBlocking函数(即阻塞传输函数),通过对函数的参数进行读取来进行FLASH设备的擦除、写入等操作。这种操作相当于在对外部设备操作的API和模拟外部设备之间建立了行为映射层,将操作的结果直接作用于外部设备对应的内存空间和寄存器中。第二种是通过在第一种的基础框架中添加对应的基础外部设备,同时为该外部设备添加状态信息维护和各类MMIO(Memory-mapped I/O,即内存映射)操作的模拟,在系统固件访问对应的内存空间时,触发其MMIO操作,MMIO操作中会对状态信息和外设行为进行模拟。

在一种场景下,对于数据传输类的外部设备,例如FlexCAN(一种扩展了CAN总线功能的嵌入式网络架构)等涉及网络数据传输的外部设备,如果直接模拟系统的操作指令序列将无法触发对应的网络发包等真实的数据传输操作,也就导致模拟器的功能会缺失。为了解决这类问题,可以在对应设备初始化阶段创建对应的真实数据流通道进行绑定(例如VCAN或其他数据通道),当虚拟设备调用数据发送或者接收指令时触发真实数据通道的操作,从而将数据通过真实通道进行转发,以更加真实的模拟系统固件的功能逻辑。

步骤210,根据各程序段的加载地址、映射的第一虚拟内存空间、虚拟设备以及待测试实时操作系统的运行起始点,生成模拟器。

具体地,终端根据各程序段的加载地址、映射的第一虚拟内存空间、虚拟设备以及待测试实时操作系统的运行起始点,可以模拟实时操作系统的CPU行为和系统中断功能,还可以模拟系统的核心逻辑,从而生成对应的模拟器。

上述实施例中,终端根据待测试实时操作系统识别对应的函数信息和使用的外部设备,根据函数信息确定待测试实时操作系统的运行起始点以及各程序段的加载地址,并根据程序段的加载地址将程序段映射到预先分配的第一虚拟内存空间,将预先分配的外部设备的第二虚拟内存空间初始化为虚拟设备,进而根据各程序段的加载地址、映射的第一虚拟内存空间、虚拟设备以及待测试实时操作系统的运行起始点,生成模拟器。从而实现在无对应硬件设备支持的情况下构建虚拟硬件,不仅节省了测试成本,而且降低了测试难度。

在一个实施例中,如图3所示,在步骤102中,确定测试关键点,具体可以包括:

步骤302,根据待测试实时操作系统识别对应的函数信息。

其中,函数信息包括但不限于待测试实时操作系统中的函数名或函数体。具体地,终端针对待测试实时操作系统的二进制程序,可以使用逆向分析的方法识别出对应的函数信息。

步骤304,根据函数信息生成与目标测试任务对应的函数调用关系图。

其中,函数调用关系图是基于执行目标测试任务时各函数之间的调用关系而得到的函数的树形图。在本实施例中,终端可以根据上述识别的函数信息而生成与目标测试任务对应的函数调用关系图。

具体地,终端根据上述识别的函数信息,如函数名和函数体,并基于系统中任务相关逻辑接口可以进一步识别各类任务,具体可以基于系统固件的逻辑采用针对性的方法进行识别,例如待测试实时操作系统中会通过createTask(一种创建任务的方式)等显性的方式创建任务。进而根据识别的各类任务确定上层任务集合即TaskSet。

终端还可以根据上述识别的函数名和函数体,识别目标测试任务的函数集合。例如,可以基于字符串局部匹配的方法,如通过“CAN”或者“CanIf”等字符串进行匹配,由于该类字符串与使用的SDK(Software Development Kit,软件开发工具包)或者系统固件开发人员的函数命名策略相关,因此可以识别出与目标测试任务相关的函数集合即FuncSet。进而可以通过控制流分析法为函数集合中的各函数生成上层调用关系图。终端进一步可以根据上述得到的上层调用关系图和上层任务集合生成与目标测试任务对应的函数调用关系图。

步骤306,根据函数调用关系图以及预设的测试数据,确定目标测试任务的测试开始点和测试结束点。

其中,测试数据是目标测试任务中设置的输入数据。具体地,基于上述函数调用关系图以及测试数据,可以得到对应的数据流关系图以及测试数据中的各变量以及参数的类型结构(如CAN(Controller Area Network,控制器域网),BLE(Bluetooth Low Energy,低能耗蓝牙),NFC(Near Field Communication,近场通信)等)等。测试开始点则是指测试开始时的起始位置,测试结束点是指测试结束时的结束位置,也即退出测试的位置。

在本实施例中,终端根据函数调用关系图以及预设的测试数据,可以通过追踪参数及局部变量的方式定位测试数据以传入对应的处理函数前被写入的内存位置以及所在函数TargetMsgLoc(目标消息位置),例如队列接收函数QueueReceive(该函数仅用于举例说明)。从而将定位的内存位置及所在函数确定为测试开始点,也即测试数据通过中断写入并传入目标测试任务的数据接收点。

进一步地,终端还可以通过上述函数调用关系图识别循环跳转点和任务退出点,并根据循环跳转点和任务退出点确定测试结束点。具体地,由于待测试实时操作系统类的固件中,每个持久化任务在处理完一个消息后,通常会跳转到QueueReceive类函数(即接收列队函数)等待新消息。在本实施例中,为了避免中间异常帧导致退出当前任务或者出现挂起状态而造成超时,可以通过识别类似的循环跳转点LoopLoc和任务退出点ExitLoc,并将识别到的LoopLoc和ExitLoc作为测试结束点。从而当任务长时间未执行到LoopLoc或者执行到ExitLoc时则主动退出当次测试并记录对应的测试用例。

步骤308,将测试开始点和测试结束点作为测试关键点。

具体地,终端可以将上述确定的测试开始点和测试结束点作为测试关键点。

上述实施例中,终端根据待测试实时操作系统识别对应的函数信息,并根据函数信息生成与目标测试任务对应的函数调用关系图,进而根据函数调用关系图以及预设的测试数据,确定目标测试任务的测试开始点和测试结束点,将测试开始点和测试结束点作为测试关键点。从而实现对测试开始点和测试结束点的有效选择,以提升后续对待测试实时操作系统进行测试的效率。

在一个实施例中,如图4所示,在步骤104中,通过模拟器运行待测试实时操作系统,获取待测试实时操作系统运行过程中的内存状态,具体可以包括:

步骤402,获取配置的内存监控策略。

其中,内存监控策略是基于测试需要而配置的对待测试实时操作系统的内存访问行为、变量使用行为等进行监控的策略。由于传统的实时操作系统缺乏内存保护和安全检测机制,导致测试时无法实时监控到系统的各种内存错误。基于此,在本实施例中,终端可以获取配置的内存监控策略,例如,可以通过终端配置对应的内存监控策略,或者,终端也可以获取预先配置的内存监控策略。进而在待测试实时操作系统运行时,可以基于配置的内存监控策略对系统的内存行为进行监控。

步骤404,在模拟器运行待测试实时操作系统的过程中,运行内存监控策略,并获取运行结果。

其中,运行结果可以是运行内存监控策略后得到的结果。具体地,为了实现对实时操作系统的内存行为进行监控,终端可以在模拟器运行待测试实时操作系统的过程中,同时运行内存监控策略,并获取运行结果。

步骤406,根据运行结果确定待测试实时操作系统运行过程中的内存状态。

其中,内存状态可以包括内存正常的状态以及内存异常的状态。在本实施例中,终端可以根据内存监控策略的运行结果确定待测试实时操作系统运行过程中的内存状态。

具体地,以内存监控策略为堆内存监控策略为例来说,由于对于堆内存,主要存在是否越界读写的问题。因此,在内存分配时,可以通过修改保存堆分配函数参数的寄存器的数值使得实际分配的堆块大小大于程序需求的值。然后通过内存读写hook(钩子)机制,对额外分配的内存进行读写hook,如果待测试实时操作系统运行过程中,这些额外分配的内存被读写,则说明产生了越界读写的问题,即内存状态为异常。而如果待测试实时操作系统运行过程中,这些额外分配的内存没有被读写,则说明没有产生越界读写,即内存状态为正常。

在一种场景下,以内存监控策略为栈返回地址监控策略为例来说,在该种场景下,可以通过静态分析的方法提取出待测试实时操作系统将返回地址保存在栈上的指令对应的地址,进行地址hook,如果触发了这个hook,则会添加对栈上返回地址内存的读写hook。如果对这块内存进行读操作,则会被认为是读取返回地址,是正常操作,即状态正常,因此可以取消对这块内存的hook。如果对这块内存进行写操作,则会被认为是越界读写操作,即状态异常。

在一种场景下,以内存监控策略为栈变量监控策略为例来说,可以通过借助待测试实时操作系统的固件的符号信息进行判断。通过符号信息获取不同变量的栈偏移,在函数进入的时候添加该函数的栈变量地址到全局列表里面,然后对内存操作函数进行检测,如果在内存拷贝的时候不是在全局列表中的单个栈变量对象中,则认为是越界操作,即状态异常。如果在内存拷贝的时候是在全局列表中的单个栈变量对象中,则认为状态正常。又由于函数的退出点可能不止一个,因此可以选择在进入函数的时候,如果存在栈变量对象的地址超过了栈顶,那么就在全局列表中移除该栈变量地址。

在一种场景下,以内存监控策略为全局变量监控策略为例来说,由于地址并不会随着程序运行而变化,因此只需要基于静态分析的结果,添加全局变量到分析列表中,然后对内存操作函数进行检测,如果在内存拷贝的时候不是在全局列表中的单个全局变量对象中,则认为是越界操作,即状态异常。如果在内存拷贝的时候是在全局列表中的单个全局变量对象中,则认为状态正常。

在一种场景下,还可以根据实际需要自定义内存监控策略,例如,可以自定义对待测试实时操作系统功能安全逻辑的检测和预警,当系统运行到对应状态时自动暂停并提出预警,并保存栈回溯信息,以便于测试人员分析。

在本实施例中,通过对内存操作函数、内存访问操作、堆栈及全局变量等的分析而配置对应的内存监控策略,从而实现基于全系统模拟的内存使用监控及异常检测,以弥补传统技术中不支持对实时操作系统的内存状态进行检测的功能缺陷,并能实现对内存访问等错误的准确预警。

在一个实施例中,如图5所示,在步骤106中,基于测试关键点执行目标测试任务,获取执行结果,具体可以包括:

步骤502,在测试开始点加载与目标测试任务对应的测试数据的生成及写入逻辑和模糊测试处理逻辑,并在测试结束点加载模糊测试处理逻辑。

由于传统技术中对实时操作系统的测试依赖真实的硬件设备,对实时操作系统的固件进行模糊测试需要对硬件设备反复刷写,从而影响硬件的使用寿命。除此之外,对系统固件进行模糊测试还需要从速度较慢的数据传输线路传输数据,从而降低了模糊测试的速度。基于此,在本实施例中,终端可以基于图2所示的方法创建的模拟器以及图3所示的方法确定的测试关键点,对待测试实时操作系统进行全系统模拟的模糊测试,从而不依赖于硬件设备,降低设备损耗,且能够提高测试效率。

具体地,终端通过在在测试开始点加载与目标测试任务对应的测试数据的生成及写入逻辑和模糊测试处理逻辑,同时在测试结束点加载模糊测试处理逻辑。其中,测试数据的生成及写入逻辑和模糊测试处理逻辑可以是预先设置的相关逻辑。

步骤504,当待测试实时操作系统运行到测试开始点时,根据生成及写入逻辑生成并填充测试数据,进入模糊测试处理逻辑。

具体地,当待测试实时操作系统运行到测试开始点时,终端可以根据上述加载的生成及写入逻辑生成并填充测试数据,并进入模糊测试处理逻辑。

步骤506,当待测试实时操作系统运行到测试结束点时,执行模糊测试处理逻辑,并获取执行结果。

具体地,当待测试实时操作系统运行到测试结束点时,终端还可以执行模糊测试处理逻辑,并获取执行结果。

在本实施例中,可以基于上述步骤完成对多帧数据定向且高效的测试,同时还能保障进入测试时系统固件正常的运行状态,以及对各类全局变量的正确初始化,从而避免其他因素引起的误报,以进一步提高测试效率。

进一步地,为了检测上述测试的效果,还可以在模糊测试运行完之后对本次模糊测试生成的种子进行覆盖率的记录。具体方法为对待测试实时操作系统的固件中的每个基本块进行插桩,统计测试数据集导致各个基本块被触发的次数。为了降低系统固件启动以及初始化较慢对覆盖率统计速度的影响,还可以采用用forkserver的方法(即一种基于fork函数的模糊测试加速方法),即在第一次到达数据输入点(即测试开始点)时启动forkserver开始对模拟器进程执行fork(一种系统调用),这样模糊测试开始点之前的代码就只需要运行一次,之后的每个测试数据只运行起始点之后的模糊测试处理逻辑对应的指令部分,从而加快了测试和覆盖率提取的速度。

在得到覆盖率的记录之后,还可以基于覆盖率记录在逆向工具中实现覆盖率的可视化,从而方便后续检测当前模糊测试的效果,例如,方便查看未被覆盖的分支并生成可以到达该分支的测试数据。除此之外,还可以利用静态分析对未覆盖的分支进行权重分析(如危险函数的数量以及相邻分支数量),并且尝试从未覆盖的分支中提取可能的标志字符串或者输入格式信息(例如长度控制字段,校验和等)信息以供后续模糊测试使用,以进一步提升后续模糊测试的效率。

应该理解的是,虽然如上所述的各实施例所涉及的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,如上所述的各实施例所涉及的流程图中的至少一部分步骤可以包括多个步骤或者多个阶段,这些步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤中的步骤或者阶段的至少一部分轮流或者交替地执行。

基于同样的发明构思,本申请实施例还提供了一种用于实现上述所涉及的实时操作系统的模糊测试方法的实时操作系统的模糊测试装置。该装置所提供的解决问题的实现方案与上述方法中所记载的实现方案相似,故下面所提供的一个或多个实时操作系统的模糊测试装置实施例中的具体限定可以参见上文中对于实时操作系统的模糊测试方法的限定,在此不再赘述。

在一个实施例中,如图6所示,提供了一种实时操作系统的模糊测试装置,包括:模拟器创建模块602、内存状态获取模块604、测试执行模块606和测试结果生成模块608,其中:

模拟器创建模块602,用于根据待测试实时操作系统创建模拟器,并确定测试关键点;

内存状态获取模块604,用于通过所述模拟器运行所述待测试实时操作系统,获取所述待测试实时操作系统运行过程中的内存状态;

测试执行模块606,用于基于所述测试关键点执行目标测试任务,获取执行结果;

测试结果生成模块608,用于根据所述内存状态和所述执行结果生成所述待测试实时操作系统的测试结果。

在一个实施例中,所述装置还包括测试关键点确定模块,所述测试关键点确定模块还包括:函数信息识别单元,用于根据所述待测试实时操作系统识别对应的函数信息;图生成单元,用于根据所述函数信息生成与所述目标测试任务对应的函数调用关系图;确定单元,用于根据所述函数调用关系图以及预设的测试数据,确定所述目标测试任务的测试开始点和测试结束点;将所述测试开始点和所述测试结束点作为所述测试关键点。

在一个实施例中,所述函数信息包括函数名和函数体;所述图生成单元还用于:根据所述函数名和函数体,识别各类任务,根据所述各类任务确定上层任务集合;根据所述函数名和函数体,识别所述目标测试任务的函数集合,通过控制流分析法为所述函数集合中各函数生成上层调用关系图;根据所述上层调用关系图和所述上层任务集合生成与所述目标测试任务对应的所述函数调用关系图。

在一个实施例中,所述确定单元还用于:根据所述函数调用关系图以及预设的测试数据,通过追踪方式定位所述测试数据被写入的内存位置以及所在函数,将定位的内存位置及所在函数确定为所述测试开始点;通过所述函数调用关系图识别循环跳转点和任务退出点,根据所述循环跳转点和所述任务退出点确定所述测试结束点。

在一个实施例中,所述测试执行模块还用于:在所述测试开始点加载与所述目标测试任务对应的测试数据的生成及写入逻辑和模糊测试处理逻辑,并在所述测试结束点加载所述模糊测试处理逻辑;当所述待测试实时操作系统运行到所述测试开始点时,根据所述生成及写入逻辑生成并填充所述测试数据,进入所述模糊测试处理逻辑;当所述待测试实时操作系统运行到所述测试结束点时,执行所述模糊测试处理逻辑,并获取执行结果。

在一个实施例中,所述内存状态获取模块还用于:获取配置的内存监控策略;在所述模拟器运行所述待测试实时操作系统的过程中,运行所述内存监控策略,并获取运行结果;根据所述运行结果确定所述待测试实时操作系统运行过程中的内存状态。

在一个实施例中,所述模拟器创建模块还用于:根据所述待测试实时操作系统识别对应的函数信息和使用的外部设备;根据所述函数信息确定所述待测试实时操作系统的运行起始点以及各程序段的加载地址;根据所述程序段的加载地址将所述程序段映射到预先分配的第一虚拟内存空间;将预先分配的所述外部设备的第二虚拟内存空间初始化为虚拟设备;根据各程序段的加载地址、映射的第一虚拟内存空间、所述虚拟设备以及所述待测试实时操作系统的运行起始点,生成模拟器。

上述实时操作系统的模糊测试装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。

在一个实施例中,提供了一种计算机设备,该计算机设备可以是终端,其内部结构图可以如图7所示。该计算机设备包括处理器、存储器、输入/输出接口、通信接口、显示单元和输入装置。其中,处理器、存储器和输入/输出接口通过系统总线连接,通信接口、显示单元和输入装置通过输入/输出接口连接到系统总线。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质和内存储器。该非易失性存储介质存储有操作系统和计算机程序。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的输入/输出接口用于处理器与外部设备之间交换信息。该计算机设备的通信接口用于与外部的终端进行有线或无线方式的通信,无线方式可通过WIFI、移动蜂窝网络、NFC(近场通信)或其他技术实现。该计算机程序被处理器执行时以实现一种实时操作系统的模糊测试方法。该计算机设备的显示单元用于形成视觉可见的画面,可以是显示屏、投影装置或虚拟现实成像装置。显示屏可以是液晶显示屏或者电子墨水显示屏,该计算机设备的输入装置可以是显示屏上覆盖的触摸层,也可以是计算机设备外壳上设置的按键、轨迹球或触控板,还可以是外接的键盘、触控板或鼠标等。

本领域技术人员可以理解,图7中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。

在一个实施例中,提供了一种计算机设备,包括存储器和处理器,存储器中存储有计算机程序,该处理器执行计算机程序时实现以下步骤:

根据待测试实时操作系统创建模拟器,并确定测试关键点;

通过所述模拟器运行所述待测试实时操作系统,获取所述待测试实时操作系统运行过程中的内存状态;

基于所述测试关键点执行目标测试任务,获取执行结果;

根据所述内存状态和所述执行结果生成所述待测试实时操作系统的测试结果。

在一个实施例中,处理器执行计算机程序时还实现以下步骤:根据所述待测试实时操作系统识别对应的函数信息;根据所述函数信息生成与所述目标测试任务对应的函数调用关系图;根据所述函数调用关系图以及预设的测试数据,确定所述目标测试任务的测试开始点和测试结束点;将所述测试开始点和所述测试结束点作为所述测试关键点。

在一个实施例中,处理器执行计算机程序时还实现以下步骤:根据所述函数名和函数体,识别各类任务,根据所述各类任务确定上层任务集合;根据所述函数名和函数体,识别所述目标测试任务的函数集合,通过控制流分析法为所述函数集合中各函数生成上层调用关系图;根据所述上层调用关系图和所述上层任务集合生成与所述目标测试任务对应的所述函数调用关系图。

在一个实施例中,处理器执行计算机程序时还实现以下步骤:根据所述函数调用关系图以及预设的测试数据,通过追踪方式定位所述测试数据被写入的内存位置以及所在函数,将定位的内存位置及所在函数确定为所述测试开始点;通过所述函数调用关系图识别循环跳转点和任务退出点,根据所述循环跳转点和所述任务退出点确定所述测试结束点。

在一个实施例中,处理器执行计算机程序时还实现以下步骤:在所述测试开始点加载与所述目标测试任务对应的测试数据的生成及写入逻辑和模糊测试处理逻辑,并在所述测试结束点加载所述模糊测试处理逻辑;当所述待测试实时操作系统运行到所述测试开始点时,根据所述生成及写入逻辑生成并填充所述测试数据,进入所述模糊测试处理逻辑;当所述待测试实时操作系统运行到所述测试结束点时,执行所述模糊测试处理逻辑,并获取执行结果。

在一个实施例中,处理器执行计算机程序时还实现以下步骤:获取配置的内存监控策略;在所述模拟器运行所述待测试实时操作系统的过程中,运行所述内存监控策略,并获取运行结果;根据所述运行结果确定所述待测试实时操作系统运行过程中的内存状态。

在一个实施例中,处理器执行计算机程序时还实现以下步骤:根据所述待测试实时操作系统识别对应的函数信息和使用的外部设备;根据所述函数信息确定所述待测试实时操作系统的运行起始点以及各程序段的加载地址;根据所述程序段的加载地址将所述程序段映射到预先分配的第一虚拟内存空间;将预先分配的所述外部设备的第二虚拟内存空间初始化为虚拟设备;根据各程序段的加载地址、映射的第一虚拟内存空间、所述虚拟设备以及所述待测试实时操作系统的运行起始点,生成模拟器。

在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现以下步骤:

根据待测试实时操作系统创建模拟器,并确定测试关键点;

通过所述模拟器运行所述待测试实时操作系统,获取所述待测试实时操作系统运行过程中的内存状态;

基于所述测试关键点执行目标测试任务,获取执行结果;

根据所述内存状态和所述执行结果生成所述待测试实时操作系统的测试结果。

在一个实施例中,计算机程序被处理器执行时还实现以下步骤:根据所述待测试实时操作系统识别对应的函数信息;根据所述函数信息生成与所述目标测试任务对应的函数调用关系图;根据所述函数调用关系图以及预设的测试数据,确定所述目标测试任务的测试开始点和测试结束点;将所述测试开始点和所述测试结束点作为所述测试关键点。

在一个实施例中,计算机程序被处理器执行时还实现以下步骤:根据所述函数名和函数体,识别各类任务,根据所述各类任务确定上层任务集合;根据所述函数名和函数体,识别所述目标测试任务的函数集合,通过控制流分析法为所述函数集合中各函数生成上层调用关系图;根据所述上层调用关系图和所述上层任务集合生成与所述目标测试任务对应的所述函数调用关系图。

在一个实施例中,计算机程序被处理器执行时还实现以下步骤:根据所述函数调用关系图以及预设的测试数据,通过追踪方式定位所述测试数据被写入的内存位置以及所在函数,将定位的内存位置及所在函数确定为所述测试开始点;通过所述函数调用关系图识别循环跳转点和任务退出点,根据所述循环跳转点和所述任务退出点确定所述测试结束点。

在一个实施例中,计算机程序被处理器执行时还实现以下步骤:在所述测试开始点加载与所述目标测试任务对应的测试数据的生成及写入逻辑和模糊测试处理逻辑,并在所述测试结束点加载所述模糊测试处理逻辑;当所述待测试实时操作系统运行到所述测试开始点时,根据所述生成及写入逻辑生成并填充所述测试数据,进入所述模糊测试处理逻辑;当所述待测试实时操作系统运行到所述测试结束点时,执行所述模糊测试处理逻辑,并获取执行结果。

在一个实施例中,计算机程序被处理器执行时还实现以下步骤:获取配置的内存监控策略;在所述模拟器运行所述待测试实时操作系统的过程中,运行所述内存监控策略,并获取运行结果;根据所述运行结果确定所述待测试实时操作系统运行过程中的内存状态。

在一个实施例中,计算机程序被处理器执行时还实现以下步骤:根据所述待测试实时操作系统识别对应的函数信息和使用的外部设备;根据所述函数信息确定所述待测试实时操作系统的运行起始点以及各程序段的加载地址;根据所述程序段的加载地址将所述程序段映射到预先分配的第一虚拟内存空间;将预先分配的所述外部设备的第二虚拟内存空间初始化为虚拟设备;根据各程序段的加载地址、映射的第一虚拟内存空间、所述虚拟设备以及所述待测试实时操作系统的运行起始点,生成模拟器。

在一个实施例中,提供了一种计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现以下步骤:

根据待测试实时操作系统创建模拟器,并确定测试关键点;

通过所述模拟器运行所述待测试实时操作系统,获取所述待测试实时操作系统运行过程中的内存状态;

基于所述测试关键点执行目标测试任务,获取执行结果;

根据所述内存状态和所述执行结果生成所述待测试实时操作系统的测试结果。

在一个实施例中,计算机程序被处理器执行时还实现以下步骤:根据所述待测试实时操作系统识别对应的函数信息;根据所述函数信息生成与所述目标测试任务对应的函数调用关系图;根据所述函数调用关系图以及预设的测试数据,确定所述目标测试任务的测试开始点和测试结束点;将所述测试开始点和所述测试结束点作为所述测试关键点。

在一个实施例中,计算机程序被处理器执行时还实现以下步骤:根据所述函数名和函数体,识别各类任务,根据所述各类任务确定上层任务集合;根据所述函数名和函数体,识别所述目标测试任务的函数集合,通过控制流分析法为所述函数集合中各函数生成上层调用关系图;根据所述上层调用关系图和所述上层任务集合生成与所述目标测试任务对应的所述函数调用关系图。

在一个实施例中,计算机程序被处理器执行时还实现以下步骤:根据所述函数调用关系图以及预设的测试数据,通过追踪方式定位所述测试数据被写入的内存位置以及所在函数,将定位的内存位置及所在函数确定为所述测试开始点;通过所述函数调用关系图识别循环跳转点和任务退出点,根据所述循环跳转点和所述任务退出点确定所述测试结束点。

在一个实施例中,计算机程序被处理器执行时还实现以下步骤:在所述测试开始点加载与所述目标测试任务对应的测试数据的生成及写入逻辑和模糊测试处理逻辑,并在所述测试结束点加载所述模糊测试处理逻辑;当所述待测试实时操作系统运行到所述测试开始点时,根据所述生成及写入逻辑生成并填充所述测试数据,进入所述模糊测试处理逻辑;当所述待测试实时操作系统运行到所述测试结束点时,执行所述模糊测试处理逻辑,并获取执行结果。

在一个实施例中,计算机程序被处理器执行时还实现以下步骤:获取配置的内存监控策略;在所述模拟器运行所述待测试实时操作系统的过程中,运行所述内存监控策略,并获取运行结果;根据所述运行结果确定所述待测试实时操作系统运行过程中的内存状态。

在一个实施例中,计算机程序被处理器执行时还实现以下步骤:根据所述待测试实时操作系统识别对应的函数信息和使用的外部设备;根据所述函数信息确定所述待测试实时操作系统的运行起始点以及各程序段的加载地址;根据所述程序段的加载地址将所述程序段映射到预先分配的第一虚拟内存空间;将预先分配的所述外部设备的第二虚拟内存空间初始化为虚拟设备;根据各程序段的加载地址、映射的第一虚拟内存空间、所述虚拟设备以及所述待测试实时操作系统的运行起始点,生成模拟器。

需要说明的是,本申请所涉及的用户信息(包括但不限于用户设备信息、用户个人信息等)和数据(包括但不限于用于分析的数据、存储的数据、展示的数据等),均为经用户授权或者经过各方充分授权的信息和数据,且相关数据的收集、使用和处理需要遵守相关国家和地区的相关法律法规和标准。

本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、数据库或其它介质的任何引用,均可包括非易失性和易失性存储器中的至少一种。非易失性存储器可包括只读存储器(Read-OnlyMemory,ROM)、磁带、软盘、闪存、光存储器、高密度嵌入式非易失性存储器、阻变存储器(ReRAM)、磁变存储器(Magnetoresistive Random Access Memory,MRAM)、铁电存储器(Ferroelectric Random Access Memory,FRAM)、相变存储器(Phase Change Memory,PCM)、石墨烯存储器等。易失性存储器可包括随机存取存储器(Random Access Memory,RAM)或外部高速缓冲存储器等。作为说明而非局限,RAM可以是多种形式,比如静态随机存取存储器(Static Random Access Memory,SRAM)或动态随机存取存储器(Dynamic RandomAccess Memory,DRAM)等。本申请所提供的各实施例中所涉及的数据库可包括关系型数据库和非关系型数据库中至少一种。非关系型数据库可包括基于区块链的分布式数据库等,不限于此。本申请所提供的各实施例中所涉及的处理器可为通用处理器、中央处理器、图形处理器、数字信号处理器、可编程逻辑器、基于量子计算的数据处理逻辑器等,不限于此。

以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。

以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本申请专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请的保护范围应以所附权利要求为准。

相关技术
  • 测试方法、装置、计算机可读存储介质和计算机设备
  • 软件测试方法、装置、计算机设备和可读存储介质
  • 分组测试方法、装置、计算机设备及存储介质
  • 接口测试方法、装置、计算机设备及存储介质
  • Monkey测试方法、装置、电子设备及计算机可读存储介质
  • 模糊测试方法、装置、设备及计算机可读存储介质
  • 自动化模糊测试方法及相关设备、计算机可读存储介质
技术分类

06120115980063