一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

虚拟设备生成、驱动程序测试方法、装置、设备及介质

2022-11-30 16:22:37 来源:中国专利 TAG:


1.本发明涉及软件安全技术领域,尤其涉及一种虚拟设备生成、驱动程序测试方法、装置、设备及介质。


背景技术:

2.操作系统是管理计算机硬件与软件资源的计算机程序。随着科学技术的发展,操作系统已经应用到了生产生活的各个方面,操作系统的安全性也越来越受到重视。驱动程序作为操作系统的内核的重要组成部分,其安全性也备受重视。由于驱动程序通常是由第三方厂商开发的,其安全性难以得到保证,攻击者可以通过恶意构造的用户输入或者硬件设备对驱动程序发起攻击,进而控制整个操作系统内核。因此,挖掘出驱动程序中的安全问题,并提前进行修复,对操作系统的安全性及社会的正常生产生活有着重要的意义。
3.模糊测试是一种自动化的软件测试技术,可以有效的挖掘出安全漏洞,已被大量采用,可以通过向软件程序输入模糊测试工具随机生成的数据对软件程序进行测试。早期的模糊测试采用了黑盒测试的方法,即黑盒模糊测试工具,没有任何的反馈机制,仅仅依靠被测程序崩溃来判断模糊测试工具生成测试用例的有效性。而后来的addresssanitizer等代码消毒剂,可以在软件程序崩溃之外检测出更多的程序内存安全违例,进而更加有效地对模糊测试工具生成的测试用例进行反馈。在黑盒模糊测试工具的基础上,灰盒模糊测试工具可以通过对软件程序进行源代码级别的插桩,从而可以在测试过程中得到软件程序的代码覆盖率,然后利用代码覆盖率指导模糊测试工具对随机生成的测试用例进行变异,灰盒模糊测试工具利用这种遗传算法,对随机生成的测试用例进行变异及选择,可以有效提高软件程序的代码覆盖率,挖掘软件程序中的安全漏洞。
4.由于灰盒模糊测试工具简单易用,也可以应用到对驱动程序的模糊测试中。但是,将灰盒模糊测试工具应用到驱动程序的模糊测试的方案仍存在一定的局限性。由于使用真机对驱动程序进行测试存在一定的缺陷,比如真机难以获取,以及驱动程序类型及数量受限等,所以目前使用软件模拟虚拟设备进而对驱动程序进行测试的方法得到了广泛的关注。但是,对驱动程序测试需要的虚拟设备的模拟需要大量人工参与,自动化程度较低。


技术实现要素:

