CN114595148A - 一种基于数据流传播分析的Java空指针引用检测方法及系统 - Google Patents

一种基于数据流传播分析的Java空指针引用检测方法及系统 Download PDF

Info

Publication number
CN114595148A
CN114595148A CN202210202341.1A CN202210202341A CN114595148A CN 114595148 A CN114595148 A CN 114595148A CN 202210202341 A CN202210202341 A CN 202210202341A CN 114595148 A CN114595148 A CN 114595148A
Authority
CN
China
Prior art keywords
result
statement
expression
analysis
logic
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.)
Granted
Application number
CN202210202341.1A
Other languages
English (en)
Other versions
CN114595148B (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.)
Peking University
Original Assignee
Peking 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 Peking University filed Critical Peking University
Priority to CN202210202341.1A priority Critical patent/CN114595148B/zh
Publication of CN114595148A publication Critical patent/CN114595148A/zh
Application granted granted Critical
Publication of CN114595148B publication Critical patent/CN114595148B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3636Software debugging by tracing the execution of the program
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/366Software debugging using diagnostics
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/74Reverse engineering; Extracting design information from source code

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Software Systems (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明公开了一种基于数据流传播分析的Java空指针引用检测方法及系统,通过将Java应用程序的Jar包转化为Jimple类型的中间表示,抽取代码中的调用信息、指向信息等构建调用流图,通过调用流图结合传递规则分析得到引用安全性。本发明通过数据流的传播分析相比静态自然语义分析有着更好的检出率,尤其对于同一函数内产生的空指针引用,提高了检出率同时显著地降低了误报率。同时本发明的方法及系统相比其他工具包含了对系统调用函数以及私有函数两种的引用方式的检出支持,大幅度增加了空指针检出的覆盖率。

Description

一种基于数据流传播分析的Java空指针引用检测方法及系统
技术领域
本发明涉及计算机安全领域,尤其涉及一种静态的空指针引用检测方法及系统。
背景技术
Java程序中一般不严格区分对象和指针的概念,当在程序中声明一个对象并初始化该对象的时候,此时该对象会指向内存地址中的一块空间,当该对象去调用方法或者域值的时候,会先判断该对象指向的地址空间是否合法,如果合法则正常发生调用关系。而如果该对象指向了非法地址空间或者未指向某地址,那么此时会产生空指针引用异常。目前业界的很多空指针检测技术往往有以下几种思路:一种是从字符串识别的角度出发,对Java源代码进行识别,通过源代码生成抽象语法树,对抽象语法树进行关键字的模式匹配,其识别层次仅停留在函数内部的字符串层面,判断逻辑过于简单,漏报率高;另一种思路是使用类似于符号执行的思路,获取待分析程序的控制流图,同时获取待分析程序的所有函数节点,遍历每一个节点分析每一条路径的到达条件,根据变量值和到达条件确定返回变量值是否为空;还有一种思路是通过扫描源代码建立全局和局部变量的字典,然后再次扫描源代码查看这些变量是否有初始化的操作,并在字典里进行标注,再次遍历源代码寻找解引用的代码,并去字典里查找相应变量是否为空并报告异常情况。
目前的方法主要基于null字符串的匹配和变量初始化的判断。其判断逻辑过于简单,注重对源代码自然语义上的信息发掘,而忽略了程序之间的信息传递过程,这种类型的方法处理过程简便,但是无法充分利用程序中的静态特征,漏报率高。
发明内容
为克服上述现有技术的不足,本发明提出一种基于反向数据流分析的空指针异常引用检测方法,可基于Java中间代码有效提高空指针引用识别的准确率。
本发明提供的基于反向数据流分析的空指针引用检测方法,通过将Java应用程序的Jar包转化成为Jimple的中间语言表示形式,该形式比源代码更简化同时也保留了关键信息;然后利用中间表达形式去搜索变量引用点,并借用控制流图对引用点进行反向的数据流追溯,直到控制流图的头节点停止追溯,并结合符号执行状态图通过约束求解器判断是否发生空指针引用,给出产生该结果的可能范围。
具体执行过程如下步骤:
步骤1:引入Java应用程序的Jar包,并通过Soot框架对应用程序进行分析,将Jar包转化为Jimple代码的形式。接下来对程序进行遍历扫描,通过扫描可以分析得出整个程序的控制流图,该程序控制流图里面存储了整个程序中各个函数的调用关系、程序的执行顺序、各条语句的前驱和后继等等。获得了该控制流图即获取了整个应用程序的元信息。
步骤2:扫描Jar包,获取待分析Jimple代码的指针,然后获取每一个指针的赋值及其指向信息,对指针的指向进行约束求解,例如使用Druid.jar包中的Solver类进行约束求解,并保存中间结果。
步骤3:扫描Jar包,在Jimple代码层面构建符号执行状态图,从前往后针对每一个节点完成一次符号执行,并在符号执行结束后保留符号执行状态图。同时获取函数之间的调用关系、继承关系、参数关系等等,构建一个全局的调用流图,保存为中间结果。
步骤4:按照包、类、函数的层级顺序去遍历整个程序,如果是关注的函数并且该函数存在于调用流图当中,那判断该函数中的每一条语句是否发生了指针解引用,若是则针对该语句进行引用分析,执行步骤5。
步骤5:对于每一个引用初始化一个引用分析任务,并且假定发生引用的变量为空,即建立variable==null的逻辑表达式,并且以该逻辑表达式作为最初始的数据流约束关系,将其作为该引用的出口逻辑表达式,从此处开始以单个执行语句为单位,开始数据流传递分析。
步骤6:获取该引用的控制流图,通过搜索控制流图获取该引用的所有前驱节点,以当前节点的出口逻辑表达式作为前驱节点的入口逻辑表达式,为所有前驱节点设置好入口逻辑表达式并将其加入到待分析队列中,遍历该待分析队列取出下一待分析节点,然后执行步骤7。
步骤7:对当前节点的语句类型进行判断,将Soot框架中的语句类型分为以下一些种类,包括NullAssign、FormalIn、Casting、Copy、NewAssign、GetField、StaticGetField、If、Switch、Goto、ExprAssign、GetArray、PutArray、PutField、StaticPutField、Return、StaticInvoke、SpecialInvoke、VirtualInvoke、StaticInvokeAssign、SpecialInvokeAssign、VirtualInvokeAssign、Throw、BinopExprAssign等一共24种Java语句类型,结合入口逻辑表达式,针对每一种语句类型分别进行逻辑表达式的转换,分析得到新的出口逻辑表达式,这个过程叫做数据流传播。
步骤8:一条语句完成了数据流传播以后,对出口逻辑表达式完成约束化简,化简过程中,判断各个出口逻辑表达式等号两边的值,如果两者相等,则等式用True代替;如果两者一定不相等,则等式用False代替;如果无法确定两者是否相等,则保留原等式。将以上表达式按照逻辑推理的方式进行约简后,约简的结果如果是可求解的,则直接将检测结果提交,其中,如果化简结果是True那么报告危险引用,如果化简结果是False那么报告安全引用;否则进行执行步骤9。
步骤9:为了控制单个指针引用的时间成本,完成一次数据流传播之后,让传播步数递增,并判断传播步数是否超过设定的阈值。如果超过阈值则提前结束传播,并返回不确定引用,否则执行步骤10。
步骤10:此处先判断待分析队列是否为空,若待分析队列为空,判断当前语句是否到达当前函数的初始点,如果到达了当前函数初始节点执行步骤11,未到达初始节点则执行步骤14报告不确定引用。若待分析队列不为空,则从中取出一条引用语句,获取当前语句所在的控制流图,得到该语句的所有前驱节点,将前驱节点的后继节点的出口逻辑表达式作为前驱节点的入口逻辑表达式,并将这些前驱节点加入到待分析队列,重复步骤6~10,循环执行操作直到待分析队列为空。
步骤11:如果分析到函数的初始节点仍然没法得到确定结果,需要继续判断当前语句是否到了程序初始点,若到了程序初始点,则认为该引用语句的逻辑表达式在包含外部参数的前提下没法得到确定的分析结果,因此执行步骤12。若未到程序初始点,则寻找当前函数的调用者语句,并且将初始节点的出口逻辑表达式添加为当前函数的所有调用者语句的入口逻辑表达式,然后从所有的这些调用当前函数的语句开始继续向前回溯分析,回到步骤6。
步骤12:当到达程序初始点时,由于逻辑表达式中包含了外部参数导致无法求解。此时结合我们的逻辑表达式和符号执行状态图,将符号执行状态图中的约束表达式与当前引用语句的逻辑表达式相结合,然后使用约束求解器对该逻辑表达式进行求解,得到求解结果。如果约束求解器求解成功,会得到逻辑表达式中的变量的取值范围,执行步骤13。否则执行步骤14提交分析结果。
步骤13:到达该步骤说明存在输入使得该逻辑表达式为真,此时我们从求解得到的变量取值范围中取实际值代入逻辑表达式,然后对逻辑表达式化简,化简之后记录外部参数的范围,将引用分析的安全性结果和导致该结果的外部参数范围结合起来,执行步骤14提交安全性结果和对应的参数范围。其中,在化简过程中,判断逻辑表达式等号两边的值,如果两者相等则化简结果为真,报告危险引用;如果两者一定不相等则化简结果为假,报告安全引用;如果无法确定两者是否相等,则报告不确定引用。
步骤14:收集指针流分析返回的逻辑表达式结果,通常我们把结果分为三种,分别是危险引用、不确定引用和安全引用,并将当前引用的结果添加到各种情况的列表中。
利用该基于数据流传播分析的空指针检测代码,可以实现对应的空指针检测系统,该系统的整体结构如图2所示:总共分为四个层次,分别为预置运行环境层、前置分析层、漏洞挖掘层和漏洞报告层。预置运行环境层提供大于等于Java 1.6版本的运行支持,由Soot程序包负责分析和转化Jar包,由Druid程序包提供数据流传播的支撑算法。前置分析层包含六个模块:字节码翻译模块实现将Jar包中的代码转化为Jimple格式,在保留了必要信息的同时增加了程序可读性;指针指向分析模块负责分析每个变量的指向地址,最后把结果保存在内部数据结构中供后续数据流分析使用;调用流图构建模块负责整个应用程序的调用关系构建,最后得到CallGraph保存在内存中;数据流传播模块是核心模块,从引用起始点开始向前遍历,不断调用单语句传播模块更新逻辑表达式,得到最后的逻辑结果;逻辑约束求解模块实现逻辑表达式的化简,返回化简后的结果;单语句规则传递模块根据输入语句的不同类型,执行不同的传播策略。漏洞挖掘层利用前置分析层得到的中间结果挖掘不同类型的空指针异常引用,主要包含对象域引用、函数引用、特殊引用、数组引用、动态引用等等。漏洞报告层会报告空指针引用的行号、引用类型、引用的签名,导致引用结果的外部参数范围以及引用的其他元信息。
本发明提出了一种基于逆向数据流分析的空指针引用异常分析方法及系统,通过将Jar包转化为Jimple类型的中间表示,构建符号执行状态图并抽取代码中的调用信息、指向信息等构建调用流图,通过调用流图结合传递规则分析得到引用安全性。本发明通过数据流的传播分析相比静态自然语义分析有着更好的检出率,尤其对于同一函数内产生的空指针引用,提高了检出率同时显著地降低了误报率。同时本发明的方法及系统相比其他工具和方法增加了对系统调用函数以及私有函数两种的引用方式的检出支持,增加了空指针检出的覆盖率。
附图说明
图1为本发明基于数据流传播分析的空指针引用检测方法的检测流程图。
图2为本发明基于数据流传播分析的空指针引用检测系统的架构图。
图3为本发明实施例给出的空指针引用检测范例分析图。
具体实施方式
以下结合附图,通过实施例进一步描述本发明,但不以任何方式限制本发明的范围。
本实施例提供的一种基于反向数据流分析的空指针异常引用检测系统,该系统通过将Jar包转换成Jimple形式的中间语言,抽取其中的代码元信息,利用代码元信息构建完备的指针分析图、调用流图等;再次扫描代码,获取所有的引用语句,对每一句引用都添加空值假设并进行反向的数据流传播分析,将结果记录并添加到集合中,通过转化成Jimple形式有效地去除了代码中无用信息,保留了元信息;通过对引用的变量反向进行数据流传递分析,可以更加有效地利用代码与代码之间的序列信息,保证了低误报率。
本系统主要实施过程包含以下详细步骤:
步骤1:读取Jar包文件,配置各项参数,提供Jre 1.6的路径、待分析程序路径、主类信息、分析模式。然后使用Soot对程序进行分析,将Jar包转化为Jimple代码形式,并且在此过程中构建出全局控制流图存储整个待分析程序的元信息。
步骤2:逐个获取Jimple代码中的指针,然后获取每一个指针的指向信息,利用指向信息构建一个指针指向图。接下来使用Druid程序包的约束求解模块去完成约束求解,同时也把约束求解后的结果保存起来。
步骤3:遍历Jimple层面代码,从前往后针对每一条语句完成符号执行运算并且保存符号执行中的符号状态图。同时获取Jimple代码层面的函数间调用关系、继承关系和参数关系,利用上述信息构建调用流图。上述几个步骤都使用到了Druid程序包提供的接口,构建的中间结果为后续的空指针分析提供元信息。
步骤4:使用三重循环按照包、类、函数的层级顺序去遍历程序,从调用流图中观察,如果当前函数被调用了,那么我们遍历该函数内部的语句并判断当前语句是否发生了解引用,如果是一条解引用的语句,代表该语句应当进行引用分析,执行步骤5。
Figure BDA0003527874800000061
步骤5:针对该引用初始化一个引用分析的对象,并为该对象进行变量假设,假设发生引用的变量为空,即建立variable==null的逻辑表达式,这就是当前引用语句的出口逻辑表达式。在具备出口表达式和首条语句之后,开始反向数据流传播的过程。
步骤6:开始数据流传播之后,首先获取该引用的控制流图,得到该引用的所有前驱节点,将当前引用的出口逻辑表达式设置为所有的前驱节点的入口逻辑表达式,将前驱节点添加到待分析队列当中,然后遍历队列取出一个节点作为当前待分析节点进行逻辑表达式的转换。
步骤7:对当前待分析节点进行语句类型的判断,以最常见的赋值型语句a=b为例且假设此时的入口逻辑表达式为a==null,当判定该语句为赋值型语句,进入处理赋值型语句传播的函数,获得等号两边的表达式a和b,然后比对等号左侧的a与a==null中的a为同一变量,那么就用等号右边的b代替逻辑表达式中的a,即a==null变成b==null。具体三种类型引用分析的数据流传播示例过程参见图3。
步骤8:当新的出口逻辑表达式完成之后,我们对该表达式进行约简,按照等号两侧相等为真,不相等为假,不确定则保留原样的原则对出口逻辑表达式化简。化简之后的结果如果是真,表示发生了空指针引用;如果为假,表示该引用是安全的;以上两种情况都可以看作分析得到了确定性结果,接下来即中断后续的分析并提交结果,执行步骤14。如果不可确定结果,那么继续进行步骤9。
步骤9:经过一次化简之后,我们让传播步数递增并且判断传播的步数是否超过了设定的阈值,如果超过阈值则中断传播过程,并且提交不确定结果,否则进行下一步骤。
步骤10:判断待分析的队列是否为空,若待分析队列不为空则循环进行数据流转换的步骤,重复步骤6~10。若待分析队列为空,我们判断是否到函数的初始节点,即控制流图中已经没有更多的前驱节点,如果未到达当前函数的初始节点,则认为在未到初始点之前分析已经结束并且目前的逻辑表达式求解结果是不确定的,此时执行步骤14提交不确定分析结果;如果到达函数的初始点,则执行步骤11完成下一步判断过程。
步骤11:到达该步骤说明分析已经到达了函数的初始点仍然没有得到明确结果,此时我们判断此初始点是否为程序的初始点,若到达了程序的初始点,说明本次分析已经回溯到达了程序初始点仍然得不到明确结果,则执行步骤12。若未到达程序初始点,说明该函数存在调用者语句,我们通过调用流图获取调用该函数的所有调用者语句并且将上一条语句的出口逻辑表达式设置为调用者语句的入口逻辑表达式,并从调用者语句开始继续向前回溯分析,回到步骤6开始继续执行。
步骤12:当由于外部参数存在于逻辑表达式中导致没法求解确定结果时,此时我们结合此时的逻辑表达式和符号执行状态图中的参数约束条件,使用Z3约束求解器进行求解,得到求解结果,约束求解器如果得到了确切的求解结果,则执行步骤13,否则说明Z3求解器由于开销受限或者结果为空集的原因,得不到具体结果。如果是因为逻辑表达式过于复杂从而在有限开销内无法求解确切结果,此时我们提交不确定引用结果;如果求解结果为空集,代表不存在特定的值域使得逻辑表达式为真,即代表该引用是安全的,提交安全引用结果。
步骤13:在Z3约束求解器求解成功的前提下,我们从求解的变量取值范围中代入实际值到逻辑表达式中,并对其进行化简,化简之后记录各个外部参数的取值范围。最后将安全性分析结果同外部参数范围结合起来执行步骤14提交分析结果。
步骤14:该步骤负责收集指针分析的结果,分别为危险引用、安全引用和不确定引用三种。对收集结果进行分类统计,收集该引用的行号,包名,类名,方法名,Jimple源码等信息用于漏洞报告。
通过上述14个步骤的操作,阐述了基于反向数据流传播的空指针引用异常检测实施例过程,并使用Findbugs与本工具完成对比实验,实验结果如下表所示:
Figure BDA0003527874800000071
通过上表可知,本发明基于数据流传播分析的空指针检测方法得到了较高的检出率。
需要注意的是,公布实施例的目的在于帮助进一步理解本发明,但是本领域的技术人员可以理解:在不脱离本发明及所附权利要求的精神和范围内,各种替换和修改都是可能的。因此,本发明不应局限于实施例所公开的内容,本发明要求保护的范围以权利要求书界定的范围为准。

Claims (8)

1.一种Java空指针引用检测方法,通过将Java应用程序的Jar包转化成为Jimple的中间语言表示形式,利用中间表达形式去搜索变量引用点,并借用控制流图对引用点进行反向的数据流追溯,直到控制流图的头节点停止追溯,并结合符号执行状态图通过约束求解器判断是否发生空指针引用,给出产生该结果的可能范围;包括以下步骤:
1)引入Java应用程序的Jar包,并通过Soot框架对应用程序进行分析,将Jar包转化为Jimple代码的形式;然后对应用程序进行遍历扫描,分析得出整个程序的控制流图,即获取了整个应用程序的元信息;
2)扫描Jar包,获取待分析Jimple代码的指针,然后获取每一个指针的赋值及其指向信息,对指针的指向进行约束求解,并保存中间结果;
3)扫描Jar包,在Jimple代码层面构建符号执行状态图,从前往后针对每一个节点完成一次符号执行,并在符号执行结束后保留符号执行状态图;同时获取函数之间的关系,包括调用关系、继承关系和参数关系,构建一个全局的调用流图,保存为中间结果;
4)按照包、类、函数的层级顺序去遍历整个程序,如果是关注的函数并且该函数存在于调用流图当中,那判断该函数中的每一条语句是否发生了指针解引用,若是则针对该语句进行引用分析,执行步骤5);
5)对于每一个引用初始化一个引用分析任务,并且假定发生引用的变量为空,即建立variable==null的逻辑表达式,并且以该逻辑表达式作为最初始的数据流约束关系,将其作为该引用的出口逻辑表达式,从此处开始以单个执行语句为单位,开始数据流传递分析;
6)获取该引用的控制流图,通过搜索控制流图获取该引用的所有前驱节点,以当前节点的出口逻辑表达式作为前驱节点的入口逻辑表达式,为所有前驱节点设置好入口逻辑表达式并将其加入到待分析队列中,遍历待分析队列取出下一待分析节点,然后执行步骤7);
7)对当前节点的语句类型进行判断,结合入口逻辑表达式,针对每一种语句类型分别进行逻辑表达式的转换,分析得到新的出口逻辑表达式,这个过程叫做数据流传播;
8)一条语句完成了数据流传播以后,对出口逻辑表达式完成约束化简,化简结果如果是可求解的,则直接执行步骤14)将检测结果提交,否则执行步骤9);
9)完成一次数据流传播之后,让传播步数递增,并判断传播步数是否超过设定的阈值,如果超过阈值则提前结束传播,并返回不确定引用,否则执行步骤10);
10)先判断待分析队列是否为空,若待分析队列为空,判断当前语句是否到达当前函数的初始点,如果到达了当前函数初始节点执行步骤11),未到达初始节点则执行步骤14)报告不确定引用;若待分析队列不为空,则从中取出一条引用语句,获取当前语句所在的控制流图,得到该语句的所有前驱节点,将前驱节点的后继节点的出口逻辑表达式作为前驱节点的入口逻辑表达式,并将这些前驱节点加入到待分析队列,重复步骤6)至10),循环执行操作直到待分析队列为空;
11)如果分析到函数的初始节点仍然没法得到确定结果,需要继续判断当前语句是否到了程序初始点,若到了程序初始点,则认为该引用语句的逻辑表达式在包含外部参数的前提下没法得到确定的分析结果,因此执行步骤12);若未到程序初始点,则寻找当前函数的调用者语句,并且将初始节点的出口逻辑表达式添加为当前函数的所有调用者语句的入口逻辑表达式,然后从所有的这些调用当前函数的语句开始继续向前回溯分析,回到步骤6);
12)将符号执行状态图中的约束表达式与当前引用语句的逻辑表达式相结合,使用约束求解器对该逻辑表达式进行求解,如果求解成功,得到求解结果,则执行步骤13),否则执行步骤14)提交分析结果;
13)从约束求解得到的变量取值范围中取实际值代入逻辑表达式,然后对逻辑表达式化简,并记录外部参数的范围,将引用分析的安全性结果和导致该结果的外部参数范围结合起来,执行步骤14)提交安全性结果和对应的参数范围;
14)收集指针流分析返回的逻辑表达式结果,包括三种结果,分别是危险引用、不确定引用和安全引用,并将当前引用的结果添加到各种情况的列表中。
2.根据权利要求1所述的Java空指针引用检测方法,其特征在于,步骤1)中所述控制流图里面存储了整个程序中各个函数的调用关系、程序的执行顺序、各条语句的前驱和后继。
3.根据权利要求1所述的Java空指针引用检测方法,其特征在于,步骤2)中对指针的指向使用Druid.jar包中的Solver类进行约束求解。
4.根据权利要求1所述的Java空指针引用检测方法,其特征在于,步骤7)中所述语句类型包括NullAssign、FormalIn、Casting、Copy、NewAssign、GetField、StaticGetField、If、Switch、Goto、ExprAssign、GetArray、PutArray、PutField、StaticPutField、Return、StaticInvoke、SpecialInvoke、VirtualInvoke、StaticInvokeAssign、SpecialInvokeAssign、VirtualInvokeAssign、Throw、BinopExprAssign共24种Java语句类型。
5.根据权利要求1所述的Java空指针引用检测方法,其特征在于,在步骤8)中,按照等号两侧相等为真,不相等为假,不确定则保留原样的原则对出口逻辑表达式化简,如果化简结果是真则报告危险引用,如果化简结果是假则报告安全引用,如果化简结果不确定则进行步骤9)。
6.根据权利要求1所述的Java空指针引用检测方法,其特征在于,在步骤12)结合逻辑表达式和符号执行状态图中的参数约束条件,使用Z3约束求解器进行求解,如果得到确切的求解结果则执行步骤13),否则执行步骤14):如果因为逻辑表达式过于复杂从而在有限开销内无法求解确切结果,提交不确定引用结果;如果求解结果为空集代表不存在特定的值域使得逻辑表达式为真,即代表该引用是安全的,提交安全引用结果。
7.根据权利要求1所述的Java空指针引用检测方法,其特征在于,在步骤13)中对逻辑表达式进行化简时,判断逻辑表达式等号两边的值,如果两者相等则化简结果为真,报告危险引用;如果两者一定不相等则化简结果为假,报告安全引用;如果无法确定两者是否相等,则报告不确定引用。
8.一种Java空指针引用检测系统,用于实现权利要求1~7任一所述的Java空指针引用检测方法,该系统的整体结构分为四个层次,分别为预置运行环境层、前置分析层、漏洞挖掘层和漏洞报告层,其中:
预置运行环境层提供大于等于Java 1.6版本的运行支持,由Soot程序包负责分析和转化Jar包,由Druid程序包提供数据流传播的支撑算法;
前置分析层包含六个模块:字节码翻译模块、指针指向分析模块、调用流图构建模块、数据流传播模块、逻辑约束求解模块和单语句规则传递模块,其中:字节码翻译模块实现将Jar包中的代码转化为Jimple格式;指针指向分析模块负责分析每个变量的指向地址,最后把结果保存在内部数据结构中供后续数据流分析使用;调用流图构建模块负责整个应用程序的调用关系构建,最后得到CallGraph保存在内存中;数据流传播模块从引用起始点开始向前遍历,不断调用单语句传播模块更新逻辑表达式,得到最后的逻辑结果;逻辑约束求解模块实现逻辑表达式的化简,返回化简后的结果;单语句规则传递模块根据输入语句的不同类型,执行不同的传播策略;
漏洞挖掘层利用前置分析层得到的中间结果挖掘不同类型的空指针异常引用,主要包含对象域引用、函数引用、特殊引用、数组引用、动态引用;
漏洞报告层报告空指针引用的行号、引用类型、引用的签名,导致引用结果的外部参数范围以及引用的其他元信息。
CN202210202341.1A 2022-03-02 2022-03-02 一种基于数据流传播分析的Java空指针引用检测方法及系统 Active CN114595148B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210202341.1A CN114595148B (zh) 2022-03-02 2022-03-02 一种基于数据流传播分析的Java空指针引用检测方法及系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210202341.1A CN114595148B (zh) 2022-03-02 2022-03-02 一种基于数据流传播分析的Java空指针引用检测方法及系统

