CN112925524A - 一种检测驱动程序中不安全直接存储器访问的方法及装置 - Google Patents
一种检测驱动程序中不安全直接存储器访问的方法及装置 Download PDFInfo
- Publication number
- CN112925524A CN112925524A CN202110246991.1A CN202110246991A CN112925524A CN 112925524 A CN112925524 A CN 112925524A CN 202110246991 A CN202110246991 A CN 202110246991A CN 112925524 A CN112925524 A CN 112925524A
- Authority
- CN
- China
- Prior art keywords
- direct memory
- memory access
- code
- dma
- driver
- 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.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 70
- 238000004458 analytical method Methods 0.000 claims abstract description 99
- 230000003068 static effect Effects 0.000 claims abstract description 25
- 238000005516 engineering process Methods 0.000 claims description 20
- 238000010206 sensitivity analysis Methods 0.000 claims description 14
- 238000001914 filtration Methods 0.000 claims description 10
- 238000004590 computer program Methods 0.000 claims description 9
- 230000008569 process Effects 0.000 abstract description 9
- 238000001514 detection method Methods 0.000 abstract description 8
- 238000010586 diagram Methods 0.000 description 14
- 230000006870 function Effects 0.000 description 14
- 239000000872 buffer Substances 0.000 description 10
- 238000004891 communication Methods 0.000 description 6
- 238000000547 structure data Methods 0.000 description 6
- 230000014509 gene expression Effects 0.000 description 4
- 230000001360 synchronised effect Effects 0.000 description 4
- 238000013507 mapping Methods 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 206010000117 Abnormal behaviour Diseases 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000001427 coherent effect Effects 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 238000007689 inspection Methods 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000008439 repair process Effects 0.000 description 1
- 238000013522 software testing Methods 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
- 238000012360 testing method Methods 0.000 description 1
- 238000012795 verification Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/14—Protection against unauthorised use of memory or access to memory
- G06F12/1416—Protection against unauthorised use of memory or access to memory by checking the object accessibility, e.g. type of access defined by the memory independently of subject rights
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/37—Compiler construction; Parser generation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/4401—Bootstrapping
- G06F9/4411—Configuring for operating with peripheral devices; Loading of device drivers
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Security & Cryptography (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明提供一种检测驱动程序中不安全直接存储器访问的方法及装置,该方法包括:基于编译器框架对被测驱动程序的源代码进行编译,得到驱动程序中间代码;对所述中间代码采用基于字段的分析算法,识别所述代码中的直接存储器访问操作;基于所述直接存储器访问操作进行静态污点分析,确定被所述直接存储器访问操作所影响的指令,对所述指令进行基于模式的分析,得到候选不安全直接存储器访问;对每个所述候选不安全直接存储器访问的代码路径可达性进行验证,得到不安全直接存储器访问。本发明实施例中的工作过程是自动地,不需要开发者和测试者进行手动工作,从而节省了程序分析的工作量,提升了错误检测的效率。
Description
技术领域
本发明涉及软件测试技术领域,尤其涉及一种检测驱动程序中不安全直接存储器访问的方法及装置。
背景技术
直接存储器访问(Direct Memory Access;DMA)是一种允许硬件设备直接和***内存进行通信的技术,并在现有的驱动程序中被广泛使用。根据数据同步的方式不同,DMA分为两类。第一种是一致性DMA,即在DMA内存申请后,每次DMA访问操作都会自动同步硬件设备和***内存的数据,因此DMA访问的开销较大;第二种是流式DMA,即在DMA内存申请后,硬件设备和***内存的数据需要显式进行同步操作,每次DMA访问不会自动进行同步,因此DMA访问的开销较小。总体来讲,DMA的使用可以避免处理器在硬件通信时的执行开销,使得处理器能够高效执行其他任务,从而提升***的整体性能。
但是,DMA的使用也会带来一定的安全风险。对于流式DMA来讲,在驱动程序进行适当的硬件设备和***内存数据同步情况下,才能访问流式DMA数据,否则会造成硬件设备和***内存数据不一致的问题,容易引发硬件异常行为。对于一致性DMA来讲,由于硬件设备可能出现故障甚至是恶意的,导致DMA数据的内容会是不安全的,因此在使用DMA数据前需要进行适当的检查,否则会造成比较严重的安全问题。例如,使用不安全的DMA数据作为数组索引,可能导致缓冲区溢出的发生。因此,需要对驱动程序中不安全DMA访问进行有效检测,以提高驱动程序的安全性。
为了检测该类错误,开发者往往需要手动阅读驱动程序代码,然后根据经验来识别DMA访问并检查其安全性。但是,由于每个DMA访问操作被实现为正常的内存访问操作,而非像访问硬件寄存器那样来调用特殊的内核函数,因此手动识别DMA访问操作比较困难。而且,由于驱动程序的代码量较大、代码逻辑复杂、函数调用层数较多等原因,手动检查DMA访问的安全性比较困难。此外,由于代码路径中存在很多指令,且指令间的数据依赖关系比较复杂,很难手动判定潜在错误的代码路径可达性,从而会引入较多的误报。鉴于以上三点,手动检测不安全DMA访问的方式往往费时费力,且容易出现大量漏报和误报。
现有的自动化静态分析方法往往只关注空指针解引用和释放后使用等一般性代码缺陷,而缺少对DMA访问的识别和检查,因此无法检测驱动程序中不安全DMA访问。
因此,设计一种良好的自动检测驱动程序中不安全DMA访问的方法成为了操作***开发和测试中亟待解决的问题。
发明内容
本发明提供及一种检测驱动程序中不安全直接存储器访问的方法及装置,用以解决现有技术中无法很好的检测驱动程序中不安全DMA访问的问题。
本发明提供一种检测驱动程序中不安全直接存储器访问的方法,包括:
基于编译器框架对被测驱动程序的源代码进行编译,得到驱动程序中间代码;
对所述中间代码采用基于字段的分析算法,识别所述代码中的直接存储器访问操作;
基于所述直接存储器访问操作进行静态污点分析,确定被所述直接存储器访问操作所影响的指令,对所述指令进行基于模式的分析,得到候选不安全直接存储器访问;
对每个所述候选不安全直接存储器访问的代码路径可达性进行验证,得到不安全直接存储器访问。
根据本发明提供的一种检测驱动程序中不安全直接存储器访问的方法,对所述中间代码采用基于字段的分析算法,识别所述代码中的直接存储器访问操作的步骤,具体包括:
对所述中间代码中每个内存访问操作的访问变量进行分析;
将目标访问变量对应的内存访问操作,识别为直接存储器访问操作;
其中,所述目标访问变量是指结构体数据类型和字段信息与预设记录信息相匹配的访问变量。
根据本发明提供的一种检测驱动程序中不安全直接存储器访问的方法,基于所述直接存储器访问操作进行静态污点分析,确定被所述直接存储器访问操作所影响的指令的步骤,具体包括:
通过流敏感分析技术和上下文敏感分析技术,对所述直接存储器访问操作进行分析,确定被所述直接存储器访问操作所影响的指令。
根据本发明提供的一种检测驱动程序中不安全直接存储器访问的方法,对所述指令进行基于模式的分析,得到候选不安全直接存储器访问的步骤,具体包括:
对所述指令进行基于一致性模式的分析和基于流式模式的分析,得到候选不安全直接存储器访问;
其中,所述基于一致性模式的分析具体是,分析所述指令是否在直接存储器数据同步的情况下进行;
其中,所述基于流式模式的分析具体是在所述指令在被用作数组索引、指针访问的偏移量或循环条件变量之前,对所述指令进行预先检查。
根据本发明提供的一种检测驱动程序中不安全直接存储器访问的方法,对每个所述候选不安全直接存储器访问的代码路径可达性进行验证,得到不安全直接存储器访问的步骤,具体包括:
将所述代码路径中的每个指令翻译成条件约束;
基于约束求解器,验证所述条件约束是否可以同时满足;
将条件约束无法同时满足的代码路径作为过滤代码路径,将所述过滤代码路径对应的候选不安全直接存储器访问进行过滤,得到不安全直接存储器访问。
本发明还提供一种检测驱动程序中不安全直接存储器访问的装置,包括:
代码编译器,用于基于编译器框架对被测驱动程序的源代码进行编译,得到驱动程序中间代码;
直接存储器访问识别器,用于对所述中间代码采用基于字段的分析算法,识别所述代码中的直接存储器访问操作;
直接存储器访问检查器,用于基于所述直接存储器访问操作进行静态污点分析,确定被所述直接存储器访问操作所影响的指令,对所述指令进行基于模式的分析,得到候选不安全直接存储器访问;
代码路径验证器,用于对每个所述候选不安全直接存储器访问的代码路径可达性进行验证,得到不安全直接存储器访问。
所述直接存储器访问识别器,具体用于:
对所述中间代码中每个内存访问操作的访问变量进行分析;
将目标访问变量对应的内存访问操作,识别为直接存储器访问操作;
其中,所述目标访问变量是指结构体数据类型和字段信息与预设记录信息相匹配的访问变量。
所述直接存储器访问检查器,具体用于:
通过流敏感分析技术和上下文敏感分析技术,对所述直接存储器访问操作进行分析,确定被所述直接存储器访问操作所影响的指令。
本发明还提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如上述任一种所述检测驱动程序中不安全直接存储器访问的方法的步骤。
本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如上述任一种所述检测驱动程序中不安全直接存储器访问的方法的步骤。
本发明提供的一种检测驱动程序中不安全直接存储器访问的方法及装置,通过利用基于字段的分析算法对驱动程序中间代码进行分析,能够自动准确地识别DMA访问操作;而且,通过利用静态污点分析和基于模式的分析技术,能够较为全面准确地发现和检查与DMA访问数据相关的指令,有效发现不安全DMA访问;同时,该方法利用约束求解器来检查相关代码路径,可有效提升错误检测的准确性。最后,该方法能够生成比较详细的错误报告,以方便开发者和测试者进行阅读和检查。并且本发明实施例中的工作过程是自动地,不需要开发者和测试者进行手动工作,从而节省了程序分析的工作量,提升了错误检测的效率。
附图说明
为了更清楚地说明本发明或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例提供的检测驱动程序中不安全直接存储器访问的方法的流程示意图;
图2为本发明实施例提供的对驱动程序源代码的编译流程图;
图3为本发明实施例提供的基于字段的分析算法的伪代码图;
图4为本发明实施例提供的静态污点分析的伪代码图;
图5为本发明实施例中所描述的基于模式的分析技术对于流式DMA访问检查的示例图;
图6为本发明实施例所描述的基于模式的分析技术对于一致性DMA访问检查的示例图;
图7为本发明实施例提供的基于约束求解的路径检查技术的工作流程图;
图8为本发明实施例中所描述的自动检测驱动程序中不安全DMA访问的方法的总体结构示意图;
图9为本发明实施例中所描述的检测驱动程序中不安全直接存储器访问的装置的结构示意图;
图10为本发明提供的电子设备的实体结构示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合本发明中的附图,对本发明中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
图1是本发明实施例提供的检测驱动程序中不安全直接存储器访问的方法的流程示意图,如图1所示,包括:
步骤S1,基于编译器框架对被测驱动程序的源代码进行编译,得到驱动程序中间代码;
具体的,由于驱动程序的源代码通常由C语言编写,但是由于C语言的语法灵活且形式多变,所以很难直接对其进行程序分析。
本发明实施例中所描述的编译器框架具体可以是指LLVM编译器架构,其可以完整支持C语言编译,并且能够生成便于程序分析的中间代码。
图2为本发明实施例提供的对驱动程序源代码的编译流程图,如图2所示,主要分为两步:
首先,使用LLVM提供的前端编译器Clang,对驱动程序的每个源代码文件进行编译,生成对应的中间代码文件。
然后,分析和记录每个中间代码文件中的函数信息,便于后续进行跨文件函数调用的分析。
步骤S2,对所述中间代码采用基于字段的分析算法,识别所述代码中的直接存储器访问操作;
在驱动代码中,每个DMA访问操作被实现为正常的内存访问操作,而非像访问硬件寄存器那样来调用特殊的内核函数,因此自动识别DMA访问操作比较困难。
本发明实施例中所描述的基于字段的分析算法具体分为两个阶段。
第一个阶段是DMA内存申请的信息记录,首先,找到DMA内存申请函数的调用位置,并记录函数返回值所赋予变量的基本信息。在驱动代码中,大多数被创建的DMA内存缓冲区用结构体成员变量来表示,该步骤主要记录该变量的结构体数据类型和字段信息,来标识DMA内存缓冲区。然后,根据结构体数据类型和字段信息,使用基于字段的分析方法来识别代码中的DMA访问操作。
第二个阶段是DMA访问操作的识别,具体来讲,对于一个内存访问操作,如果其被访问变量是结构体成员变量,并且其结构体数据类型和字段信息与记录的信息相匹配,则该内存访问被识别为DMA访问操作。
步骤S3,基于所述直接存储器访问操作进行静态污点分析,确定被所述直接存储器访问操作所影响的指令,对所述指令进行基于模式的分析,得到候选不安全直接存储器访问;
本发明实施例中行所描述的静态污点分析具体是以每个DMA访问操作为分析起点进行分析,该静态污点分析算法是流敏感和上下文敏感的,因此可以识别出被直接存储器访问操作所影响的指令。
本发明实施例中所描述的基于模式的分析根据常见的不安全DMA访问模式,具体是指分别对流式DMA访问模式和一致性DMA访问模式进行分析将报告可能的不安全DMA访问,将可能的不安全DMA访问,作为候选不安全直接存储器访问。
本发明实施例中所描述的候选不安全直接存储器访问中包括DMA访问的位置和代码路径,以及对应的源代码文件名称和行号等详细信息。
该分析技术所报告的每个可能的不安全DMA访问,包括DMA访问的位置和代码路径,以及对应的源代码文件名称和行号等详细信息。
步骤S4,对每个所述候选不安全直接存储器访问的代码路径可达性进行验证,得到不安全直接存储器访问。
本发明实施例中所描述的代码路径是指每个可能的不安全DMA访问中包括的内容。
本发明实施例中进行验证的具体过程就是指利用基于约束求解的路径检查技术,将其代码路径中每个指令翻译成条件约束,然后利用约束求解器验证这些约束是否可以同时满足,如果无法满足,则该不安全DMA访问会被当作误报被过滤掉,得到过滤后的不安全直接存储器访问。
本发明实施例通过利用基于字段的分析算法对驱动程序中间代码进行分析,能够自动准确地识别DMA访问操作;而且,通过利用静态污点分析和基于模式的分析技术,能够较为全面准确地发现和检查与DMA访问数据相关的指令,有效发现不安全DMA访问;同时,该方法利用约束求解器来检查相关代码路径,可有效提升错误检测的准确性。最后,该方法能够生成比较详细的错误报告,以方便开发者和测试者进行阅读和检查。并且本发明实施例中的工作过程是自动地,不需要开发者和测试者进行手动工作,从而节省了程序分析的工作量,提升了错误检测的效率。
基于上述任一实施例,对所述中间代码采用基于字段的分析算法,识别所述代码中的直接存储器访问操作的步骤,具体包括:
对所述中间代码中每个内存访问操作的访问变量进行分析;
将目标访问变量对应的内存访问操作,识别为直接存储器访问操作;
其中,所述目标访问变量是指结构体数据类型和字段信息与预设记录信息相匹配的访问变量。
具体的,本发明实施例中对于中代码采用基于字段的分析算法。首先,找到DMA内存申请函数的调用位置,并记录函数返回值所赋予变量的基本信息。在驱动代码中,大多数被创建的DMA内存缓冲区用结构体成员变量来表示,该步骤主要记录该变量的结构体数据类型和字段信息,来标识DMA内存缓冲区。然后,根据结构体数据类型和字段信息,使用基于字段的分析方法来识别代码中的DMA访问操作。
具体来讲,对于一个内存访问操作,如果其被访问变量是结构体成员变量,并且其结构体数据类型和字段信息与记录的信息相匹配,则该内存访问被识别为DMA访问操作。
本发明实施例中所描述的预设记录信息是指DMA内存申请的信息记录。
图3为本发明实施例提供的基于字段的分析算法的伪代码图,如图3所示,基于字段的分析算法分为两个阶段:
(1)DMA内存申请的信息记录,过程如图3中的(a)所示。集合dma_var_set用来记录创建的DMA内存变量信息,集合dma_struct_set用来记录创建的DMA内存变量的结构体成员信息,包括结构体类型和字段信息。该阶段将dma_var_set和dma_struct_set初始化为空集,然后分析驱动代码中的每个函数调用call。如果call用来申请DMA内存缓冲区,则继续处理该函数调用。
首先,得到call返回值赋值的变量ret_var,并利用别名分析得到与ret_var别名的变量集合var_set。然后,分析var_set中的每个变量var,将其加入集合dma_var_set,并得到var的结构体类型和字段信息struct_info。如果var是结构体,则struct_info不为空,将struct_info加入集合dma_struct_set。
(2)DMA访问操作的识别,过程如图3中的(b)所示。集合dma_access_set用来记录识别出的DMA访问指令。该阶段将dma_access_set初始化为空集,然后分析驱动代码中的每个指令inst。如果inst是内存读写指令,即LLVM中的load或store指令,则继续处理该指令。首先,得到inst指令访问的变量var,并得到var的结构体类型和字段信息struct_info。如果var不是结构体成员变量,则struct_info为空。然后,如果var存在于集合dma_var_set中,或者struct_info存在于集合dma_struct_set中,则表明var是DMA访问数据。在这种情况下,得到与var别名的变量集合var_set,以及访问var_set中变量的指令集合inst_set,并将inst_set加入集合dma_access_set。
本发明实施例通过基于字段的分析算法,能够自动准确地识别DMA访问操作,有利于后续进一步检测驱动程序中是否存在不安全的直接存储器访问。
基于上述任一实施例,基于所述直接存储器访问操作进行静态污点分析,确定被所述直接存储器访问操作所影响的指令的步骤,具体包括:
通过流敏感分析技术和上下文敏感分析技术,对所述直接存储器访问操作进行分析,确定被所述直接存储器访问操作所影响的指令。
对所述指令进行基于模式的分析,得到候选不安全直接存储器访问的步骤,具体包括:
对所述指令进行基于一致性模式的分析和基于流式模式的分析,得到候选不安全直接存储器访问;
其中,所述基于一致性模式的分析具体是,分析所述指令是否在直接存储器数据同步的情况下进行;
其中,所述基于流式模式的分析具体是在所述指令在被用作数组索引、指针访问的偏移量或循环条件变量之前,对所述指令进行预先检查。
具体的,本发明实施例以每个DMA访问操作为分析起点,利用静态污点分析和基于模式的分析技术,找到并检查被DMA访问数据影响的指令。具体来讲,静态污点分析是流敏感和上下文敏感的,以提升分析的准确性。基于模式的分析技术根据常见的不安全DMA访问模式,对DMA访问数据影响的指令进行检查。具体来讲,对于流式DMA访问,该分析技术检查该访问是否在适当DMA数据同步的情况下进行;如果不是,则该DMA访问可能引起硬件设备和***内存的数据不一致问题,因此该分析技术将报告可能的不安全DMA访问。对于一致性DMA访问,该分析技术检查访问的DMA数据在被用作数组索引、指针访问的偏移量和循环条件变量等之前,被适当地检查;如果不是,则该DMA访问可能引起缓冲区溢出、非法指针访问和无限循环等安全问题,因此该分析技术将报告可能的不安全DMA访问。该分析技术所报告的每个可能的不安全DMA访问,包括DMA访问的位置和代码路径,以及对应的源代码文件名称和行号等详细信息。
图4为本发明实施例提供的静态污点分析的伪代码图,如图4所示,该分析负责计算代码路径code_path中被DMA访问dma_access影响的变量集合var_set和指令集合inst_set。为了提高污点分析的准确性,该分析是流敏感和上下文敏感的。该分析将var_set和inst_set初始化为空集,并得到dma_access访问的变量taint_var,再将taint_var和dma_access分别加入集合var_set和inst_set,之后依照指令执行顺序分析代码路径code_path中的每个指令inst。首先,得到指令inst的返回值变量res_var,如果inst没有返回值,则inst为空。然后,得到指令inst的操作变量集合op_var_set。如果op_var_set和var_set交集不为空,证明inst被DMA访问数据影响,则将inst加入集合inst_set。在这种情况下,如果res_var不为空,该变量也被DMA访问数据影响,则res_var加入集合var_set。
根据识别出的DMA访问以及找到的被DMA访问影响的指令,本发明利用基于模式的分析技术来检测可能的不安全的DMA访问。该分析技术分为两个部分,分别对流式DMA访问和一致性DMA访问进行检查。
图5为本发明实施例中所描述的基于模式的分析技术对于流式DMA访问检查的示例图,如图5所示,对于流式DMA访问,它必须发生在DMA映射和解映射之间,而且在DMA数据与硬件设备和处理器进行同步之间;否则会导致硬件设备和处理器数据不一致的情况。基于这个规则,该分析主要检查四种可能出现问题的模式,如图5所示。模式1和模式2采用前向流敏感分析,分别检查DMA映射函数调用和DMA数据同步开始之后,是否直接访问了DMA数据内容;如果是,则报告可能的不安全DMA访问。模式3和模式4采用反向流敏感分析,分别检查DMA解映射函数调用和DMA数据同步结束之前,是否直接访问了DMA数据内容;如果是,则报告可能的不安全DMA访问。
对于一致性DMA访问,它访问的数据在被驱动程序使用前,必须经过适当的检查。具体来讲,如果访问的DMA数据在被用作数组索引、指针访问的偏移量和循环条件变量等之前,没有被适当检查,则该DMA访问可能引起缓冲区溢出、非法指针访问和无限循环等安全问题。
图6为本发明实施例所描述的基于模式的分析技术对于一致性DMA访问检查的示例图,如图6中的(a)所示,局部变量read由DMA访问数据得到,并且该变量用于循环条件;因此该分析识别出DMA访问数据可能被修改,使得变量read的值一直不为零,从而导致无限循环;如图6中的(b)所示,局部变量frame_type被DMA访问数据影响,并且作为数组frame_types的索引;因此,该分析识别出DMA访问数据可能被修改,使得frame_type的值超过frame_types的长度,从而导致缓冲区溢出。如图6中的(c)所示,局部变量pkt_len被DMA访问数据影响,并且作为指针xdp.data的偏移量来访问指针数据;因此因此该分析识别出DMA访问数据可能被修改,使得变量pkt_len的值过大,从而导致非法指针访问。
本发明实施例通过利用静态污点分析和基于模式的分析技术,能够较为全面准确地发现和检查与DMA访问数据相关的指令,有效发现不安全DMA访问。
基于上述任一实施例,对每个所述候选不安全直接存储器访问的代码路径可达性进行验证,得到不安全直接存储器访问的步骤,具体包括:
将所述代码路径中的每个指令翻译成条件约束;
基于约束求解器,验证所述条件约束是否可以同时满足;
将条件约束无法同时满足的代码路径作为过滤代码路径,将所述过滤代码路径对应的候选不安全直接存储器访问进行过滤,得到不安全直接存储器访问。
具体的,本发明实施例使用了基于约束求解的路径检查技术,对每个可能的不安全DMA访问的代码路径进行验证,过滤掉误报。
图7为本发明实施例提供的基于约束求解的路径检查技术的工作流程图,如图7所示,该工作流程,主要分为三个阶段。对于每个可能的不安全DMA访问,该技术首先将其代码路径中的每个指令翻译成约束求解器指定格式的约束表达式。然后,根据发生安全问题的模式,添加额外的约束表达式。例如,对于缓冲区溢出,添加frame_type>4的约束表达式,表明数组越界发生的条件。最好,将以上约束表达式传入约束求解器进行求解;如果不存在同时满足这些约束的解,则证明代码路径不可达,则该安全DMA访问被认为是误报,并被自动过滤掉。
通过本发明实施例中的自动检测驱动程序中不安全DMA访问的方法,开发者和测试者能够方便准确地发现驱动程序中存在的不安全DMA访问,然后对其进行及时修复,从而提升驱动程序的安全性。而且该方法的工作过程是自动的,不需要开发者和测试者手动分析和修改被测驱动程序的源代码,大大减少了人为工作量。
图8为本发明实施例中所描述的自动检测驱动程序中不安全DMA访问的方法的总体结构示意图,如图8所示,代码编译器负责将被测驱动程序的C语言源代码编译生成中间代码,并分析和记录每个中间代码文件中的函数信息,便于后续的静态分析;DMA访问识别器负责对中间代码进行分析,找出驱动代码中的DMA访问操作;DMA访问检查器负责对中间代码和DMA访问操作进行分析和检查,发现可能的不安全DMA访问;代码路径验证器负责对可能的不安全DMA访问的代码路径进行验证,过滤掉误报,并生成最终的错误报告。该错误报告包含了不安全DMA访问的位置和代码路径,以及对应的源代码文件名称和行号等详细信息。
图9为本发明实施例中所描述的检测驱动程序中不安全直接存储器访问的装置的结构示意图,如图9所示,包括:代码编译器910、直接存储器访问识别器920、直接存储器访问检查器930和代码路径验证器940;其中,代码编译器910用于基于编译器框架对被测驱动程序的源代码进行编译,得到驱动程序中间代码;其中,直接存储器访问识别器920用于对所述中间代码采用基于字段的分析算法,识别所述代码中的直接存储器访问操作;其中,直接存储器访问检查器930用于基于所述直接存储器访问操作进行静态污点分析,确定被所述直接存储器访问操作所影响的指令,对所述指令进行基于模式的分析,得到候选不安全直接存储器访问;其中,代码路径验证器940用于对每个所述候选不安全直接存储器访问的代码路径可达性进行验证,得到不安全直接存储器访问。
所述直接存储器访问识别器,具体用于:
对所述中间代码中每个内存访问操作的访问变量进行分析;
将目标访问变量对应的内存访问操作,识别为直接存储器访问操作;
其中,所述目标访问变量是指结构体数据类型和字段信息与预设记录信息相匹配的访问变量。
所述直接存储器访问检查器,具体用于:
通过流敏感分析技术和上下文敏感分析技术,对所述直接存储器访问操作进行分析,确定被所述直接存储器访问操作所影响的指令。
本发明实施例通过利用基于字段的分析算法对驱动程序中间代码进行分析,能够自动准确地识别DMA访问操作;而且,通过利用静态污点分析和基于模式的分析技术,能够较为全面准确地发现和检查与DMA访问数据相关的指令,有效发现不安全DMA访问;同时,该方法利用约束求解器来检查相关代码路径,可有效提升错误检测的准确性。最后,该方法能够生成比较详细的错误报告,以方便开发者和测试者进行阅读和检查。并且本发明实施例中的工作过程是自动地,不需要开发者和测试者进行手动工作,从而节省了程序分析的工作量,提升了错误检测的效率。
图10为本发明提供的电子设备的实体结构示意图,如图10所示,该电子设备可以包括:处理器(processor)1010、通信接口(Communications Interface)1020、存储器(memory)1030和通信总线1040,其中,处理器1010,通信接口1020,存储器1030通过通信总线1040完成相互间的通信。处理器1010可以调用存储器1030中的逻辑指令,以执行检测驱动程序中不安全直接存储器访问的方法,该方法包括:基于编译器框架对被测驱动程序的源代码进行编译,得到驱动程序中间代码;对所述中间代码采用基于字段的分析算法,识别所述代码中的直接存储器访问操作;基于所述直接存储器访问操作进行静态污点分析,确定被所述直接存储器访问操作所影响的指令,对所述指令进行基于模式的分析,得到候选不安全直接存储器访问;对每个所述候选不安全直接存储器访问的代码路径可达性进行验证,得到不安全直接存储器访问。
此外,上述的存储器1030中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
另一方面,本发明还提供一种计算机程序产品,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,计算机能够执行上述各方法所提供的检测驱动程序中不安全直接存储器访问的方法,该方法包括:基于编译器框架对被测驱动程序的源代码进行编译,得到驱动程序中间代码;对所述中间代码采用基于字段的分析算法,识别所述代码中的直接存储器访问操作;基于所述直接存储器访问操作进行静态污点分析,确定被所述直接存储器访问操作所影响的指令,对所述指令进行基于模式的分析,得到候选不安全直接存储器访问;对每个所述候选不安全直接存储器访问的代码路径可达性进行验证,得到不安全直接存储器访问。
又一方面,本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现以执行上述各实施例提供的检测驱动程序中不安全直接存储器访问的方法,该方法包括:基于编译器框架对被测驱动程序的源代码进行编译,得到驱动程序中间代码;对所述中间代码采用基于字段的分析算法,识别所述代码中的直接存储器访问操作;基于所述直接存储器访问操作进行静态污点分析,确定被所述直接存储器访问操作所影响的指令,对所述指令进行基于模式的分析,得到候选不安全直接存储器访问;对每个所述候选不安全直接存储器访问的代码路径可达性进行验证,得到不安全直接存储器访问。
以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
Claims (10)
1.一种检测驱动程序中不安全直接存储器访问的方法,其特征在于,包括:
基于编译器框架对被测驱动程序的源代码进行编译,得到驱动程序中间代码;
对所述中间代码采用基于字段的分析算法,识别所述代码中的直接存储器访问操作;
基于所述直接存储器访问操作进行静态污点分析,确定被所述直接存储器访问操作所影响的指令,对所述指令进行基于模式的分析,得到候选不安全直接存储器访问;
对每个所述候选不安全直接存储器访问的代码路径可达性进行验证,得到不安全直接存储器访问。
2.根据权利要求1所述检测驱动程序中不安全直接存储器访问的方法,其特征在于,对所述中间代码采用基于字段的分析算法,识别所述代码中的直接存储器访问操作的步骤,具体包括:
对所述中间代码中每个内存访问操作的访问变量进行分析;
将目标访问变量对应的内存访问操作,识别为直接存储器访问操作;
其中,所述目标访问变量是指结构体数据类型和字段信息与预设记录信息相匹配的访问变量。
3.根据权利要求1所述检测驱动程序中不安全直接存储器访问的方法,其特征在于,基于所述直接存储器访问操作进行静态污点分析,确定被所述直接存储器访问操作所影响的指令的步骤,具体包括:
通过流敏感分析技术和上下文敏感分析技术,对所述直接存储器访问操作进行分析,确定被所述直接存储器访问操作所影响的指令。
4.根据权利要求1所述检测驱动程序中不安全直接存储器访问的方法,其特征在于,对所述指令进行基于模式的分析,得到候选不安全直接存储器访问的步骤,具体包括:
对所述指令进行基于一致性模式的分析和基于流式模式的分析,得到候选不安全直接存储器访问;
其中,所述基于一致性模式的分析具体是,分析所述指令是否在直接存储器数据同步的情况下进行;
其中,所述基于流式模式的分析具体是在所述指令在被用作数组索引、指针访问的偏移量或循环条件变量之前,对所述指令进行预先检查。
5.根据权利要求1所述检测驱动程序中不安全直接存储器访问的方法,其特征在于,对每个所述候选不安全直接存储器访问的代码路径可达性进行验证,得到不安全直接存储器访问的步骤,具体包括:
将所述代码路径中的每个指令翻译成条件约束;
基于约束求解器,验证所述条件约束是否可以同时满足;
将条件约束无法同时满足的代码路径作为过滤代码路径,将所述过滤代码路径对应的候选不安全直接存储器访问进行过滤,得到不安全直接存储器访问。
6.一种检测驱动程序中不安全直接存储器访问的装置,其特征在于,包括:
代码编译器,用于基于编译器框架对被测驱动程序的源代码进行编译,得到驱动程序中间代码;
直接存储器访问识别器,用于对所述中间代码采用基于字段的分析算法,识别所述代码中的直接存储器访问操作;
直接存储器访问检查器,用于基于所述直接存储器访问操作进行静态污点分析,确定被所述直接存储器访问操作所影响的指令,对所述指令进行基于模式的分析,得到候选不安全直接存储器访问;
代码路径验证器,用于对每个所述候选不安全直接存储器访问的代码路径可达性进行验证,得到不安全直接存储器访问。
7.根据权利要求6所述检测驱动程序中不安全直接存储器访问的装置,其特征在于,所述直接存储器访问识别器,具体用于:
对所述中间代码中每个内存访问操作的访问变量进行分析;
将目标访问变量对应的内存访问操作,识别为直接存储器访问操作;
其中,所述目标访问变量是指结构体数据类型和字段信息与预设记录信息相匹配的访问变量。
8.根据权利要求6所述检测驱动程序中不安全直接存储器访问的装置,其特征在于,所述直接存储器访问检查器,具体用于:
通过流敏感分析技术和上下文敏感分析技术,对所述直接存储器访问操作进行分析,确定被所述直接存储器访问操作所影响的指令。
9.一种电子设备,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现如权利要求1至5任一项所述检测驱动程序中不安全直接存储器访问的方法的步骤。
10.一种非暂态计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至5任一项所述检测驱动程序中不安全直接存储器访问的方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110246991.1A CN112925524A (zh) | 2021-03-05 | 2021-03-05 | 一种检测驱动程序中不安全直接存储器访问的方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110246991.1A CN112925524A (zh) | 2021-03-05 | 2021-03-05 | 一种检测驱动程序中不安全直接存储器访问的方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN112925524A true CN112925524A (zh) | 2021-06-08 |
Family
ID=76171676
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110246991.1A Pending CN112925524A (zh) | 2021-03-05 | 2021-03-05 | 一种检测驱动程序中不安全直接存储器访问的方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112925524A (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115408007A (zh) * | 2022-09-06 | 2022-11-29 | 清华大学 | 虚拟设备生成、驱动程序测试方法、装置、设备及介质 |
CN115617410A (zh) * | 2022-11-01 | 2023-01-17 | 清华大学 | 驱动接口识别方法、装置、设备及存储介质 |
CN116069669A (zh) * | 2023-03-07 | 2023-05-05 | 中国科学技术大学 | 全自动分布式一致性的分析方法、***、设备及存储介质 |
-
2021
- 2021-03-05 CN CN202110246991.1A patent/CN112925524A/zh active Pending
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115408007A (zh) * | 2022-09-06 | 2022-11-29 | 清华大学 | 虚拟设备生成、驱动程序测试方法、装置、设备及介质 |
CN115617410A (zh) * | 2022-11-01 | 2023-01-17 | 清华大学 | 驱动接口识别方法、装置、设备及存储介质 |
CN115617410B (zh) * | 2022-11-01 | 2023-09-19 | 清华大学 | 驱动接口识别方法、装置、设备及存储介质 |
CN116069669A (zh) * | 2023-03-07 | 2023-05-05 | 中国科学技术大学 | 全自动分布式一致性的分析方法、***、设备及存储介质 |
CN116069669B (zh) * | 2023-03-07 | 2023-06-16 | 中国科学技术大学 | 全自动分布式一致性的分析方法、***、设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP5430570B2 (ja) | システムコールカバレッジ基準による試験スイート削減のための方法 | |
US9158514B2 (en) | Method and apparatus for providing change-related information | |
US8386851B2 (en) | Functional coverage using combinatorial test design | |
CN112925524A (zh) | 一种检测驱动程序中不安全直接存储器访问的方法及装置 | |
US8732669B2 (en) | Efficient model checking technique for finding software defects | |
US9898387B2 (en) | Development tools for logging and analyzing software bugs | |
US9569345B2 (en) | Architectural failure analysis | |
US20080244536A1 (en) | Evaluating static analysis results using code instrumentation | |
US8397104B2 (en) | Creation of test plans | |
US20130014093A1 (en) | Code inspection executing system for performing a code inspection of abap source codes | |
US8645761B2 (en) | Precise fault localization | |
CN113497809B (zh) | 基于控制流和数据流分析的mips架构漏洞挖掘方法 | |
KR101979329B1 (ko) | 바이너리의 취약점을 유발하는 입력데이터 위치 추적 방법 및 그 장치 | |
CN110704304A (zh) | 一种应用程序测试方法、装置、存储介质和服务器 | |
CN111124870A (zh) | 一种接口测试方法及装置 | |
JP2015011372A (ja) | デバッグ支援システム、方法、プログラム及び記録媒体 | |
US9176846B1 (en) | Validating correctness of expression evaluation within a debugger | |
JP2013218492A (ja) | ソフトウェアテスト自動評価装置および方法 | |
US20130152205A1 (en) | Interactive analysis of a security specification | |
CN115657981A (zh) | 验证环境中的打印信息的打印等级的设置方法及验证方法 | |
CN110633204B (zh) | 一种程序缺陷检测方法及装置 | |
WO2023145165A1 (ja) | プログラム検査装置、及びプログラム検査方法 | |
Yousaf et al. | Efficient Identification of Race Condition Vulnerability in C code by Abstract Interpretation and Value Analysis | |
CN118153054A (zh) | 代码漏洞确定方法及装置 | |
CN111611153B (zh) | 一种用户界面过度绘制的检测方法和装置 |
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 |