5.本发明提供一种虚拟设备生成、驱动程序测试方法、装置、设备及介质,用以解决现有技术中对驱动程序测试需要的虚拟设备的模拟需要大量人工参与,自动化程度较低的缺陷,提升了生成虚拟设备的自动化程度。
6.本发明提供一种虚拟设备生成方法,包括:
7.对驱动程序的源文件进行编译获得中间文件,所述中间文件中包含所述源文件的语义信息;
8.基于程序静态分析从所述中间文件中提取所述驱动程序的特征信息;
9.基于所述驱动程序的特征信息,确定虚拟设备的信息;
10.基于所述虚拟设备的信息生成虚拟设备,所述生成的虚拟设备用于对所述驱动程序进行测试。
11.根据本发明提供的一种虚拟设备生成方法,所述对驱动程序的源文件进行编译获得中间文件,包括:
12.若所述驱动程序包含单个所述源文件,将所述源文件编译成中间代码,得到所述中间文件;
13.若所述驱动程序包含多个所述源文件,将所述源文件编译成中间代码,并对每个所述源文件编译得到的中间代码进行链接,得到所述中间文件。
14.根据本发明提供的一种虚拟设备生成方法,所述将所述源文件编译成中间代码,包括:在进行所述驱动程序的内核编译的过程中,识别出符合预设格式的内核编译命令,所述内核编译命令用于将所述源文件编译成目标文件;基于识别出的所述内核编译命令,生成中间代码编译命令;基于所述中间代码编译命令,将所述源文件编译成中间代码;
15.和/或,所述对每个所述源文件编译得到的中间代码进行链接,包括:在进行所述驱动程序的内核链接的过程中,识别出用于链接所述驱动程序的链接命令;基于识别出的所述链接命令,生成中间文件链接命令;基于所述中间文件链接命令,将每个所述源文件编译得到的中间代码进行链接。
16.根据本发明提供的一种虚拟设备生成方法,所述驱动程序的特征信息包括以下项中的至少一项:
17.所述驱动程序初始化过程中的数据信息;
18.所述驱动程序所需要的内存空间的信息;
19.所述驱动程序所需要的配置空间的信息。
20.根据本发明提供的一种虚拟设备生成方法,所述基于程序静态分析从所述中间文件中提取所述驱动程序的特征信息,包括:
21.从所述中间文件中提取初始化函数中的至少一个第一函数,所述第一函数为具有读取功能的函数,获取每个所述第一函数读取的变量,并基于流敏感和路径敏感的程序静态分析,确定所述第一函数读取的变量对应的约束条件,基于所述第一函数读取的变量及对应的约束条件,得到所述驱动程序初始化过程中的数据信息;
22.和/或,
23.从所述中间文件中提取出至少一个第二函数,所述第二函数为具有检查内存空间类型功能的函数,基于程序静态分析,确定所述第二函数检查的内存空间地址及内存空间类型,得到所述驱动程序所需要的内存空间的信息;
24.和/或,
25.从所述中间文件中提取出至少一个第三函数,所述第三函数为具有读取配置空间寄存器功能的函数,基于域敏感、流敏感和路径敏感的程序静态分析,确定所述第三函数的配置空间寄存器的位置、存放在所述配置空间寄存器的变量及对应的约束条件,基于所述第三函数的配置空间寄存器的位置、存放在所述配置空间寄存器的变量及对应的约束条件,得到所述驱动程序所需要的配置空间的信息。
26.根据本发明提供的一种虚拟设备生成方法,还包括:
27.遍历所述初始化函数中的返回指令;当所述返回指令为正数时,确定存在返回值
异常;当所述返回指令的返回值为phi节点时,则进行递归,若递归后的基本块的返回值为正数,确定存在返回值异常,若递归后的基本块的返回值为phi节点,则继续递归;当所述返回指令的返回值为调用指令且所调用的函数的返回值为正数时,确定存在返回值异常;
28.和/或,针对所述第一函数中的每个基本块进行如下处理:遍历所述基本块中的调用指令,当所述基本块中的调用指令所调用的函数为申请资源的函数且当前遍历的路径不是错误处理路径,则预设的计数器加1,当所述基本块中的调用指令所调用的函数为释放资源的函数,则所述计数器减1,其中,所述计数器的初始值为零,当所述基本块遍历完成时,若所述计数器的值不为零,确定存在资源泄露。
29.本发明还提供一种驱动程序测试方法,包括:
30.将驱动程序与对应的虚拟设备进行匹配,所述虚拟设备是采用如上述任一种所述的虚拟设备生成方法生成的;
31.在所述虚拟设备下,通过用户态程序,对所述驱动程序进行第一测试;
32.通过所述虚拟设备,对所述驱动程序进行第二测试。
33.根据本发明提供的一种驱动程序测试方法,所述在所述虚拟设备下,通过用户态程序,对所述驱动程序进行第一测试,包括:通过所述用户态程序直接向所述驱动程序发起系统调用;
34.和/或,所述通过所述虚拟设备,对所述驱动程序进行第二测试,包括:通过所述虚拟设备向所述驱动程序发送中断信号和/或测试用例的数据,其中,所述测试用例的数据用于注入所述虚拟设备的mmio区域和/或dma区域。
35.本发明还提供一种虚拟设备生成装置,包括:
36.文件获得模块,用于对驱动程序的源文件进行编译获得中间文件,所述中间文件中包含所述源文件的语义信息;
37.信息提取模块,用于基于程序静态分析从所述中间文件中提取所述驱动程序的特征信息;
38.信息确定模块,用于基于所述驱动程序的特征信息,确定虚拟设备的信息;
39.设备生成模块,用于基于所述虚拟设备的信息生成虚拟设备,所述生成的虚拟设备用于对所述驱动程序进行测试。
40.根据本发明提供的一种虚拟设备生成装置,文件获得模块,具体用于:
41.若所述驱动程序包含单个所述源文件,将所述源文件编译成中间代码,得到所述中间文件;
42.若所述驱动程序包含多个所述源文件,将所述源文件编译成中间代码,并对每个所述源文件编译得到的中间代码进行链接,得到所述中间文件。
43.根据本发明提供的一种虚拟设备生成装置,文件获得模块,具体用于:在进行所述驱动程序的内核编译的过程中,识别出符合预设格式的内核编译命令,所述内核编译命令用于将所述源文件编译成目标文件;基于识别出的所述内核编译命令,生成中间代码编译命令;基于所述中间代码编译命令,将所述源文件编译成中间代码;
44.和/或,所述对每个所述源文件编译得到的中间代码进行链接,包括:在进行所述驱动程序的内核链接的过程中,识别出用于链接所述驱动程序的链接命令;基于识别出的所述链接命令,生成中间文件链接命令;基于所述中间文件链接命令,将每个所述源文件编
译得到的中间代码进行链接。
45.根据本发明提供的一种虚拟设备生成装置,所述驱动程序的特征信息包括以下项中的至少一项:
46.所述驱动程序初始化过程中的数据信息;
47.所述驱动程序所需要的内存空间的信息;
48.所述驱动程序所需要的配置空间的信息。
49.根据本发明提供的一种虚拟设备生成装置,信息提取模块,具体用于:
50.从所述中间文件中提取初始化函数中的至少一个第一函数,所述第一函数为具有读取功能的函数,获取每个所述第一函数读取的变量,并基于流敏感和路径敏感的程序静态分析,确定所述第一函数读取的变量对应的约束条件,基于所述第一函数读取的变量及对应的约束条件,得到所述驱动程序初始化过程中的数据信息;
51.和/或,
52.从所述中间文件中提取出至少一个第二函数,所述第二函数为具有检查内存空间类型功能的函数,基于程序静态分析,确定所述第二函数检查的内存空间地址及内存空间类型,得到所述驱动程序所需要的内存空间的信息;
53.和/或,
54.从所述中间文件中提取出至少一个第三函数,所述第三函数为具有读取配置空间寄存器功能的函数,基于域敏感、流敏感和路径敏感的程序静态分析,确定所述第三函数的配置空间寄存器的位置、存放在所述配置空间寄存器的变量及对应的约束条件,基于所述第三函数的配置空间寄存器的位置、存放在所述配置空间寄存器的变量及对应的约束条件,得到所述驱动程序所需要的配置空间的信息。
55.根据本发明提供的一种虚拟设备生成装置,还包括:
56.返回值异常确定模块,用于遍历所述初始化函数中的返回指令;当所述返回指令为正数时,确定存在返回值异常;当所述返回指令的返回值为phi节点时,则进行递归,若递归后的基本块的返回值为正数,确定存在返回值异常,若递归后的基本块的返回值为phi节点,则继续递归;当所述返回指令的返回值为调用指令且所调用的函数的返回值为正数时,确定存在返回值异常;
57.和/或,资源泄露确定模块,用于针对所述初始化函数中的每个基本块进行如下处理:遍历所述基本块中的调用指令,当所述基本块中的调用指令所调用的函数为申请资源的函数且当前遍历的路径不是错误处理路径,则预设的计数器加1,当所述基本块中的调用指令所调用的函数为释放资源的函数,则所述计数器减1,其中,所述计数器的初始值为零,当所述基本块遍历完成时,若所述计数器的值不为零,确定存在资源泄露。
58.本发明还提供一种驱动程序测试装置,包括:
59.匹配模块,用于将驱动程序与对应的虚拟设备进行匹配,所述虚拟设备是采用如上述任一种所述的虚拟设备生成方法生成的;
60.第一测试模块,用于在所述虚拟设备下,通过用户态程序,对驱动程序进行第一测试;
61.第二测试模块,用于通过所述虚拟设备,对所述驱动程序进行第二测试。
62.根据本发明提供的一种驱动程序测试装置,第一测试模块,具体用于:通过所述用
户态程序直接向所述驱动程序发起系统调用;
63.和/或,第二测试模块,具体用于:通过所述虚拟设备向所述驱动程序发送中断信号和/或测试用例的数据,其中,所述测试用例的数据用于注入所述虚拟设备的mmio区域和/或dma区域。
64.本发明还提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如上述任一种所述虚拟设备生成方法或者如上述任一种所述驱动程序测试方法。
65.本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如上述任一种所述虚拟设备生成方法或者如上述任一种所述驱动程序测试方法。
66.本发明还提供一种计算机程序产品,包括计算机程序,所述计算机程序被处理器执行时实现如上述任一种所述虚拟设备生成方法或者如上述任一种所述驱动程序测试方法。
67.本发明提供的虚拟设备生成方法,可以对驱动程序的源文件进行编译获得中间文件,该中间文件中包含所述源文件的语义信息,基于此,可以通过程序静态分析从中间文件中提取出驱动程序的特征信息,利用驱动程序的特征信息得到虚拟设备的信息,进而自动化生成虚拟设备,如此,减少了虚拟设备生成的人工参与过程,提升了生成虚拟设备的自动化程度,后续即可用于对驱动程序实施自动化测试,挖掘驱动程序中隐藏的安全问题,预防攻击者利用漏洞发起攻击。
附图说明
68.为了更清楚地说明本发明或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
69.图1是本发明提供的虚拟设备生成方法的流程示意图;
70.图2是本发明提供的驱动程序测试方法的流程示意图;
71.图3是本发明提供的虚拟设备生成装置的结构示意图;
72.图4是本发明提供的驱动程序测试装置的结构示意图;
73.图5是本发明提供的电子设备的结构示意图。
具体实施方式
74.为使本发明的目的、技术方案和优点更加清楚,下面将结合本发明中的附图,对本发明中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
75.图1是本发明提供的虚拟设备生成方法的流程示意图。
76.本实施例提供一种虚拟设备生成方法,如图1所示,包括:
77.步骤101、对驱动程序的源文件进行编译获得中间文件,所述中间文件中包含所述
源文件的语义信息。
78.步骤102、基于程序静态分析从所述中间文件中提取所述驱动程序的特征信息。
79.步骤103、基于所述驱动程序的特征信息,确定虚拟设备的信息。
80.步骤104、基于所述虚拟设备的信息生成虚拟设备,所述生成的虚拟设备用于对所述驱动程序进行测试。
81.实际应用中,可以预先设置虚拟设备的基础框架,将虚拟设备的信息输入虚拟设备的基础框架,则可以生成虚拟设备。基于此,虚拟设备的信息即生成虚拟设备所需的信息。由于虚拟设备是用于对驱动程序进行测试的,因此,虚拟设备的信息是可以基于驱动程序的特征信息得到的,可以将驱动程序的特征信息作为虚拟设备的信息。
82.程序静态分析可以在不运行的情况下,通过词法分析、语法分析、控制流、数据流分析等技术对程序进行分析。在驱动程序的源文件上难以进行程序静态分析,因此,本实施例中,对驱动程序的源文件进行编译获得中间文件,该中间文件中包含源文件的语义信息。然后,基于程序静态分析自动从中间文件中提取驱动程序的特征信息。将驱动程序的特征信息作为虚拟设备的信息。
83.内核是一个操作系统最基本的部分。而驱动程序作为内核的重要组成部分,需要编译进内核,将驱动程序的源文件编译为机器语言形式的目标文件。需要说明的是,上述中间文件并非目标文件,而是介于源文件与目标文件之间的,与目标文件相比,能够保留源文件更多、更原始的语义信息,利于驱动程序的特征信息的全面提取。
84.本实施例的虚拟设备生成方法可以由计算机、平板电脑等电子设备执行,也可以由驱动程序的测试工具执行,例如由模糊测试工具(例如灰盒模糊测试工具)执行。
85.本实施例中,可以对驱动程序的源文件进行编译获得中间文件,该中间文件中包含所述源文件的语义信息,基于此,可以通过程序静态分析从中间文件中提取出驱动程序的特征信息,利用驱动程序的特征信息得到虚拟设备的信息,进而自动化生成虚拟设备,如此,减少了虚拟设备生成的人工参与过程,提升了生成虚拟设备的自动化程度,后续即可用于对驱动程序实施自动化测试,挖掘驱动程序中隐藏的安全问题,预防攻击者利用漏洞发起攻击。
86.在面临大量的驱动程序时,也可以自动化生成大量的虚拟设备,满足测试需求,不需要人工为各驱动程序模拟虚拟设备,大大减少了人工参与的工作量,从而大大提升了工作效率。
87.其中,对驱动程序进行测试时,可以对驱动程序进行灰盒模糊测试,挖掘其中存在的软件安全问题。
88.在示例性实施例中,所述对驱动程序的源文件进行编译获得中间文件,可以包括:若所述驱动程序包含单个所述源文件,将所述源文件编译成中间代码,得到所述中间文件;若所述驱动程序包含多个所述源文件,将所述源文件编译成中间代码,并对每个所述源文件编译得到的中间代码进行链接,得到所述中间文件。
89.上述中间文件包含的是介于源文件的代码与目标文件的代码之间的中间代码。实际应用中,驱动程序可以包括单个源文件,也可以包括多个源文件,由于通过程序静态分析需要对驱动程序进行整体分析,因此,对于包括多个源文件的情况,可以将每个源文件编译得到的中间代码进行链接,最终得到一个中间文件,便于进行程序静态分析。
90.本实施例中,将驱动程序的源文件编译成中间代码之后,对于多个源文件的情况,还可以进一步将每个源文件编译得到的中间代码进行链接最终得到一个所述中间文件,更加利于通过程序静态分析全面提取驱动程序的特征信息。
91.在示例性实施例中,所述将所述源文件编译成中间代码,可以包括:在进行所述驱动程序的内核编译的过程中,识别出符合预设格式的内核编译命令,所述内核编译命令用于将所述源文件编译成目标文件;基于识别出的所述内核编译命令,生成中间代码编译命令;基于所述中间代码编译命令,将所述源文件编译成中间代码。
92.和/或,所述对每个所述源文件编译得到的中间代码进行链接,可以包括:在进行所述驱动程序的内核链接的过程中,识别出用于链接所述驱动程序的链接命令;基于识别出的所述链接命令,生成中间文件链接命令;基于所述中间文件链接命令,将每个所述源文件编译得到的中间代码进行链接。
93.为快速获得中间文件,本实施例借助于内核编译和链接驱动程序的过程来实现。在进行驱动程序的内核编译的过程中,识别出符合预设格式的内核编译命令,该内核编译命令用于将所述源文件编译成目标文件;基于识别出的所述内核编译命令,生成中间代码编译命令,例如,将内核编译命令中目标文件的文件名替换成中间代码的文件名并指定生成的格式为中间文件的格式;基于所述中间代码编译命令,将所述源文件编译成中间代码。进一步的,在进行驱动程序的内核链接的过程中,则可以识别出用于链接所述驱动程序的链接命令,即过滤与驱动程序无关的链接命令;基于识别出的所述链接命令,生成中间文件链接命令;基于所述中间文件链接命令,将每个所述源文件编译得到的中间代码进行链接。
94.需要说明的是,上述进行驱动程序的内核编译和内核链接的过程仍正常进行,仍可以得到驱动程序的目标文件,在此基础上,额外增加了上述获得中间文件的过程。
95.示例性的,进行驱动程序的内核编译和内核链接的工具可以为低级虚拟机(low level virtual machine,llvm)的编译器,可以编译成bitcode文件,相应的,上述中间文件可以为bitcode文件。
96.内核默认的编译过程中只会默认生成结尾后缀为.o的目标文件,但是,通常来讲难以对这些目标文件进行分析,而程序静态分析可以在bitcode文件上进行,所以本实施例提出一种自动化生成bitcode文件的方案。内核中默认提供了allyesconfig选项用于进行全量编译,可以将所有的源文件都编译成为对应的目标文件,但是由于内核中存在多个源文件共同构成一个驱动程序的情况,单纯使用allyesconfig选项进行编译的内核无法将多个有关联的属于同一个驱动程序进行合并分析,从而可能得到不全面的分析结果。所以,本实施例中,可以采用allmonconfig选项进行内核编译,该allmonconfig选项下可以将同一个驱动程序的目标文件链接,同时替换内核编译过程中的编译和链接两个过程,从而达到全面分析的目的,本实施例中获得中间文件的过程可以设置于一个编译脚本中,将环境变量c编译器(即cc)指定为该编译脚本。编译脚本可以执行如下步骤:
97.一、替换内核编译过程:
98.对内核编译命令进行识别,若内核编译命令符合预设格式,比如
“‑
o file_name.o file_name.c”,则确定该内核编译命令是一条生成目标文件的命令,然后,对该内核编译命令的内容进行替换:首先将目标文件的文件名替换成为以.bc结尾的bitcode文件名,然后在该内核编译命令中加入-emit-llvm标志以生成bitcode文件而不是目标文件。通过替换
以上过程,本方案完成了对单个源文件生成bitcode文件的过程。
99.二、替换内核链接过程:
100.对于多个源文件共同组成一个驱动程序的情况,仅仅对单个源文件生成bitcode文件还不够,对此,本实施例进行了特殊的处理,发明人发现在使用allmodconfig选项对内核进行编译时,内核会存在一个默认的链接过程,将属于同一个驱动程序的目标文件归档在一起,本方案利用了这个过程,具体的,对链接命令进行过滤,识别出用于链接所述驱动程序的链接命令,这些链接命令可以从中提取出驱动程序所依赖的目标文件,然后,使用llvm-link指令将这些目标文件对应的bitcode文件链接在一起,形成了最终的驱动程序所对应的bitcode文件。
101.三、替换内核的其他步骤:除了内核的编译过程和链接过程之外,为了保证内核编译的顺利进行,还可以替换内核的归档过程和目标文件拷贝过程为中间文件的归档过程和拷贝过程。
102.如此,通过编译脚本替换内核的编译、链接等过程,可以自动化并且全面地生成驱动程序的源文件所对应的中间文件bitcode文件,从而为后面的程序静态分析过程做好基础准备。
103.需要说明的是,在内核编译过程中采用
“‑
o0”选项,如此,关闭内核的编译优化,减少优化,可以保留源文件更原始的语义信息,利于更好地对驱动程序进行程序静态分析。
104.本实施例借助于内核编译和链接驱动程序的过程来获得中间文件,实现更加简单,可以快速获得中间文件。
105.在示例性实施例中,所述驱动程序的特征信息包括以下项中的至少一项:所述驱动程序初始化过程中的数据信息;所述驱动程序所需要的内存空间的信息;所述驱动程序所需要的配置空间的信息。
106.实际应用中,可以根据实际需要确定驱动程序的特征信息的内容。
107.实施中,驱动程序的操作系统可以为linux,则驱动程序的特征信息可以包括所述驱动程序初始化过程中的数据信息、所述驱动程序所需要的内存空间的信息和所述驱动程序所需要的配置空间的信息。
108.为使得虚拟设备的生成方法具有良好的可移植性,可移植到不同总线下的驱动程序,以及多种操作系统和不同的处理器架构,本方案可以针对不同的目标进行少量额外的定制化分析。
109.支持多种总线下的驱动程序:
110.本方案可以主要针对pci总线下的驱动程序进行分析,同时也可以支持对其他总线下的虚拟设备进行模拟,比如usb总线和i2c总线。
111.对于i2c总线来说,其驱动程序的结构更加简单,相应的,驱动程序的特征信息可以包括所述驱动程序初始化过程中的数据信息,不需要考虑内存空间和配置空间的模拟。
112.而对于usb总线下的驱动程序来说,情况就要更复杂一些。usb总线下的驱动程序仍然要考虑包括数据信息、内存空间和配置空间,并且由于usb设备本身的特性,usb驱动程序的配置空间更加复杂,所以针对usb驱动程序,可以进一步改进程序静态分析的规则,针对usb驱动程序识别出更多的相关配置函数,以满足驱动程序的需要。
113.支持多种操作系统:
114.本方案除适用于linux操作系统,还可以支持android等操作系统。由于这些操作系统使用的驱动程序较为类似,所以可以进行统一的程序静态分析处理,然后使用程序静态分析的结果对相应的虚拟设备进行模拟。
115.支持多种处理器架构:
116.由于本方案采用程序静态分析的方法,可以处理多种处理器架构,包括x86,arm等。对于多种处理器的支持,本方案仅需适应性修改上述编译脚本,使其适应新架构的不同模式的编译命令即可。
117.如此,可适配多种总线下的驱动程序、多种操作系统及多种处理器架构,利用程序静态分析和动态模糊测试相结合的方法对驱动程序进行测试,有利于在不同操作系统、不同处理器架构和不同总线之间的迁移,且不会对本方案的有效性造成影响。
118.在示例性实施例中,所述基于程序静态分析从所述中间文件中提取所述驱动程序的特征信息,可以包括:
119.从所述中间文件中提取初始化函数中的至少一个第一函数,所述第一函数为具有读取功能的函数,获取每个所述第一函数读取的变量,并基于流敏感和路径敏感的程序静态分析,确定所述第一函数读取的变量对应的约束条件,基于所述第一函数读取的变量及对应的约束条件,得到所述驱动程序初始化过程中的数据信息。
120.和/或,
121.从所述中间文件中提取出至少一个第二函数,所述第二函数为具有检查内存空间类型功能的函数,基于程序静态分析,确定所述第二函数检查的内存空间地址及内存空间类型,得到所述驱动程序所需要的内存空间的信息。
122.和/或,
123.从所述中间文件中提取出至少一个第三函数,所述第三函数为具有读取配置空间寄存器功能的函数,基于域敏感、流敏感和路径敏感的程序静态分析,确定所述第三函数的配置空间寄存器的位置、存放在所述配置空间寄存器的变量及对应的约束条件,基于所述第三函数的配置空间寄存器的位置、存放在所述配置空间寄存器的变量及对应的约束条件,得到所述驱动程序所需要的配置空间的信息。
124.为方便理解上述驱动程序的特征信息的提取过程,下面进行举例说明。
125.一、驱动程序初始化过程中的数据信息。
126.具体的,从所述中间文件中提取初始化函数中的至少一个第一函数,例如包括具有读取功能的接口函数和自定义函数,这些第一函数被初始化函数调用,然后找出这些第一函数读取的变量,再利用流敏感及路径敏感的程序静态分析得到此变量需要满足的约束条件,然后基于所述第一函数读取的变量及对应的约束条件,得到所述驱动程序初始化过程中的数据信息,其中按照读取的变量对应的约束条件(例如运算公式)进行求解,求解得到的值和寄存器参数作为驱动程序初始化过程中的数据信息并记录。
127.例如,可以提取readl等具有读取功能的函数,然后对驱动程序中这些函数的返回值进行数据流分析,分析出这些函数读取的变量需要满足的约束条件,然后按照这些约束条件进行求解,最后将求解出的值和寄存器参数同时记录到驱动程序信息中。
128.二、所述驱动程序所需要的内存空间的信息。
129.具体的,从所述中间文件中提取出至少一个第二函数,所述第二函数为具有检查
内存空间类型功能的函数,例如pci_resource_flags函数等,基于程序静态分析,确定所述第二函数检查的内存空间地址及内存空间类型,作为所述驱动程序所需要的内存空间的信息并记录。
130.三、驱动程序所需要的配置空间的信息。
131.具体的,从中间文件中提取出至少一个第三函数,第三函数为具有读取配置空间寄存器功能的函数,例如pci_read_config_byte函数等,基于域敏感、流敏感和路径敏感的程序静态分析,确定所述第三函数的配置空间寄存器的位置、存放在所述配置空间寄存器的变量及对应的约束条件(即对硬件设备配置空间的约束条件),基于所述第三函数的配置空间寄存器的位置、存放在所述配置空间寄存器的变量及对应的约束条件,得到所述驱动程序所需要的配置空间的信息,具体可以求解存放在配置空间寄存器的变量在对应约束条件下的取值,然后将该取值和配置空间寄存器的位置作为驱动程序所需要的配置空间的信息并记录。
132.本实施例中,通过域敏感、路径敏感和流敏感的程序静态分析,可以准确提取驱动程序的特征信息,进而准确得到虚拟设备的信息,从而对虚拟设备进行自动化地模拟。
133.在示例性实施例中,本实施例的虚拟设备生成方法,还可以包括:
134.遍历所述初始化函数中的返回指令;当所述返回指令为正数时,确定存在返回值异常;当所述返回指令的返回值为phi节点时,则进行递归,若递归后的基本块的返回值为正数,确定存在返回值异常,若递归后的基本块的返回值为phi节点,则继续递归;当所述返回指令的返回值为调用指令且所调用的函数的返回值为正数时,确定存在返回值异常;
135.和/或,针对所述初始化函数中的每个基本块进行如下处理:遍历所述基本块中的调用指令,当所述基本块中的调用指令所调用的函数为申请资源的函数且当前遍历的路径不是错误处理路径,则预设的计数器加1,当所述基本块中的调用指令所调用的函数为释放资源的函数,则所述计数器减1,其中,所述计数器的初始值为零,当所述基本块遍历完成时,若所述计数器的值不为零,确定存在资源泄露。
136.实施中,当确定存在返回值异常时,还可以进行报告并记录到分析日志中,当确定存在资源泄露时,也可以进行报告并记录到分析日志中。
137.实际应用中,在对驱动程序进行程序静态分析的过程中,除了可以对驱动程序的特征信息进行提取,同时还可以在这个过程中对驱动程序的一些典型bug进行分析,比如初始化函数的异常返回值和初始化过程中的资源泄露问题。
138.在内核代码中,驱动程序的初始化函数仍然有返回值。如果驱动程序可以正常初始化,则初始化函数会返回0;如果驱动程序初始化失败,则初始化函数会返回为负值的错误码;此外,还有一种特殊情况,如果驱动程序返回一个正数的值,内核仍然会将这次初始化作为成功的初始化。一些驱动程序错误地理解了这个过程,将本该返回负值的初始化函数返回了正数的值,导致内核错误地认为驱动程序初始化成功了,会引发一系列的后续问题,比如错误地释放资源等。对此,本实施例提出了一种程序静态分析方法,可以自动化检测驱动程序初始化函数的异常返回值问题。首先,可以在之前找到驱动程序初始化函数的基础上,对初始化函数的指令进行了遍历,从而找出return指令(即返回指令),通常return指令中包含了多个初始化函数可能的返回值。在找到return指令之后,提取return指令的操作数,然后需要分两种情况进行处理:若return值(即返回值)是一个常量,那么可以直接
对其进行判断,如此常量为正数,则判定当前分支的return点存在异常返回值情况,报告并输出错误;若return值是一条phi节点,这表明这一个return指令是由前面多个基本块汇聚而来,包含了前面多个基本块可能的返回值,所以对于phi节点的每一种可能性,本实施例都进行了递归遍历,处理每一种可能的情况,若递归后的基本块的返回值为正数,确定存在返回值异常,若递归后的基本块的返回值为phi节点,则继续递归;对于return值是call指令(调用指令)的情况,则说明此函数的返回值由其调用的函数所决定,可以进一步对调用的函数进行分析,若调用的函数的返回值为正数,确定存在返回值异常。
139.驱动程序在初始化函数中通常会进行一些资源的初始化操作,但是,若驱动程序在后续的初始化过程中失败了,那么,在退出初始化函数之前需要释放之前申请的资源,否则,就会造成资源的泄露。
140.本实施例中,采用了路径敏感的程序静态分析方法对初始化函数中的资源泄露问题进行了探测。首先,在找出初始化函数的基础上,从初始化函数的最后一个基本块开始进行前向分析,遍历所有基本块。在每一个基本块中,可以对每一条指令进行了遍历,找出其中的call指令,然后判断call指令所调用的函数是否为申请资源的函数,若是,则需进一步判断当前所遍历的路径是否为错误处理路径,因为在错误处理路径中是不需要对资源进行释放的,资源没有申请成功才会进入错误处理路径。若不是错误处理路径,则在对应的计数器上加1,表明申请了这类资源。若call指令所调用的函数为释放资源的函数,则将对应的计数器减1,表明释放了这类资源。本实施例所采取的程序静态分析是路径敏感的,也就是说在初始化函数的所有路径上,只要有一条路径的资源计数器最终不为0,则说明此资源的申请和释放是不平衡的,表明存在资源泄露的漏洞,可以将这个漏洞记录在分析日志中。
141.本实施例中,通过路径敏感的程序静态分析方案对驱动程序的初始化函数进行检查,探测初始化函数是否存在异常的返回值或者资源泄露的问题,实现了自动化检测初始化函数的异常行为,进一步提升了驱动程序的安全性。
142.下面对本发明提供的驱动程序测试方法进行描述,下文描述的驱动程序测试方法与上文描述的虚拟设备生成方法可相互对应参照。
143.如图2所示,本实施例提供一种驱动程序测试方法,包括:
144.步骤201、将驱动程序与对应的虚拟设备进行匹配,所述虚拟设备是采用如上述任一实施例所提供的虚拟设备生成方法生成的。
145.步骤202、在所述虚拟设备下,通过用户态程序,对所述驱动程序进行第一测试。
146.步骤203、通过所述虚拟设备,对所述驱动程序进行第二测试。
147.实际应用中,需要建立驱动程序与虚拟设备的匹配关系,在匹配的虚拟设备下,对驱动程序进行测试。这里,第一测试和第二测试可以是基于遗传算法的模糊测试。
148.在进行第一测试和第二测试之前,可以先生成虚拟设备,其中,生成虚拟设备的具体过程可以参考以上相关实施例,此处不做赘述。
149.本实施例的方案可以由驱动程序的测试工具执行,例如由模糊测试工具(例如灰盒模糊测试工具)执行。
150.本实施例中,将用户态程序侧的用户态输入与硬件设备的输入(即虚拟设备的输入)有机结合起来,可以充分挖掘其中潜在的软件安全问题。
151.在示例性实施例中,所述在所述虚拟设备下,通过用户态程序,对所述驱动程序进
行第一测试,包括:通过所述用户态程序直接向所述驱动程序发起系统调用;
152.和/或,所述通过所述虚拟设备,对所述驱动程序进行第二测试,包括:通过所述虚拟设备向所述驱动程序发送中断信号和/或测试用例的数据,其中,所述测试用例的数据用于注入所述虚拟设备的mmio区域和/或dma区域。
153.实际应用中,可以在虚拟设备中配置mmio区域和/或dma区域。
154.实施中,可以同时对驱动程序的控制流和数据流施加影响,以及同时从用户态程序输入和虚拟设备输入对驱动程序进行数据注入,更加充分地探索驱动程序的代码空间。
155.用户态程序输入改变驱动程序控制流:用户态程序可以通过主动发起系统调用对驱动程序控制流进行改变。不同的系统调用可以使驱动程序探索到不同的代码,以及进入不同的状态。
156.用户态程序输入改变驱动程序数据流:用户态程序输入可以通过两种方式改变驱动程序的数据流,一种是通过系统调用的参数对驱动程序的数据流进行改变,另一种是驱动程序请求用户态程序的输入。
157.虚拟设备输入改变驱动程序控制流:虚拟设备可以向驱动程序主动发起中断信号。如果驱动程序没有对中断信号进行屏蔽,那么中断信号触发的中断处理例程将会打断驱动程序正常的控制流,进而影响整个驱动程序的控制流。
158.虚拟设备输入改变驱动程序数据流:驱动程序在运行过程中会一直和虚拟设备进行交互,虚拟设备会不断地为驱动程序提供输入,而驱动程序则会不断地读取虚拟设备提供的输入,这些输入可能会改变驱动程序的数据流。
159.传统的模糊测试中,模拟出的虚拟设备只具有部分功能,无法满足充分模糊测试驱动程序的需要。本实施例中,对虚拟设备的主要功能进行了模拟,包括mmio、dma、中断等,通过对这些功能的模拟,可以使驱动程序进行正常工作,并成功接收模糊测试工具生成的随机数据,实现了多维度的模糊测试,包括从用户态发起系统调用及从虚拟设备一侧进行随机数据注入,从多个维度对驱动程序进行模糊测试,充分地探索驱动程序的潜在输入空间,发现驱动程序中更多的安全问题。
160.下面以具体的模糊测试的场景为例进行更加详细的介绍。
161.本实施例的模糊测试的场景中包括宿主机,宿主机中包括虚拟机、内核空间和用户空间。其中,虚拟机中包括执行器、内核模块和驱动程序。内核空间包括基于内核的虚拟机(kernel-based virtual machine,kvm)模块。用户空间包括虚拟操作系统模拟器(quick emulator,qemu),具体包括qemu-kvm模块,虚拟总线和虚拟设备。
162.实施中,可以先利用域敏感、流敏感和路径敏感的程序静态分析技术,提取被测的驱动程序的特征信息,以得到虚拟设备的信息,生成虚拟设备。
163.然后,利用自动化分析脚本在内核的编译选项中使能驱动程序,并对内核进行覆盖率插桩。要想对驱动程序进行测试,首先要在内核配置中使能这些驱动程序,将这些驱动程序编译进内核中,然后才能对其进行模糊测试。为了使能这些驱动程序,首先对驱动程序所在目录进行递归扫描,找到对应的makefile的位置,然后从makefile中找出驱动程序对应的配置名称,然后驱动程序对应的配置名称,使用kconfiglib工具解析驱动程序配置所依赖的其他配置,然后在内核中将这些配置全部使能,才能让驱动程序正确编译进内核中。为了对驱动程序的覆盖率进行收集,以便更好地指导模糊测试,可以对整个内核进行了覆
盖率插桩,以在模糊测试过程中收集驱动程序的覆盖率信息,并将这些信息反馈给模糊测试工具(即上述执行器)。
164.测试过程中,执行器直接向驱动程序发起系统调用,通过不同系统调用的组合对驱动程序进行测试,其中,控制流:执行器调用驱动程序,数据流:执行器向驱动程序输入系统调用的参数以及请求的用户态程序的用户数据。执行器还可以向虚拟机的内核模块发送包含中断信息(属于控制流)和测试用例的数据(属于数据流)。内核模块向宿主机内核空间的kvm模块转发包含中断信息和测试用例的超级调用。宿主机内核空间的kvm模块向用户空间的qemu-kvm模块发送中断信息以及测试用例,并达到缓存区。qemu通过虚拟总线遍历生成的虚拟设备,并匹配其名称。如果名称匹配,则向其注入中断信号,强制其对应的驱动程序触发中断处理函数,同时注入测试用例到虚拟设备的mmio区域和dma区域中,由虚拟设备向驱动程序发送测试用例,从虚拟设备一侧对驱动程序进行测试。
165.本实施例中,通过程序静态分析技术从驱动程序中获得生成虚拟设备所需要的信息。然后在内核配置文件中使能这些驱动程序,并对整个内核进行插桩。最后利用生成的虚拟设备,对相应的驱动程序进行多维度的模糊测试,包括从用户态程序、虚拟设备对驱动程序的控制流和数据流进行影响,包括触发中断处理函数等,充分挖掘出驱动程序中的安全问题。
166.下面对本发明提供的虚拟设备生成装置进行描述,下文描述的虚拟设备生成装置与上文描述的虚拟设备生成方法可相互对应参照。
167.如图3所示,本实施例提供一种虚拟设备生成装置,包括:
168.文件获得模块301,用于对驱动程序的源文件进行编译获得中间文件,所述中间文件中包含所述源文件的语义信息;
169.信息提取模块302,用于基于程序静态分析从所述中间文件中提取所述驱动程序的特征信息;
170.信息确定模块303,用于基于所述驱动程序的特征信息,确定虚拟设备的信息;
171.设备生成模块304,用于基于所述虚拟设备的信息生成虚拟设备,所述生成的虚拟设备用于对所述驱动程序进行测试。
172.在示例性实施例中,文件获得模块301,具体用于:
173.若所述驱动程序包含单个所述源文件,将所述源文件编译成中间代码,得到所述中间文件;
174.若所述驱动程序包含多个所述源文件,将所述源文件编译成中间代码,并对每个所述源文件编译得到的中间代码进行链接,得到所述中间文件。
175.在示例性实施例中,文件获得模块301,具体用于:在进行所述驱动程序的内核编译的过程中,识别出符合预设格式的内核编译命令,所述内核编译命令用于将所述源文件编译成目标文件;基于识别出的所述内核编译命令,生成中间代码编译命令;基于所述中间代码编译命令,将所述源文件编译成中间代码;
176.和/或,所述对每个所述源文件编译得到的中间代码进行链接,包括:在进行所述驱动程序的内核链接的过程中,识别出用于链接所述驱动程序的链接命令;基于识别出的所述链接命令,生成中间文件链接命令;基于所述中间文件链接命令,将每个所述源文件编译得到的中间代码进行链接。
177.在示例性实施例中,所述驱动程序的特征信息包括以下项中的至少一项:
178.所述驱动程序初始化过程中的数据信息;
179.所述驱动程序所需要的内存空间的信息;
180.所述驱动程序所需要的配置空间的信息。
181.在示例性实施例中,信息提取模块302,具体用于:
182.从所述中间文件中提取初始化函数中的至少一个第一函数,所述第一函数为具有读取功能的函数,获取每个所述第一函数读取的变量,并基于流敏感和路径敏感的程序静态分析,确定所述第一函数读取的变量对应的约束条件,基于所述第一函数读取的变量及对应的约束条件,得到所述驱动程序初始化过程中的数据信息;
183.和/或,
184.从所述中间文件中提取出至少一个第二函数,所述第二函数为具有检查内存空间类型功能的函数,基于程序静态分析,确定所述第二函数检查的内存空间地址及内存空间类型,得到所述驱动程序所需要的内存空间的信息;
185.和/或,
186.从所述中间文件中提取出至少一个第三函数,所述第三函数为具有读取配置空间寄存器功能的函数,基于域敏感、流敏感和路径敏感的程序静态分析,确定所述第三函数的配置空间寄存器的位置、存放在所述配置空间寄存器的变量及对应的约束条件,基于所述第三函数的配置空间寄存器的位置、存放在所述配置空间寄存器的变量及对应的约束条件,得到所述驱动程序所需要的配置空间的信息。
187.在示例性实施例中,还包括:
188.返回值异常确定模块,用于遍历所述初始化函数中的返回指令;当所述返回指令为正数时,确定存在返回值异常;当所述返回指令的返回值为phi节点时,则进行递归,若递归后的基本块的返回值为正数,确定存在返回值异常,若递归后的基本块的返回值为phi节点,则继续递归;当所述返回指令的返回值为调用指令且所调用的函数的返回值为正数时,确定存在返回值异常;
189.和/或,资源泄露确定模块,用于针对所述初始化函数中的每个基本块进行如下处理:遍历所述基本块中的调用指令,当所述基本块中的调用指令所调用的函数为申请资源的函数且当前遍历的路径不是错误处理路径,则预设的计数器加1,当所述基本块中的调用指令所调用的函数为释放资源的函数,则所述计数器减1,其中,所述计数器的初始值为零,当所述基本块遍历完成时,若所述计数器的值不为零,确定存在资源泄露。
190.下面对本发明提供的驱动程序测试装置进行描述,下文描述的驱动程序测试装置与上文描述的驱动程序测试方法可相互对应参照。
191.如图4所示,本实施例提供一种驱动程序测试装置,包括:
192.匹配模块401,用于将驱动程序与对应的虚拟设备进行匹配,所述虚拟设备是采用如上述任一实施例所提供的虚拟设备生成方法生成的;
193.第一测试模块402,用于在所述虚拟设备下,通过用户态程序,对驱动程序进行第一测试;
194.第二测试模块403,用于通过所述虚拟设备,对所述驱动程序进行第二测试。
195.在示例性实施例中,第一测试模块401,具体用于:在所述虚拟设备下,通过用户态
程序直接向所述驱动程序发起系统调用;
196.和/或,第二测试模块402,具体用于:通过所述虚拟设备向所述驱动程序发送中断信号和/或测试用例的数据,其中,所述测试用例的数据用于注入所述虚拟设备的mmio区域和/或dma区域。
197.图5示例了一种电子设备的实体结构示意图,如图5所示,该电子设备可以包括:处理器(processor)510、通信接口(communications interface)520、存储器(memory)530和通信总线540,其中,处理器510,通信接口520,存储器530通过通信总线540完成相互间的通信。处理器510可以调用存储器530中的逻辑指令,以执行虚拟设备生成方法或者驱动程序测试方法。
198.此外,上述的存储器530中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-only memory)、随机存取存储器(ram,random access memory)、磁碟或者光盘等各种可以存储程序代码的介质。
199.另一方面,本发明还提供一种计算机程序产品,所述计算机程序产品包括计算机程序,计算机程序可存储在非暂态计算机可读存储介质上,所述计算机程序被处理器执行时,计算机能够执行上述各方法所提供的虚拟设备生成方法或者驱动程序测试方法。
200.又一方面,本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现以执行上述各方法提供的虚拟设备生成方法或者驱动程序测试方法。
201.以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
202.通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如rom/ram、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
203.最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献