Publications (2)

Publication Number Publication Date
CN114595148A true CN114595148A (zh) 2022-06-07
CN114595148B CN114595148B (zh) 2024-04-16

Family

ID=81808026

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210202341.1A Active CN114595148B (zh) 2022-03-02 2022-03-02 一种基于数据流传播分析的Java空指针引用检测方法及系统

Country Status (1)

Country Link
CN (1) CN114595148B (zh)

Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7302707B1 (en) * 2002-01-18 2007-11-27 Cigital, Inc. Systems and methods for detecting software buffer security vulnerabilities
US20080082969A1 (en) * 2006-04-04 2008-04-03 The Board Of Trustees Of The University Of Illinois Software Testing Technique Supporting Dynamic Data Structures
US7392545B1 (en) * 2002-01-18 2008-06-24 Cigital, Inc. Systems and methods for detecting software security vulnerabilities
US20100083240A1 (en) * 2006-10-19 2010-04-01 Checkmarx Ltd Locating security vulnerabilities in source code
CN103218296A (zh) * 2013-04-22 2013-07-24 北京邮电大学 一种充分检测空指针引用缺陷的方法
CN103955426A (zh) * 2014-04-21 2014-07-30 中国科学院计算技术研究所 一种检测c代码空指针引用的方法及系统
CN105786715A (zh) * 2016-04-08 2016-07-20 南京大学 一种程序静态自动分析方法

