CN111709031B - 一种覆盖率引导的VxWorks内核模糊测试方法 - Google Patents

一种覆盖率引导的VxWorks内核模糊测试方法 Download PDF

Info

Publication number
CN111709031B
CN111709031B CN202010467332.6A CN202010467332A CN111709031B CN 111709031 B CN111709031 B CN 111709031B CN 202010467332 A CN202010467332 A CN 202010467332A CN 111709031 B CN111709031 B CN 111709031B
Authority
CN
China
Prior art keywords
test
vxworks
test case
vxafl
qemu
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN202010467332.6A
Other languages
English (en)
Other versions
CN111709031A (zh
Inventor
徐向华
邵帅
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Hangzhou Dianzi University
Original Assignee
Hangzhou Dianzi University
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Hangzhou Dianzi University filed Critical Hangzhou Dianzi University
Priority to CN202010467332.6A priority Critical patent/CN111709031B/zh
Publication of CN111709031A publication Critical patent/CN111709031A/zh
Application granted granted Critical
Publication of CN111709031B publication Critical patent/CN111709031B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/57Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
    • G06F21/577Assessing vulnerabilities and evaluating computer system security
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2221/00Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F2221/03Indexing scheme relating to G06F21/50, monitoring users, programs or devices to maintain the integrity of platforms
    • G06F2221/034Test or assess a computer or a system

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Computer Security & Cryptography (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Computing Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明公开了一种覆盖率引导的VxWorks内核模糊测试方法。本发明涉及网络安全技术邻域,特别涉及基于模糊测试的路径感知、实时引导地VxWorks操作系统内核漏洞挖掘技术。本发明通过对闭源操作系统VxWorks系统内核进行动态模拟执行中实现指令路径信息获取,使用内存写时保存和虚拟处理器结构体内容保存技术实现内核运行时状态保存,使用覆盖率信息对测试用例进行筛选和模糊化,使用虚拟处理器程序指针对系统异常状态的判断。本发明实现了对VxWorks系统的高效、实用测试方法。本发明适用于已有VxWorks系统漏洞挖掘、VxWorks系统的自动化测试等工作中。

Description

一种覆盖率引导的VxWorks内核模糊测试方法
技术领域
本发明涉及网络安全技术邻域,特别涉及基于模糊测试的路径感知、实时引导的VxWorks操作系统内核漏洞挖掘技术。
背景技术
常见的操作系统比如Windows、macOS、VxWorks,系统内核绝大多数代码都不对外开放,在系统内核漏洞测试分析中无法对其采用基于源码插桩的覆盖率为导向的模糊测试方法。这些操作系统应用在很多类型的嵌入式设备,如交换机、监控摄像头、智能冰箱、工控PLC等,而且它们所使用处理器芯片的CPU类型众多,包含X86、ARM、MIPS、PowerPC等,因此嵌入式操作系统内核的模糊测试技术还需要满足这些不同CPU架构编译的内核进行测试。
现有操作系统内核模糊测试技术和工具有以下方法和问题:
1.现有技术中,Syzkaller采用内核代码编译插桩测试方法,使用Linux内核KCOV特性对其内核进行代码插桩并重新编译生成系统目标代码,然后通过获取内核执行时的路径信息并计算覆盖率引导内核模糊测试过程。该方法适用于Linux开源系统,但不适用于VxWorks、Windows操作系统。
2.TriforceAFL采用QEMU虚拟机模拟执行系统内核测试方法,将内核二进制代码翻译成中间代码TCG(Tiny Code Generator)表示的特性,根据中间代码TCG执行时的虚拟处理器程序指针(PC)来计算代码覆盖率记录,引导内核模糊测试过程。但是TriforceAFL工具在每轮测试前需要在中间代码TCG执行过程中创建新的QEMU子进程模拟执行内核代码,但是对内核I/O资源缺少隔离,会造成QEMU的全局变量处于不确定状态中,导致VxWorks内核模糊测试执行状态不稳定的问题。
3.kAFL工具和专利号CN1103622485A使用Intel-PT(Process Trace)技术别获取内核代码覆盖率,依赖于包含Intel-PT指令集的Intel 5代以上的处理器芯片,无法应用于嵌入式系统中广泛采用的ARM、PowerPC等处理器芯片指令集的系统内核测试,不适用于VxWorks系统内核测试。
4.专利CN109543417A提出的方法使用AFL工具生成Linux系统调用测试用例,在内核崩溃后根据异常结果类型进行自动修复或者人工使用GDB调试器确定漏洞信息后修复,将装置分为模拟单元、获取单元、测试单元,但是该专利局限于Linux系统,无法自动获取VxWorks系统调用内部执行路径信息以及计算覆盖率,难以实现覆盖率引导的测试用例生成方法,因此难以应用于VxWorks系统内核测试。
综上,上述内核代码插桩编译和内核代码模拟执行方法无法直接运用于VxWorks内核测试中,本发明提出一种适用于VxWorks内核模糊测试的技术方案。
发明内容
本发明针对上述问题,提出一种覆盖率引导的VxWorks内核模糊测试方法,包括四个测试阶段:测试准备、测试进行、测试结束、测试终止。
本发明所述的测试准备阶段,具体包含以下步骤:
1-1.使用QEMU模拟器执行VxWorks内核代码,创建测试用例生成工具进程vxAFL和运行VxWorks的QEMU模拟器进程之间共享内存,实现进程vxAFL和QEMU模拟器进程之间的VxWorks执行路径信息的交换;共享内存格式化为一维数组,数组索引表示对应路径,数组值表示这条路径执行次数。
1-2.测试用例生成工具进程vxAFL创建与QEMU模拟器进程之间的消息管道用于VxWorks执行异常状态信息通知。
1-3.在QEMU模拟器中读取内核镜像文件,解析ELF格式的内核镜像文件获得QEMU模拟器运行时VxWorks内核符号对应的内存地址,感知内核运行状态。
1-4.测试用例生成工具进程vxAFL根据VxWorks内核测试函数功能的不同,提供对应初始测试用例文件,例如:网络协议相关函数可以使用对应协议报文作为初始用例测试;然后从对应初始测试用例文件路径读取初始测试用例。
1-5.在QEMU模拟器进程中创建哈希表用于存放内存地址、内存地址对应的初始值的内存写入操作条目。
1-6.QEMU模拟器的内存写入函数中插入钩子函数代码。测试执行阶段中VxWorks系统执行内存写入指令时,写入的内存地址作为参数调用钩子函数,然后在哈希表中保存内存地址对应的初始值,在每轮测试结束后恢复对应内存地址的初始值。在QEMU模拟器进程中保存QEMU模拟器的虚拟处理器结构体(CPUArchState)内容,用于每轮测试结束后恢复虚拟机。
本发明所述QEMU是开源的模拟器,可以模拟多种指令集CPU运行和多种类型硬件设备。
进一步的,本发明所述测试进行阶段具体包含以下步骤:
2-1.在QEMU模拟器执行VxWorks系统的过程中,实现通过QEMU模拟器的虚拟处理器结构体获取程序执行指针,使用程序执行指针计算VxWorks执行路径信息对应的唯一值并写入共享内存。
2-2.在QEMU模拟器进程中,根据程序执行指针判断是否执行进入VxWorks异常处理函数,如果进入异常处理函数,通过消息管道将异常状态通知测试用例生成工具进程vxAFL,然后将异常测试用例放入测试用例队列,并用于下一轮测试。
进一步的,本发明所述测试结束阶段具体包含以下步骤:
3-1.测试用例生成工具进程vxAFL通过读取共享内存中的VxWorks执行路径信息得出覆盖率,并根据当前测试用例的覆盖率判断是否将其保存到测试用例队列,然后开始下一轮测试。
3-2.测试用例生成工具进程vxAFL通过消息管道获得VxWorks系统执行的异常状态,将当前测试用例、崩溃异常状态、共享内存中的路径信息保存于测试异常结果文件中。用于测试结束后人工调试分析该测试用例导致系统崩溃的原因。
3-3.每轮测试结束后,测试用例生成工具进程vxAFL从测试用例队列中取出一个待模糊的异常测试用例,进行模糊化后写入测试用例文件。最后vxAFL进程将变异后测试用例写入文件。
所述的模糊化:分别使用确定性策略和随机性策略两种变异策略,对取出的待模糊的异常测试用例进行模糊化。
3-4.在QEMU模拟器进程中恢复虚拟处理器结构体内容,遍历哈希表中被修改的内存地址对应的内存地址初始值,通过QEMU模拟器的帮助函数将被修改的内存地址初始值写入VxWorks系统对应内存地址,以此恢复QEMU进程的初始状态,初始状态包括QEMU虚拟处理器结构体和客户机虚拟内存状态。
3-5.在QEMU模拟器进程中读取测试用例文件,根据被测VxWorks系统函数的数据存放地址,通过QEMU模拟器的帮助函数将测试用例写入对应数据存放地址所在内存。
3-6.在测试用例生成工具进程vxAFL中,如果当前测试时间距离上一次发现新路径或出现崩溃的时间超过阈值时终止测试循环,进入测试终止阶段,反之进入测试进行阶段进行下一轮测试。
所述的阈值可设置为3~5分钟。
进一步的,本发明所述测试终止阶段:
在QEMU进程中释放分配的共享内存区域、关闭通信管道,然后vxAFL进程终止QEMU进程执行,最后vxAFL进程结束自身执行,整个测试过程结束。
本发明优点:
1.相对于已有工具kAFL、CN1103622485A这类使用硬件功能来获取代码覆盖率,本专利使用QEMU模拟器模拟执行内核二进制代码,实现对ARM、X86、MIPS、PowerPC在内的多种指令集编译的内核进行模糊测试,使得内核模糊测试技术用途更广。
2.相对于已有工具Syzkaller这类使用操作系统特性选项的工具,本专利不需要重新编译操作系统代码,可以对VxWorks、Windows、macOS等闭源操作系统进行内核模糊测试,适用性更强。
3.相对于TriforceAFL工具使用QEMU重新创建虚拟机并恢复系统初始状态的方法,本专利使用哈希表存放测试运行阶段内存修改的初始值,使用QEMU虚拟处理器结构体保存处理器状态,在QEMU进程中实现VxWorks初始执行状态保持和恢复,实现更为高效、稳定的轻量级状态管理方法,同时提高测试效率。
附图说明
图1为本发明一种覆盖率引导的VxWorks内核模糊测试方法的流程示意图。
图2为本发明一种覆盖率引导的VxWorks内核模糊测试方法中vxAFL进程测试准备阶段流程图。
图3为本发明一种覆盖率引导的VxWorks内核模糊测试方法中进程间通信图。
图4为本发明一种覆盖率引导的VxWorks内核模糊测试方法中QEMU进程测试准备阶段流程图。
图5为本发明一种覆盖率引导的VxWorks内核模糊测试方法中ELF格式结构示意图。
图6为本发明一种覆盖率引导的VxWorks内核模糊测试方法测试运行环境示意图。
图7为本发明一种覆盖率引导的VxWorks内核模糊测试方法中QEMU进程测试进行阶段流程图。
图8为本发明一种覆盖率引导的VxWorks内核模糊测试方法中vxAFL进程测试结束阶段流程图。
图9为本发明一种覆盖率引导的VxWorks内核模糊测试方法中QEMU进程测试结束阶段流程图。
具体实施方式
下面结合实施例对本发明做进一步的详细描述。
本发明中,需要使用WindRiver公司的IDE工具Workbench编译VxWorks系统镜像时选择镜像格式为ELF格式(Executable and Linkable Format)生成系统镜像vxworks_img。
如图1所示,本发明所采用的技术方案,一种覆盖率引导的VxWorks内核模糊测试方法,整体步骤分为四个阶段,分别是:
1.测试准备阶段:创建测试用例生成工具进程vxAFL与QEMU模拟器进程间通信的共享内存区域以及管道,解析VxWorks系统镜像符号地址,创建内存恢复使用的哈希表以及设置内存写入钩子函数,保存QEMU模拟器的虚拟处理器结构体(CPUArchState)内容。
2.测试进行阶段:通过虚拟处理器程序指针对VxWorks系统执行过程路径信息进行记录,并且根据程序指针判断VxWorks异常状态,将异常状态通过管道通知vxAFL。
3.测试结束阶段:vxAFL根据路径信息将测试用例放入用例队列中,根据异常状态将相关信息保存异常结果文件中,对测试用例进行模糊化,在QEMU中将测试用例放入被测函数数据存放地址,最后当测试时间距离上一次发现新路径或出现崩溃的时间超过阈值时终止测试循环,vxAFL进程退出,反之进行下一轮测试循环。
4.测试终止阶段:在QEMU进程中释放分配的共享内存区域、关闭通信管道。vxAFL终止QEMU进程执行。
本发明的测试准备阶段具体包含以下步骤:
首先在Linux系统中创建vxAFL进程
1.vxAFL进程准备阶段包含以下步骤(如图2所示):
1.1vxAFL进程创建QEMU子进程,QEMU进程按照步骤2执行;
1.2vxAFL进程中,如图3所示使用Linux函数pipe创建QEMU进程之间消息传递的管道。管道的文件描述符FORKSRV_FD用于QEMU进程写入VxWorks执行异常状态信息,vxAFL进程读取异常状态信息。
1.3vxAFL进程中从对应文件路径读取初始测试用例,生成测试用例队列,在测试进行阶段从队列中取出测试用例,将用例写入文件。优选地,根据测试函数功能不同,提供对应初始测试用例文件,如网络协议相关函数可以使用对应协议报文作为初始用例测试。
2QEMU进程准备阶段包含以下步骤(如图4所示):
2.1在QEMU进程中,本方法使用QEMU虚拟机模拟VxWorks内核代码,如图3所示,创建测试用例生成工具进程vxAFL和运行VxWorks的QEMU进程之间共享内存区域vxAFL_area,实现vxAFL和QEMU进程之间的VxWorks执行路径信息的交换;共享内存格式化为一维数组,数组索引表示每条路径对应值,数组值表示这条路径执行次数。
在本发明中,使用Linux函数shmat创建指定ID、指定大小AREA_SIZE的共享内存区域vxAFL_area,通过环境变量转递ID值使得vxAFL进程能够读取该共享内存区域。
优选地,共享内存大小常数AREA_SIZE为65535。
2.2QEMU加载系统镜像文件vxworks_img,启动VxWorks虚拟机,模拟执行VxWorks系统指令。
2.3QEMU进程中读取内核镜像文件vxworks_img,解析ELF格式内核镜像获得运行时内核符号对应内存地址,感知内核运行状态。
本发明中,为了实现内核镜像文件读取,需要在QEMU源代码qemu-options.hx文件中添加参数-vxafl-img提供内核镜像文件路径vxworks_img,参数-vxafl-entry提供被测内核函数名称vxAFL_func作为测试入口。
本发明中,所述ELF格式具体如图5表示,由ELF格式头部、程序头、节头、节头表,其中ELF格式头部包括:节表头偏移、字符表偏移、ELF表示等,每个节头包含:节名称、节地址、节类型、节大小、节表项大小。
本发明中,内核镜像文件进行解析提取符号对应内存地址包含以下步骤:
2.3.1在QEMU进程中使用Linux系统调用mmap函数加载镜像文件vxworks_img,读取ELF头,根据ELF头部的节头表偏移和字符表偏移,得到节头表地址,通过遍历每个节名称得到符号表所处地址、符号表的表项大小,其中符号表项包含:符号字符在字符表中偏移、符号值、符号大小、符号信息、相关联节。
2.3.2在QEMU进程中遍历符号表的表项信息,对比符号名称字符与被测内核函数名称vxAFL_func和异常处理函数名称,得到函数在代码段地址。具体说,在VxWorks内核测试中,异常处理函数名称为excStub0与excStub1。
本发明中,代码段地址由于VxWorks缺少内核地址空间布局随机化(KernelAddress Space Layout Randomization,KASLR)技术,系统在启动过程中不会将内核代码段随机放置至内存中,因此符号值表示内核运行时中实际内存地址。
2.4在QEMU进程中创建哈希表vxAFLMemHT用于存放内存地址为键、内存地址初始内容为值的内存写入操作条目。该哈希表使用GLib库函数g_hash_table_new创建。
2.5QEMU内存写入函数tcg_out_qemu_st和helper_le_st_name中插入钩子函数代码vxAFL_trace。当QEMU进程执行状态vxAFLStatus等于vxAFL_DOING常数时,其中vxAFL_DOING表示测试进行阶段,并且VxWorks系统执行内存写入指令时,使用QEMU虚拟处理器结构体变量env、写入的内存地址guest_addr作为参数调用钩子函数;使用GLib库的g_hash_table_lookup函数查看现有哈希表中是否已经记录guest_addr对应内存写入条目,如果存在则不再记录。使用QEMU帮助函数cpu_ldl_data读取对应内存地址的初始值cur_value;使用Glib库的g_hash_table_insert函数将内存写入操作条目写入哈希表vxAFLMemHT,用于每轮测试结束恢复对应地址初始值。具体逻辑如下代码所示:
Figure GDA0003391330600000081
在插入钩子函数的过程中,由于helper_le_st_name是QEMU帮助函数,因此可以直接添加函数调用。而tcg_out_qemu_st将TCG中间代码转换为宿主机(Host)指令,因此需要使用TCG语法调用vxAFL_trace,向tcg_out_qemu_st中插入如下代码:
Figure GDA0003391330600000091
其中tcg_out开头函数会根据宿主机不同生成对应指令集架构代码,由于TCG中间代码使用寄存器传递参数,tcg_target_call_iarg_regs[1]表示函数调用时第1个参数所使用寄存器。
本专利所述TCG(Tiny Code Generator)中间代码由QEMU提供函数实现,用于QEMU模拟执行时客户机指令向宿主机指令的动态翻译。
2.6在QEMU进程中使用保存QEMU虚拟处理器结构体内容,用于每轮测试结束后恢复虚拟机。使用QEMU中CPUArchState结构体变量backupCPUState保存当前虚拟处理器的寄存器值,使用QEMU的CPUTLBEntry结构体的数组变量backupTLBTable保存客户机虚拟内存地址(Guest virtual memory address)向客户机物理内存地址(Guest physical memoryaddress)转换的页表缓存TLB(Translation Lookaside Buffer),QEMU模拟器在TLB基础上实现软内存管理单元(Soft Memory Management Unit)
如图6测试运行环境中,客户机虚拟内存中运行了VxWorks系统,由QEMU进程提供VxWorks系统依赖的虚拟硬件环境,由宿主机Linux系统管理运行QEMU进程,由物理主机提供Linux系统所需的物理硬件环境。
如图7所示,本发明所述QEMU进程测试进行阶段具体包含以下步骤:
3.1在QEMU执行VxWorks系统的过程中,实现根据虚拟处理器结构体获取程序执行指针(PC),使用PC指针计算VxWorks执行路径信息对应的唯一值并写入共享内存,具体包含以下步骤:
3.1.1QEMU使用函数cpu_tb_exec执行每一个翻译代码块(Translation Block,TB),每次TB块执行中虚拟处理器结构体被传入cpu_tb_exec函数,因此可以通过该结构体获得当前翻译代码块的程序指针(Program Counter,PC)。
3.1.2QEMU中当获得当前TB块的程序指针cur_pc后,首先使用cur_pc计算得到哈希值cur_id,然后使用cur_id与前一个执行TB块的哈希值prev_id对步骤1.1中创建的共享内存区域vxAFL_area进行计数操作,计数值相当于<cur_id,prev_id>元组所表示的分支路径触发次数。上述过程如下代码表示:
Figure GDA0003391330600000101
其中,第1~4行用于对当前TB块程序指针cur_pc哈希化,HASH_CONST1与HASH_CONST2表示哈希化使用地常数。第5行对vxAFL_area大小AREA_SIZE(常数定义步骤1.1)与操作,避免cur_pc超出范围。tcg_gen开头函数由QEMU提供客户机指令向TCG中间代码转换,第6~14行加载前一个TB表示的哈希值prev_id,然后对prev_id向右移位,对于<cur_id,prev_id>元组所表示的分支路径异或操作得到路径对应的唯一值temp,最后增加vxAFL_area中temp对应的计数值。
本发明中,计算的覆盖率与步骤3.1.2中计数的分支路径触发次数含义是一致的,都是表示测试用例运行时能够覆盖的路径信息。
优选地,HASH_CONST1取值0x8a1c3d1d与HASH_CONST2取值0x1c2b3c4d。
本发明使用TCG中间代码实现覆盖率记录逻辑,避免现有技术为了记录覆盖率必须关闭QEMU的TB块链(Block Chaining)造成的性能损失。
3.2在QEMU中根据当前基本块程序指针PC与关键函数地址进行对比得到异常状态,通过管道将异常状态通知vxAFL进程,然后vxAFL进程将异常测试用例放入测试用例队列,并用于下一轮测试。
具体包括以下步骤:
3.2.1在QEMU中,首先设置异常状态变量vxAFL_status为NONE常数,该常数表示无异常发生,并定义VxWorks异常号组成的集合exception_set。当测试用例导致虚拟处理器执行错误代码导致异常时,VxWorks根据异常号调用异常处理表中对应的异常处理函数。当程序指针cur_pc等于异常处理函数代码地址exception_addr时,说明内核触发异常,那么使用当前虚拟处理器结构体变量env获得VxWorks的异常号num。如果num包含于集合exception_set,那么设置测试状态vxAFL_status变量为HAS_EXCEPTION常数,该常数表示当前测试触发了VxWorks系统异常。当程序指针等于返回地址ret_addr时,设置vxAFL_status为HAS_RETURN,该常数表示当前测试已经正常执行结束。具体操作如下伪代码所示:
Figure GDA0003391330600000111
优选地,VxWorks异常号组成的集合exception_set包括:除零错误号0、内存溢出错误号4、内存越界访问错误号5、执行非法操作码错误号6、堆栈错误号12。
优选地,表示无异常发生的NONE常数值0,表示异常发生的HAS_EXCEPTION的常数值8,表示正常返回的HAS_RETURN常数值为4。
3.2.2在QEMU中当测试异常状态vxAFL_status不等于NONE常数时,说明此轮测试结束;当测试异常状态vxAFL_status等于NONE常数时,说明此轮测试未结束,QEMU继续执行被测内核代码。最后将测试异常状态vxAFL_status写入管道FORKSRV_FD。
如图8所示,本发明中所述vxAFL进程的测试结束阶段具体包含以下步骤:
4.1在vxAFL中读取管道FORKSRV_FD,当异常状态为HAS_RETURN常数时,将当前测试用例丢弃,进行下一轮测试;当异常状态为HAS_EXCEPTION常数时,将当前测试用例放入测试用例队列中进行下一轮测试。
4.2在vxAFL进程中包含一个与vxAFL_area相同大小的数组vxAFL_all,用于存放测试过程中所有触发的路径信息,然后在每次测试结束后vxAFL通过读取共享内存区域中当前测试用例VxWorks执行路径信息vxAFL_area,如果当前测试用例出现新的分支路径或者分支路径计数值增加,那么其保存到测试用例队列。导致出现新分支路径的测试用例设置为优选测试用例,在测试中优先选取出队列进行模糊测试。具体操作如下伪代码表示:
Figure GDA0003391330600000121
4.3vxAFL通过管道获得VxWorks系统执行的异常状态,将当前测试用例、崩溃异常状态、共享内存中的路径信息保存于测试异常结果文件中,用于测试结束后人工分析测试用例导致系统崩溃的原因。
4.4vxAFL进程中,在本轮测试结束后从测试用例队列中取出一个待变异用例,使用确定性策略和随机性策略两种变异策略对其进行模糊化。最后AFL将变异后测试用例写入文件。
在本发明中,由于确定性策略所包括的位翻转、字节翻转、算术加减、整数替换、字典替换和字典插入方法,比较耗时并且执行次数固定,因此在测试中首先进行确定性策略下的模糊测试,当所有确定性策略执行结束后再进行随机性策略。
4.5vxAFL进程中,如果当前测试时间距离上一次发现新路径或出现崩溃的时间超过阈值T时终止测试循环,vxAFL进程退出,反之进入测试进行阶段进行下一轮测试。其中过低的阈值T导致测试不够充分,过高的阈值导致测试时间浪费,因此阈值T由测试人员根据经验设置。优选地时间阈值为3~5分钟。
如图9所示,本发明中所述QEMU进程的测试结束阶段具体包含以下步骤:
5.1在QEMU中恢复虚拟处理器结构体内容与被写入的内存。在QEMU进程中使用步骤2.6中保存的backupCPUState变量与backupTLBTable变量恢复虚拟处理器寄存器与TLB表。遍历vxAFLMemHT哈希表,其中每一项的键为内存地址,值为内存地址对应的初始值,使用模拟器帮助函数cpu_stl_data_ra将初始值写入对应内存地址,以此恢复内存。
5.2在QEMU进程中读取vxAFL生成的测试用例文件内容,根据被测VxWorks函数的数据存放地址,通过QEMU帮助函数写入对应数据存放地址所在内存。
在本发明中,被测内核函数使用参数传递测试用例时,由于x86_32位的VxWorks内核使用栈传递参数,所以使用QEMU帮助函数cpu_ldl_data与虚拟处理器中栈寄存器ESP读取参数地址,通过帮助函数cpu_stb_data将用例以字节为单位写入内核内存中。
在本发明中,被测内核函数在函数体内声明局部变量,然后分配内存用于存放测试用例时,需要针对局部变量在栈中地址获得所分配内存地址,通过帮助函数cpu_stb_data将用例以字节为单位写入该内存地址。
综上所述,本发明一种覆盖率引导的VxWorks内核模糊测试方法,通过对闭源操作系统VxWorks内核进行动态执行、测试用例放置、内存写时保存内核运行时状态的模糊测试方法,相对于现有技术有以下优势:
1.相对于已有工具kAFL、专利CN1103622485A这类使用Intel-PT技术获取代码覆盖率,本专利在QEMU模拟器模拟执行内核二进制代码的过程中获取覆盖率,实现对ARM、X86、MIPS、PowerPC在内的多种指令集编译的内核进行模糊测试,使得内核模糊测试技术用途更广。
2.相对于已有工具Syzkaller这类使用Linux操作系统特性选项的工具,本专利不需要重新编译操作系统代码,可以对VxWorks、Windows、macOS等闭源操作系统进行内核模糊测试,适用性更强。
3.相对于TriforceAFL工具在QEMU模拟器模拟运行系统指令的基础上,使用子进程创建的方式进行每轮测试客户机状态管理,使用哈希表存放测试运行阶段内存修改的初始值,以及使用QEMU虚拟处理器结构体保存处理器状态,实现轻量级状态管理方法,效率更高。
最后基于本发明中的实施例,本邻域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

Claims (3)

1.一种覆盖率引导的VxWorks内核模糊测试方法,其特征在于包括四个阶段:测试准备阶段、测试进行阶段、测试结束阶段、测试终止阶段;
所述测试准备阶段包括以下操作:
1-1.使用QEMU模拟器执行VxWorks内核代码,创建测试用例生成工具进程vxAFL和运行VxWorks的QEMU模拟器进程之间共享内存,实现进程vxAFL和QEMU模拟器进程之间的VxWorks执行路径信息的交换;共享内存格式化为一维数组,数组索引表示对应路径,数组值表示这条路径执行次数;
1-2.测试用例生成工具进程vxAFL创建与QEMU模拟器进程之间的消息管道用于VxWorks执行异常状态信息通知;
1-3.在QEMU模拟器中读取内核镜像文件,解析内核镜像文件获得QEMU模拟器运行时VxWorks内核符号对应的内存地址,感知内核运行状态;
1-4.测试用例生成工具进程vxAFL根据VxWorks内核测试函数功能的不同,提供对应初始测试用例文件,然后从对应初始测试用例文件路径读取初始测试用例;
1-5.在QEMU模拟器进程中创建哈希表用于存放内存地址、内存地址对应的初始值的内存写入操作条目;
1-6.QEMU模拟器的内存写入函数中插入钩子函数代码;测试执行阶段中虚拟机执行内存写入指令时,写入的内存地址作为参数调用钩子函数,然后在哈希表中保存内存地址对应的初始值,在每轮测试结束后恢复对应内存地址的初始值;
所述测试进行阶段包括以下操作:
2-1.在QEMU模拟器执行VxWorks系统的过程中,实现通过QEMU模拟器的虚拟处理器结构体获取程序执行指针,使用程序执行指针计算VxWorks执行路径信息对应的唯一值并写入共享内存;
2-2.在QEMU模拟器进程中,根据程序执行指针判断是否执行进入VxWorks异常处理函数,如果进入异常处理函数,通过消息管道将异常状态通知测试用例生成工具进程vxAFL,然后将异常测试用例放入测试用例队列,并用于下一轮测试;
所述测试结束阶段包括以下操作:
3-1.测试用例生成工具进程vxAFL通过读取共享内存中的VxWorks执行路径信息得出覆盖率,并根据当前测试用例的覆盖率判断是否将其保存到测试用例队列,然后开始下一轮测试;
3-2.测试用例生成工具进程vxAFL通过消息管道获得VxWorks系统执行的异常状态,将当前测试用例、崩溃异常状态、共享内存中的路径信息保存于测试异常结果文件中;
3-3.每轮测试结束后,测试用例生成工具进程vxAFL从测试用例队列中取出一个待模糊的异常测试用例,进行模糊化后写入测试用例文件;
3-4.在QEMU模拟器进程中恢复虚拟处理器结构体内容,遍历哈希表中被修改的内存地址对应的内存地址初始值,通过QEMU模拟器的帮助函数将被修改的内存地址初始值写入VxWorks系统对应内存地址,以此恢复QEMU进程的初始状态;
3-5.在QEMU模拟器进程中读取测试用例文件,根据被测VxWorks系统函数的数据存放地址,通过QEMU模拟器的帮助函数将测试用例写入对应数据存放地址所在内存;
3-6.如果当前测试时间距离上一次发现新路径或出现崩溃的时间超过阈值时终止测试循环,进入测试终止阶段,反之进入测试进行阶段进行下一轮测试;
所述测试终止阶段包括以下操作:
在QEMU模拟器进程中释放分配的共享内存区域、关闭通信管道,然后vxAFL进程终止QEMU进程执行,最后vxAFL进程结束自身执行,整个测试过程结束。
2.根据权利要求1所述一种覆盖率引导的VxWorks内核模糊测试方法,其特征在于步骤2-1具体实现如下:
2.1.1QEMU使用cpu_tb_exec函数执行每一个翻译代码块TB,每次TB块执行中虚拟处理器结构体被传入cpu_tb_exec函数,因此可以通过该结构体获得当前翻译代码块的程序指针;
2.1.2QEMU中当获得当前TB块的程序指针cur_pc后,首先使用程序指针计算得到哈希值,然后使用哈希值与前一个执行TB块的哈希值对创建的共享内存区域进行计数操作,计数值即覆盖率,相当于分支路径触发次数。
3.根据权利要求2所述一种覆盖率引导的VxWorks内核模糊测试方法,其特征在于步骤3-1具体实现如下:
在vxAFL进程中包含一个与执行路径信息vxAFL_area相同大小的数组vxAFL_all,用于存放测试过程中所有触发的路径信息,然后在每次测试结束后,vxAFL进程通过读取共享内存区域中当前测试用例VxWorks系统执行路径信息vxAFL_area,如果当前测试用例出现新的分支路径或者分支路径计数值增加,则将当前测试用例保存到测试用例队列;将导致出现新分支路径的测试用例设置为优选测试用例,在测试中优先选取出队列进行模糊测试。
CN202010467332.6A 2020-05-28 2020-05-28 一种覆盖率引导的VxWorks内核模糊测试方法 Active CN111709031B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010467332.6A CN111709031B (zh) 2020-05-28 2020-05-28 一种覆盖率引导的VxWorks内核模糊测试方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010467332.6A CN111709031B (zh) 2020-05-28 2020-05-28 一种覆盖率引导的VxWorks内核模糊测试方法

Publications (2)

Publication Number Publication Date
CN111709031A CN111709031A (zh) 2020-09-25
CN111709031B true CN111709031B (zh) 2022-03-01

Family

ID=72537345

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010467332.6A Active CN111709031B (zh) 2020-05-28 2020-05-28 一种覆盖率引导的VxWorks内核模糊测试方法

Country Status (1)

Country Link
CN (1) CN111709031B (zh)

Families Citing this family (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112286823A (zh) * 2020-11-18 2021-01-29 山石网科通信技术股份有限公司 一种操作系统内核的测试方法和装置
CN112559367B (zh) * 2020-12-23 2022-10-25 南京大学 基于系统调用依赖图的内核模糊测试用例生成方法
CN112948257B (zh) * 2021-03-23 2024-05-14 三六零数字安全科技集团有限公司 内核模糊测试用例生成方法、装置、设备及存储介质
CN114281338B (zh) * 2021-11-25 2024-05-28 中国科学院信息工程研究所 一种获取Linux内核中数据结构偏移的方法和装置
CN114490314A (zh) * 2021-12-08 2022-05-13 中国科学院信息工程研究所 一种覆盖率引导的虚拟网络设备模糊测试的方法及装置
CN115543856B (zh) * 2022-12-02 2023-03-24 中国汽车技术研究中心有限公司 蓝牙协议模糊测试用例筛选方法、装置、设备及存储介质

Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9626509B1 (en) * 2013-03-13 2017-04-18 Fireeye, Inc. Malicious content analysis with multi-version application support within single operating environment
CN107045474A (zh) * 2016-02-05 2017-08-15 阿里巴巴集团控股有限公司 一种Fuzz测试中的程序流跟踪方法及装置
CN107315679A (zh) * 2017-05-12 2017-11-03 昆明奥多智能科技有限公司 一种嵌入式软件自动化确认测试方法及测试系统
CN109543417A (zh) * 2018-11-26 2019-03-29 杭州安恒信息技术股份有限公司 一种基于Qemu平台的漏洞挖掘方法和装置
CN110362485A (zh) * 2019-07-03 2019-10-22 杭州安恒信息技术股份有限公司 一种挖掘Windows内核API漏洞的模糊测试方法
CN110764870A (zh) * 2019-09-30 2020-02-07 腾讯科技(深圳)有限公司 一种虚拟机逃逸漏洞挖掘方法、装置、设备及介质
US10636097B2 (en) * 2015-07-21 2020-04-28 Palantir Technologies Inc. Systems and models for data analytics

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110046027A (zh) * 2019-04-23 2019-07-23 山东超越数控电子股份有限公司 一种虚拟化平台实现方法及虚拟化平台
CN110390347B (zh) * 2019-06-10 2021-09-07 河海大学 针对深度神经网络的条件引导式对抗生成测试方法与系统

Patent Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9626509B1 (en) * 2013-03-13 2017-04-18 Fireeye, Inc. Malicious content analysis with multi-version application support within single operating environment
US10636097B2 (en) * 2015-07-21 2020-04-28 Palantir Technologies Inc. Systems and models for data analytics
CN107045474A (zh) * 2016-02-05 2017-08-15 阿里巴巴集团控股有限公司 一种Fuzz测试中的程序流跟踪方法及装置
CN107315679A (zh) * 2017-05-12 2017-11-03 昆明奥多智能科技有限公司 一种嵌入式软件自动化确认测试方法及测试系统
CN109543417A (zh) * 2018-11-26 2019-03-29 杭州安恒信息技术股份有限公司 一种基于Qemu平台的漏洞挖掘方法和装置
CN110362485A (zh) * 2019-07-03 2019-10-22 杭州安恒信息技术股份有限公司 一种挖掘Windows内核API漏洞的模糊测试方法
CN110764870A (zh) * 2019-09-30 2020-02-07 腾讯科技(深圳)有限公司 一种虚拟机逃逸漏洞挖掘方法、装置、设备及介质

Non-Patent Citations (4)

* Cited by examiner, † Cited by third party
Title
Diskaller:基于覆盖率制导的操作系统内核漏洞并行挖掘模型;涂序文等;《信息安全学报》;20190613;第4卷(第2期);全文 *
Test Generation for Embedded Executables via Concolic Execution in a Real Environment;Ting Chen et al.;《 IEEE Transactions on Reliability》;20141021;第64卷(第1期);全文 *
VxWorks Fuzzing 之道:VxWorks 工控实时操作系统漏洞挖掘调试与利用揭秘;佚名;《https://cloud.tencent.com/developer/article/1078361》;20180329;全文 *
物联网设备漏洞挖掘技术研究综述;郑尧文等;《信息安全学报》;20190930;第4卷(第5期);全文 *

Also Published As

Publication number Publication date
CN111709031A (zh) 2020-09-25

Similar Documents

Publication Publication Date Title
CN111709031B (zh) 一种覆盖率引导的VxWorks内核模糊测试方法
US5274811A (en) Method for quickly acquiring and using very long traces of mixed system and user memory references
US8255880B2 (en) Counting instruction and memory location ranges
US8689190B2 (en) Counting instruction execution and data accesses
US6634020B1 (en) Uninitialized memory watch
US7257657B2 (en) Method and apparatus for counting instruction execution and data accesses for specific types of instructions
US6253317B1 (en) Method and apparatus for providing and handling traps
US20110047532A1 (en) Methods and apparatuses for selective code coverage
US20060253739A1 (en) Method and apparatus for performing unit testing of software modules with use of directed automated random testing
US7823140B2 (en) Java bytecode translation method and Java interpreter performing the same
US7698690B2 (en) Identifying code that wastes time performing redundant computation
US6247146B1 (en) Method for verifying branch trace history buffer information
US20060277371A1 (en) System and method to instrument references to shared memory
US20130096880A1 (en) System test method
CN107526970B (zh) 基于动态二进制平台检测运行时程序漏洞的方法
US7937691B2 (en) Method and apparatus for counting execution of specific instructions and accesses to specific data locations
EP1349063A2 (en) Program simulation with just-in-time compilation
WO2013002979A2 (en) Debugging in a multiple address space environment
US20200143061A1 (en) Method and apparatus for tracking location of input data that causes binary vulnerability
CN110941552A (zh) 一种基于动态污点分析的内存分析方法及装置
US20050071816A1 (en) Method and apparatus to autonomically count instruction execution for applications
US20050071608A1 (en) Method and apparatus for selectively counting instructions and data accesses
JPH04229340A (ja) 共用メモリマルチプロセッサコンピュータのデバッグシステム
US20050071610A1 (en) Method and apparatus for debug support for individual instructions and memory locations
US20050086455A1 (en) Method and apparatus for generating interrupts for specific types of instructions

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant