一种源代码漏洞检测方法及其系统与流程

文档序号:12007952阅读:195来源:国知局
一种源代码漏洞检测方法及其系统与流程
本发明涉及计算机软件源代码安全检测技术领域,尤其涉及一种源代码漏洞检测方法及其系统。

背景技术:
信息社会对软件依赖的不断增加,随着软件数量快速增长,软件存在的信息安全问题日益彰显,成为信息安全和用户隐私保护方面的重要隐患。因此,软件的安全问题愈加受到产业界和学术界的关注,针对软件的源代码进行安全检测的研究已经成为一个安全领域的热点。软件安全成为一个焦点问题,软件能否安全地提供服务,其因素是多方面的,其中源码设计中存在的漏洞是导致安全性问题的一个十分重要的因素。不论在商业软件还是开源软件中,软件的漏洞随处可见。由于软件漏洞的急剧增加,加之软件系统变得越来越复杂和庞大,人工检测源代码已经不再现实,急需一种自动化检测方法来帮助程序员发现实际软件中的漏洞。因此,对源代码进行检测,发现并指出漏洞也就变得十分必要。目前,现有的源代码安全检测技术存在检测结果误报率较高的劣势,特别是不能检测多线程交错执行引起的较为严重的系统级别的安全漏洞。因此,针对当前软件源代码的安全检测技术的研究和创新,将有助于保障软件的安全性和可靠性。