Patent Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7302707B1 (en) * 2002-01-18 2007-11-27 Cigital, Inc. Systems and methods for detecting software buffer security vulnerabilities
US7392545B1 (en) * 2002-01-18 2008-06-24 Cigital, Inc. Systems and methods for detecting software security vulnerabilities
US20080082969A1 (en) * 2006-04-04 2008-04-03 The Board Of Trustees Of The University Of Illinois Software Testing Technique Supporting Dynamic Data Structures
US20100083240A1 (en) * 2006-10-19 2010-04-01 Checkmarx Ltd Locating security vulnerabilities in source code
CN103218296A (zh) * 2013-04-22 2013-07-24 北京邮电大学 一种充分检测空指针引用缺陷的方法
CN103955426A (zh) * 2014-04-21 2014-07-30 中国科学院计算技术研究所 一种检测c代码空指针引用的方法及系统
CN105786715A (zh) * 2016-04-08 2016-07-20 南京大学 一种程序静态自动分析方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
王允超等: "基于静态污点分析的Android应用Intent注入漏洞检测方法", 计算机科学, vol. 43, no. 09, 15 September 2016 (2016-09-15), pages 192 - 196 *

Also Published As

Publication number Publication date
CN114595148B (zh) 2024-04-16

Similar Documents

Publication Publication Date Title
US8589888B2 (en) Demand-driven analysis of pointers for software program analysis and debugging
CN110059006B (zh) 代码审计方法及装置
CN102662825B (zh) 一种面向堆操作程序的内存泄漏检测方法
CN114861194A (zh) 一种基于bgru与cnn融合模型的多类型漏洞检测方法
KR101696694B1 (ko) 역추적을 이용한 소스 코드 취약점 분석 방법 및 장치
US9600644B2 (en) Method, a computer program and apparatus for analyzing symbols in a computer
CN115269427A (zh) 针对web注入漏洞的中间语言表示方法及系统
CN115630368A (zh) 基于自然语言处理与深度森林的Java漏洞分类方法
CN110162474B (zh) 一种基于抽象语法树的智能合约重入漏洞检测方法
CN111552792A (zh) 一种信息查询方法、装置、电子设备及存储介质
Liu et al. A smart contract vulnerability detection mechanism based on deep learning and expert rules
CN116305131B (zh) 脚本静态去混淆方法及系统
CN114595148B (zh) 一种基于数据流传播分析的Java空指针引用检测方法及系统
CN116383832A (zh) 一种基于图神经网络的智能合约漏洞检测方法
CN113419960B (zh) 用于可信操作系统内核模糊测试的种子生成方法及系统
CN111753295B (zh) 一种基于漏洞利用程序特征的漏洞利用程序检测方法
Xia et al. Source Code Vulnerability Detection Based On SAR-GIN
CN115913655A (zh) 一种基于流量分析和语义分析的Shell命令注入检测方法
CN115495745A (zh) 一种基于风险函数的工业软件源代码静态检测方法及系统
CN114880672A (zh) 基于静态污点分析的二进制污点型漏洞检测方法及系统
CN114546836A (zh) 基于下推自动机引导的公共组件库自动化测试方法及装置
Chrenousov et al. Deep learning based automatic software defects detection framework
Liu [Retracted] Software Vulnerability Mining Techniques Based on Data Fusion and Reverse Engineering
CN117614681B (zh) 智能合约的重入漏洞检测方法、系统、设备和存储介质
Zhang et al. File similarity determination based on function call graph

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