技术实现要素:
本发明的目的在于提出一种源代码漏洞检测方法及其系统,能够有效发现软件的源代码安全漏洞,精确定位引发漏洞的执行路径,保证软件的安全性和健壮性。为达此目的,本发明采用以下技术方案:一种源代码漏洞检测方法,包括:S1、获取目标检测源代码的编程语言,根据所述编程语言编写的源代码所存在的安全漏洞构建安全漏洞规则库;S2、对所述目标检测源代码进行编译,生成中间表示文件,对所述中间表示文件进行解析,提取所述中间表示文件的上下文信息并存储起来;S3、依据所述存储的上下文信息构建调度上下文的状态自动机;S4、根据预设的搜索算法对所述状态自动机中的状态空间进行遍历,分别判断所述状态自动机中各状态空间是否与所述安全漏洞规则库中的规则相匹配,若是则获取产生漏洞的执行路径。进一步地,所述步骤S3具体包括:基于正向可达算法迭代构建调度上下文的状态自动机。进一步地,所述步骤S4中所述搜索算法包括:深度优先搜索算法、广度优先搜索算法和启发式算法。进一步地,所述步骤S4中所述执行路径具体包括:所述目标检测源代码的文件名和漏洞名称、执行路径详细信息和/或检测过程的统计信息。根据本发明的同一构思,本发明还提供了一种源代码漏洞检测系统,包括:规则库创建模块,用于获取目标检测源代码的编程语言,根据所述编程语言编写的源代码所存在的安全漏洞构建安全漏洞规则库;上下文生成模块,用于对所述目标检测源代码进行编译,生成中间表示文件,对所述中间表示文件进行解析,提取所述中间表示文件的上下文信息并存储起来;状态自动机生成模块,用于依据所述存储的上下文信息构建调度上下文的状态自动机;漏洞检测模块,用于根据预设的搜索算法对所述状态自动机中的状态空间进行遍历,分别判断所述状态自动机中各状态空间是否与所述安全漏洞规则库中的规则相匹配,若是则获取产生漏洞的执行路径。进一步地,所述状态自动机生成模块具体用于:基于正向可达算法迭代构建调度上下文的状态自动机。进一步地,所述漏洞检测模块中所述搜索算法包括:深度优先搜索算法、广度优先搜索算法和启发式算法。进一步地,所述漏洞检测模块中所述执行路径具体包括:所述目标检测源代码的文件名和漏洞名称、执行路径详细信息和/或检测过程的统计信息。本发明通过穷尽搜索调度上下文的状态空间,能有效地检测出源代码的安全漏洞,特别是能有效地检测多线程并发执行导致的安全漏洞,并精确定位引发漏洞的执行路径,生成漏洞的详细执行路径信息,具备检测精度高和误报率低的优势,能实现从源代码层面保障软件的安全性和健壮性。附图说明图1是本发明具体实施例一所述的源代码漏洞检测方法流程图;图2是本发明具体实施例一所述的上下文调度流程图;图3是本发明具体实施例一所述的基于上下文调度的状态自动机示意图;图4是本发明具体实施例二所述的源代码漏洞检测系统结构框图。具体实施方式下面结合附图并通过具体实施方式来进一步说明本发明的技术方案。实施例一图1是本实施例所述的源代码漏洞检测方法流程图,如图1所示,本实施例所述对的源代码漏洞检测方法包括:S101、根据安全漏洞,形成安全漏洞规则库。根据软件源代码安全漏洞,形成基于状态逻辑公式描述的安全漏洞规则库。在本实施例的一个优选实施方式中,所述安全漏洞规则定义为一个基于状态s∈S表示的逻辑公式f,例如多线程并发执行可能产生死锁漏洞,可以使用如下逻辑公式描述:f=(Sinit→(Scid1=WAIT)∧(Scid2=WAIT)∧…∧(Scidn=WAIT)),其中Sinit表示源代码的初始状态,符号“→”表示逻辑蕴含关系,Scidi表示对应线程i标记,其中i∈N,是一个正整数,表示所有线程的数目。Scidi表示线程i对应的某个状态,符号“∧”表示各个状态之间的逻辑与关系。如果存在死锁漏洞必须满足如下条件:源代码中存在一条起始于初始状态Sinit的执行路径,使得公式f中的所有约束条件,如Scidi=WAIT。S102、编译应用软件源代码文件。S103、判断编译是否成功,若是则执行步骤S105,否则执行步骤S104。S104、报告编译不成功,结束。本步骤还可包括报告编译不成功的具体出错信息。S105、生成中间表示文件。需要说明的是,当目标检测源代码是Java语言编写的源代码时,编译生成的所述中间表示文件则为字节码文件。S106、解析中间表示文件,提取上下文信息。解析所述中间表示文件,提取上下文信息并存储起来,例如将所述上下文信息存储到数据库中。在本实施例的一个优选实施方式中,以目标检测源代码的编程语言为Java,C++等面向对象语言为例,在本实施例中将源代码某一个类的连续执行序列称为一个上下文,将所述提取的上下文信息存储为一个五元组M={ID,V,S,T,Vinit,enable(S)}。其中,ID=CID∪MID是标识符集合,CID是类的标识符集合,cid∈CID,是为类设置的唯一标识符;MID是方法标识符集合,mid∈MID,是为类的方法设置的唯一标识符。其中,V=Vcid∈CID∪Vmid∈MID是变量集合,其中Vcid∈CID是类的变量集合,包括类的全局变量和局部变量,Vmid∈MID是类中定义的方法的变量集合。其中,S是状态集合,s∈S是类的一个状态,即类中所有变量赋值的实例化。其中,是状态转移关系集合,其中S是状态集合,Ins是指令集合;状态转移关系t=(Si,a,Sj)∈T表示源代码在状态Si下执行指令a转换到状态Sj。其中,Vinit是类的初始状态,即初始化时,变量赋值的实例化。是状态集合S到ID集合的映射,表示状态对应的可调度的id∈ID,enable(s∈S)={set(id)|cid∈CID,mid∈MID}表示当处于状态s∈S时,可调度的cid和mid,可利用函数enable(s)确定某个状态下可调度的类和方法。提取的源代码信息按照标识符cid=0,1,2,…,i(i∈N)依次进行存储。S107、调度数据库中CID标记的上下文。选择数据库中cid标记的上下文,用一个布尔值cid_scheduled表示cid标记的上下文是否已被调用,cid_scheduled为TRUE则表明该cid标记的上下文已被调用过,cid_scheduled为FALSE则表明该cid标记的上下文未被调用过。进一步地,在本实施例的一个优选实施方式中,本步骤中所述的上下文调度方法参见图2,如图2所示,本实施例优先的上下文调度方法包括:S201、从数据库中读取CID的值。S201、判断是否上下文未被调度,若是则执行步骤S206,否则执行步骤S203。S203、设置上下文调度状态为已被调度状态,记录调度信息,构造相应状态自动机。S204、判断当前上下文的状态是否使得某个CID可调度,若是则执行步骤S205,否则执行步骤S206。S205、根据调度记录进行回溯。S206、判断是否存在CID未调度,若是则返回步骤S201,否则结束。S108、基于正向可达算法迭代构建调度上下文的状态自动机。根据调度cid标记的上下文,基于正向可达算法依次构造对应的状态自动机Acid,在本实施例的一个优选实施方式中,所述正向可达算法即为Post*算法。具体步骤如下:步骤一、构造状态自动机的初始状态结点Sinit,所述Sinit是全局变量和局部变量的初始化赋值。步骤二、根据状态转移集合T,构造状态自动机的其他状态:如果存在一个状态转移关系<si,a,sj>,状态si与已存在的状态匹配,且不存在状态sj,则构造状态赋值为sj,同时添加状态si到状态sj的边,边上标注指令a。步骤三、重复执行步骤二直至没有可以匹配的状态迁移关系,至此,自动机构造完毕。步骤四、记录上下文的状态空间,即状态自动机接受的语言集合L(Post*(Acid))。S109、搜索状态空间与漏洞规则匹配,确定是否存在产生漏洞的执行路径。基于搜索算法搜索状态空间,检测是否存在路径满足以下条件:存在一个路径使得各个上下文的状态与漏洞规则匹配。所述搜索算法可为深度优先搜索算法、广度优先搜索算法、启发式算法等。S110、判断是否发现漏洞,若是则执行步骤S112,否则执行步骤S111。S111、未发现漏洞。S112、输出漏洞的执行路径信息,结束。在本实施例的一个优选实施方式中,若未检测到漏洞,报告未检测到漏洞,若检测到漏洞,输出检测结果的详细信息,包括以下内容:(1)漏洞信息,包括cid对应的源代码文件名和漏洞名称;和/或(2)执行路径详细信息,包括各个上下文的类名、状态信息、源代码指令和/或源代码指令所在的行号;和/或(3)检测过程的统计信息,包括搜索的状态、类和/或方法的数目等。当目标检测源代码的编程语言为C语言等面向过程语言时,具体实现方式如下:将源代码某一个函数的顺次执行序列称为一个上下文,将所述提取的上下文信息存储为一个五元组M={ID,V,S,T,Vinit,enable(S)}。其中,ID=CID∪MID是标识符集合,CID是函数的标识符集合,cid∈CID,是为函数设置的唯一标识符;MID是子函数标识符集合,mid∈MID,是为函数所调用的子函数设置的唯一标识符。其中,V=Vcid∈CID∪Vmid∈MID是变量集合,其中Vcid∈CID是函数的变量集合,包括函数的全局变量和局部变量,Vmid∈MID是函数中调用的子函数的集合。其中,S是状态集合,s∈S是函数的一个状态,即函数中所有变量赋值的实例化。其中,是状态转移关系集合,其中S是状态集合,Ins是指令集合;状态转移关系t=(Si,a,Sj)∈T表示源代码在状态Si下执行指令a转换到状态Sj。其中,Vinit是类的初始状态,即初始化时,变量赋值的实例化。是状态集合S到ID集合的映射,表示状态对应的可调度的id∈ID,enable(s∈S)={set(id)|cid∈CID,mid∈MID}表示当处于状态s∈S时,可调度的cid和mid,可利用函数enable(s)确定某个状态下可调度的子函数。提取的源代码信息按照标识符cid=0,1,2,…,i(i∈N)依次进行存储。实施例二根据本发明的同一构思,本发明还提供了一种源代码漏洞检测系统,图2是本实施例所述的源代码漏洞检测系统结构框图,如图2所示,本实施例所述的源代码漏洞检测系统包括:规则库创建模块401,用于获取目标检测源代码的编程语言,根据所述编程语言编写的源代码所存在的安全漏洞构建安全漏洞规则库。根据软件源代码安全漏洞,形成基于状态逻辑公式描述的安全漏洞规则库。在本实施例的一个优选实施方式中,所述安全漏洞规则定义为一个基于状态s∈S表示的逻辑公式f,例如多线程并发执行可能产生死锁漏洞,可以使用如下逻辑公式描述:f=(Sinit→(Scid1=WAIT)∧(Scid2=WAIT)∧…∧(Scidn=WAIT)),其中Sinit表示源代码的初始状态,符号“→”表示逻辑蕴含关系,Scidi表示对应线程i标记,其中i∈N,是一个正整数,表示所有线程的数目。Scidi表示线程i对应的某个状态,符号“∧”表示各个状态之间的逻辑与关系。如果存在死锁漏洞必须满足如下条件:源代码中存在一条起始于初始状态Sinit的执行路径,使得公式f中的所有约束条件,如Scidi=WAIT。上下文生成模块402,用于对所述目标检测源代码进行编译,生成中间表示文件,对所述中间表示文件进行解析,提取所述中间表示文件的上下文信息并存储起来。在本实施例的一个优选实施方式中,以目标检测源代码的编程语言为Java,C++等面向对象语言为例,在本实施例中将源代码某一个类的连续执行序列称为一个上下文,将所述提取的上下文信息存储为一个五元组M={ID,V,S,T,Vinit,enable(S)}。其中,ID=CID∪MID是标识符集合,CID是类的标识符集合,cid∈CID,是为类设置的唯一标识符;MID是方法标识符集合,mid∈MID,是为类的方法设置的唯一标识符。其中,V=Vcid∈CID∪Vmid∈MID是变量集合,其中Vcid∈CID是类的变量集合,包括类的全局变量和局部变量,Vmid∈MID是类中定义的方法的变量集合。其中,S是状态集合,s∈S是类的一个状态,即类中所有变量赋值的实例化。其中,是状态转移关系集合,其中S是状态集合,Ins是指令集合;状态转移关系t=(Si,a,Sj)∈T表示源代码在状态Si下执行指令a转换到状态Sj。其中,Vinit是类的初始状态,即初始化时,变量赋值的实例化。是状态集合S到ID集合的映射,表示状态对应的可调度的id∈ID,enable(s∈S)={set(id)|cid∈CID,mid∈MID}表示当处于状态s∈S时,可调度的cid和mid,可利用函数enable(s)确定某个状态下可调度的类和方法。提取的源代码信息按照标识符cid=0,1,2,…,i(i∈N)依次进行存储。状态自动机生成模块403,用于依据所述存储的上下文信息构建调度上下文的状态自动机。选择数据库中cid标记的上下文,用一个布尔值cid_scheduled表示cid标记的上下文是否已被调用,cid_scheduled为TRUE则表明该cid标记的上下文已被调用过,cid_scheduled为FALSE则表明该cid标记的上下文未被调用过。根据调度cid标记的上下文,基于正向可达算法依次构造对应的状态自动机Acid,在本实施例的一个优选实施方式中,所述正向可达算法即为Post*算法。具体包括:构造状态自动机的初始状态结点Sinit,所述Sinit是全局变量和局部变量的初始化赋值。根据状态转移集合T,构造状态自动机的其他状态:如果存在一个状态转移关系<Si,a,Sj>,状态Si与已存在的状态匹配,且不存在状态Sj,则构造状态赋值为Sj,同时添加状态Si到状态Sj的边,边上标注指令a。重复执行步骤二直至没有可以匹配的状态迁移关系,至此,自动机构造完毕。记录上下文的状态空间,即状态自动机接受的语言集合L(Post*(Acid))。漏洞检测模块404,用于对所述状态自动机中的状态空间进行遍历,分别判断所述状态自动机中各状态空间是否与所述安全漏洞规则库中的规则相匹配,若是则获取产生漏洞的执行路径。基于搜索算法搜索状态空间,检测是否存在路径满足以下条件:存在一个路径使得各个上下文的状态与漏洞规则匹配。所述搜索算法可为深度优先搜索算法、广度优先搜索算法、启发式算法等。在本实施例的一个优选实施方式中,若未检测到漏洞,报告未检测到漏洞,若检测到漏洞,输出检测结果的详细信息,包括以下内容:(1)漏洞信息,包括cid对应的源代码文件名和漏洞名称;和/或(2)执行路径详细信息,包括各个上下文的类名、状态信息、源代码指令和/或源代码指令所在的行号;和/或(3)检测过程的统计信息,包括搜索的状态、类和/或方法的数目等。当目标检测源代码的编程语言为C语言等面向过程语言时,具体实现方式如下:将源代码某一个函数的顺次执行序列称为一个上下文,将所述提取的上下文信息存储为一个五元组M={ID,V,S,T,Vinit,enable(S)}。其中,ID=CID∪MID是标识符集合,CID是函数的标识符集合,cid∈CID,是为函数设置的唯一标识符;MID是子函数标识符集合,mid∈MID,是为函数所调用的子函数设置的唯一标识符。其中,V=Vcid∈CID∪Vmid∈MID是变量集合,其中Vcid∈CID是函数的变量集合,包括函数的全局变量和局部变量,Vmid∈MID是函数中调用的子函数的集合。其中,S是状态集合,s∈S是函数的一个状态,即函数中所有变量赋值的实例化。其中,是状态转移关系集合,其中S是状态集合,Ins是指令集合;状态转移关系t=(Si,a,Sj)∈T表示源代码在状态Si下执行指令a转换到状态Sj。其中,Vinit是类的初始状态,即初始化时,变量赋值的实例化。是状态集合S到ID集合的映射,表示状态对应的可调度的id∈ID,enable(s∈S)={set(id)|cid∈CID,mid∈MID}表示当处于状态s∈S时,可调度的cid和mid,可利用函数enable(s)确定某个状态下可调度的子函数。提取的源代码信息按照标识符cid=0,1,2,…,i(i∈N)依次进行存储。本发明通过穷尽搜索调度上下文的状态空间,能有效地检测出源代码的安全漏洞,特别是能有效地检测多线程并发执行导致的安全漏洞,并精确定位引发漏洞的执行路径,生成漏洞的详细执行路径信息,具备检测精度高和误报率低的优势,能实现从源代码层面保障软件的安全性和健壮性。以上实施例提供的技术方案中的全部或部分内容可以通过软件编程实现,其软件程序存储在可读取的存储介质中,存储介质例如:计算机中的硬盘、光盘或软盘。以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1