CN109697162B - 一种基于开源代码库的软件缺陷自动检测方法 - Google Patents

一种基于开源代码库的软件缺陷自动检测方法 Download PDF

Info

Publication number
CN109697162B
CN109697162B CN201811359582.7A CN201811359582A CN109697162B CN 109697162 B CN109697162 B CN 109697162B CN 201811359582 A CN201811359582 A CN 201811359582A CN 109697162 B CN109697162 B CN 109697162B
Authority
CN
China
Prior art keywords
code
file
line
defect
code block
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
CN201811359582.7A
Other languages
English (en)
Other versions
CN109697162A (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.)
Northwestern University
Original Assignee
Northwestern 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 Northwestern University filed Critical Northwestern University
Priority to CN201811359582.7A priority Critical patent/CN109697162B/zh
Publication of CN109697162A publication Critical patent/CN109697162A/zh
Application granted granted Critical
Publication of CN109697162B publication Critical patent/CN109697162B/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/3604Software analysis for verifying properties of programs
    • G06F11/3608Software analysis for verifying properties of programs using formal methods, e.g. model checking, abstract interpretation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N3/00Computing arrangements based on biological models
    • G06N3/02Neural networks
    • G06N3/04Architecture, e.g. interconnection topology
    • G06N3/044Recurrent networks, e.g. Hopfield networks
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N3/00Computing arrangements based on biological models
    • G06N3/02Neural networks
    • G06N3/04Architecture, e.g. interconnection topology
    • G06N3/045Combinations of networks
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N3/00Computing arrangements based on biological models
    • G06N3/02Neural networks
    • G06N3/08Learning methods

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • General Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Health & Medical Sciences (AREA)
  • Biomedical Technology (AREA)
  • Data Mining & Analysis (AREA)
  • Evolutionary Computation (AREA)
  • Biophysics (AREA)
  • Molecular Biology (AREA)
  • Computing Systems (AREA)
  • Computational Linguistics (AREA)
  • Artificial Intelligence (AREA)
  • Mathematical Physics (AREA)
  • Life Sciences & Earth Sciences (AREA)
  • Health & Medical Sciences (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Stored Programmes (AREA)

Abstract

本发明公开了一种基于开源代码库的软件缺陷自动检测方法,包括涉及源代码特征提取技术与自然语言处理中的词向量表示法以及深度学习技术中的双向LSTM框架。该检测方法基于大规模的开源代码仓库Github中的代码变更记录,获取代码变更过程中大量的缺陷代码,通过使用静态代码分析技术,提取缺陷代码片段的数据流特征,利用深度学习中的双向LSTM框架,设计代码缺陷检测模型,为代码缺陷静态检测提供了技术支持,实现了对目标文件进行缺陷检测,在漏报率较低的前提中报告出准确的漏洞位置的功能。

Description

一种基于开源代码库的软件缺陷自动检测方法
技术领域
本发明涉及代码审计领域,尤其涉及一种基于开源代码库的软件缺陷自动检测方法。
背景技术
软件漏洞和系统漏洞是网络安全的核心威胁。因此,漏洞检测技术一直是网络安全的一个核心研究课题。按照检测过程中是否执行目标程序的标准,软件安全漏洞检测技术分为动态检测技术与静态检测技术。其中动态检测技术在程序运行过程中注入测试数据,观察程序运行是否正常、输出是否符合程序意图,达到寻找程序漏洞的目的,动态测试仅关注程序运行的外部表现,因此,其定位不准确、漏报率高。静态检测技术,则关注程序的代码,从程序代码的内部结构和特性上检测漏洞,适当地弥补了动态检测的不足。
目前的静态检测技术,主要分为以下两类:
(1)基于模式匹配的静态检测技术。这一类可以进一步分为以下三类具体的技术。①利用专家人工定义的模式进行匹配。如一些开源工具:Flawfinder、RATS、和ITS4。还有著名的商业软件CheckMax、Fortify、和Coverity。因为完全依赖人工定义模式,所以这些工具都有很高的漏报率和误报率。②利用从预先分类好的已知的缺陷中半自动地提取的模式进行匹配。这种技术提取的模式,一种模式只能应用于一种缺陷类别,需要人工提前进行缺陷分类,且无法检测出未知的漏洞。③利用从预先未分好类型的漏洞中生成的模式进行匹配。这些方法使用机器学习技术,同时依靠人类专家来定义特征来表征缺陷,提取缺陷的普适性特征,半自动地达到检测目的,这种方法依赖于人工提前分类,且无法确定缺陷的准确位置,因为程序的表示是粗粒度的,检测的位置只能给出一个大概的位置,如一个包,或者一个文件。以上介绍的三类都需要人工的参与,手动或者半自动的生成与缺陷数据进行匹配的模式,但是人工分类都会面临着漏报率高,需要大量人力物力,更新速度受限的问题。
(2)基于相似度匹配的静态检测技术。这种技术主要是将代码和预先已知的含有缺陷的代码进行比较,计算相似度,达到检测目的。虽然单个含有缺陷的代码就足以检测目标程序中是否含有相似的漏洞。但它只能检测代码克隆中的漏洞,即检测程序具有与缺陷代码相同结构或者语义的漏洞,检测类型有限,漏报率很高。
发明内容
本发明针对现有的代码缺陷静态检测技术依赖人工定义模式,漏报率高的问题,提出了一种基于开源代码库的软件缺陷自动检测方法,实现了对目标文件进行缺陷检测,在漏报率较低的前提中报告出准确的漏洞位置的功能。
一种基于开源代码库的软件缺陷自动检测方法,包括以下步骤:
步骤1,获取开源代码库上项目文件的变更记录,根据项目文件所采用的计算机编程语言中的代码缺陷类型的关键字筛选项目文件的变更记录,获取存在代码缺陷的项目文件信息;所述的项目文件信息包括存在代码缺陷的变更记录,以及该变更记录对应的项目文件;
步骤2,从所述的项目文件信息中提取出缺陷代码行对应的代码块;
步骤3,对提取到的代码块进行变量名替换和标签化处理;
步骤4,将步骤3处理后的代码块转换为代码块向量;
步骤5,利用代码块的向量对双向LSTM神经网络进行训练,保存训练后的神经网络作为检测模型;
步骤6,对于待检测的目标文件,分析目标文件的源文件数据流,提取每一行的代码块,将代码块转换为代码块向量后,利用所述的检测模型进行分类,检测出是否包含有缺陷的代码块。
进一步地,从所述的项目文件信息中提取出缺陷代码行对应的代码块,包括:
步骤2.1,确定项目文件中的缺陷代码行
所述的项目文件包括该项目文件修改前的文件file_old和修改后的文件file_new,对file_new和file_old进行逐一比对,将在file_new中增加的代码行、在file_old中被删除的代码行作为项目文件中的缺陷代码行;
步骤2.2,提取缺陷代码块
对于每一个被删除的代码行,取代码行中涉及到的变量的相关操作所对应的代码,形成一个缺陷代码块;采用同样的方法得到每一个增加的代码行对应的代码块;
步骤2.3,从提取的缺陷代码块中筛选出和文件操作有关的代码块
如果增加或者删除的代码行,其涉及到的变量的类名中包含与文件有关的关键字,则保留这个代码行对应的代码块。
进一步地,所述的对于每一个被删除的代码行,取代码行中涉及到的变量的相关操作所对应的代码,形成一个代码块,包括:
获取项目文件信息的项目文件修改前的文件file_old中被删除的代码行的列表、修改后的文件file_new中增加的代码行的列表;对于一个被删除的代码行,定义代码行集合和变量名集合,分别用于存放所述被删除代码行,以及被删除的代码行的变量名;
添加被删除的代码行至所述的代码行集合中,将项目文件file_old解析为AST树,获取被删除的代码行所涉及到的变量,然后将变量名添加至所述的变量名集合中;对变量名集合中的变量名提取与之语义相关的代码行,将这些代码行放入到所述的代码行集合中;将代码行集合中的代码行进行排序拼接起来形成代码块,即得到了对于一个被删除的代码行所提取的代码块。
进一步地,所述的对提取到的代码块进行变量名替换和标签化处理,包括:
统计代码块中的变量数目,按照出现的先后顺序进行排序,替换变量名为特定的标记加上该变量名的序号;将从被删除的代码行中提取的代码块标记为0,将从增加的代码行中提取的代码块标记为1。
进一步地,所述的将步骤3处理后的代码块转换为代码块向量,包括:
通过词法分析将代码块划分为一系列标记,包括标识符,关键字,运算符和符号;
将所述的每一个标记映射到一个整数,然后将其转换为固定长度的向量,将这些向量拼接起来形成每个代码块的代码块向量。
进一步地,所述的双向LSTM神经网络,包括:
双向LSTM层,包括两个LSTM神经网络,一个网络的输入是向量从前往后的顺序,用上文信息预测下文信息,去捕捉上下文关系,另一个网络的输入是向量从后往前的顺序,用下文信息去预测上文信息,从另外一个角度捕捉上下文的关系;最后,将两个网络的隐层单元输出进行拼接,作为双向LSTM层的输出;
全连接层,用于将两个LSTM神经网络学习到的特征映射到样本的标记空间中;
激活层,用于将隐藏层输出的多维向量映射到样本的标签空间上。
本发明与现有技术相比具有以下技术特点:
1.不需要专家预先定义缺陷模式。本发明基于大规模的开源代码库Github中的缺陷代码作为缺陷数据库。在提取缺陷代码的特征,以及训练检测模型,达到检测缺陷目的的这一系列过程中都未涉及到人工去定义特征,降低了人工定义而导致的漏报率。
2.可以精确的定位到缺陷的位置。传统的半自动的基于模式匹配的检测方法,无法精确的定位到文件缺陷的位置。
3.模型更新速度快。因为传统的方法依赖人力预先对漏洞进行分类。所以更新速度会被限制。而本发明基于大规模的开源代码库,数据源更新速度快,模型更新速度不受限制。
附图说明
图1为本发明流程图;
图2为本发明从被删除的代码行中提取代码块的流程图;
图3为本发明从被删除的代码行中提取代码块的示例代码流程图;
图4为本发明对代码块的变量名进行替换的示意图;
图5为本发明对代码行进行分词的示意图;
图6为本发明中双向LSTM网络模型结构图。
具体实施方式
本发明不依赖于具体的编程语言,为了方便说明,本发明使用开源代码库Github与Java语言为例详细介绍本发明的具体细节。以下结合附图和实施例对本发明进一步的说明。
步骤1,获取开源代码库上项目文件的变更记录,根据项目文件所采用的计算机编程语言中的代码缺陷类型的关键字筛选项目文件的变更记录,获取存在代码缺陷的项目文件信息;所述的项目文件信息包括存在代码缺陷的变更记录,以及该变更记录对应的项目文件。
本实施例中,所述的开源代码库是指互联网上的软件项目托管平台,例如Github、Gitlab、BitBucket等;本实施例以Github为例进行说明。Github是一个面向开源及私有软件项目的托管平台,每一次用户对自己的其中一个项目文件(软件、文件等)进行变更,都会有与之对应的变更记录,称之为一次commit。
其中变更记录(commit)具体包括:
(1)此次变更的简要文字描述,即commit message。如修复某种类型的漏洞,添加或者删除某个功能模块等。如某个commit的commit message为fixNullPointerException,则代表这次的变更的目的在于修复代码中的空指针异常。本发明可以利用commitmessage筛选到符合条件的commit。
(2)此次变更的id。在github中每一次的变更,都会有唯一的commit_id与之对应。
(3)此次变更前的仓库版本,与变更后的仓库版本。在github中每一次变更,相当于对原有项目进行了一次更新,因此github设定变更前的仓库和变更后的仓库都有唯一的repository_id与之对应。
(4)此次变更涉及到的文件,修改前的版本,与修改后的版本。在github中每一次的变更,都会涉及到一个或者多个原有文件的增加,删除或修改。因此github设定每个涉及到变更的文件,都有唯一的变更前的版本号,和唯一的变更后的file_id与之对应。
(5)此次变更修改的内容。修改的内容称为patch,patch包含两个记录行号的列表,分别是对原文件的增加add列表,对原文件的删除delete列表。如删除原来的第56行和110行,增加新的第56行和290行,达到修改原文件第56行、删除第110行和增加第290行的目的,则patch的add列表就为56、290,patch的删除列表就为56、110。
对所述的变更记录进行筛选具体包括:
步骤1.1,根据项目文件所采用的计算机编程语言中常见的代码缺陷类型的关键字筛选项目文件的变更记录,获取存在代码缺陷的项目文件信息;所述的项目文件信息包括存在代码缺陷的变更记录,以及该变更记录对应的项目文件,包括项目文件在修改前的版本file_old和修改后的版本file_new。
本发明首先利用github提供的api,按照github上仓库的排名,获取了前65000个Java仓库的仓库名。然后按照仓库名进行检索每个仓库的详细信息,特别地本发明获取每个仓库的commit,以及与commit对应的commit message。本发明定义缺陷类型的关键字,如果commit message包含这些关键字其中的一个或多个(忽略commit message和关键字的大小写),本发明就认为这个commit是符合条件的,如本发明定义java中的缺陷,空指针异常(NullPointerException)的关键字为nullpointerexception、nullpointer、npe(简写)。利用这些关键字本发明可以检索到和空指针异常处理相关的commit,但是部分commit会出现“remove npe”,或者“delete npe”,目的与修复缺陷无关。所以本发明在获取的所有不同缺陷类型的commit中都会删除掉commit message中包含“remove”、“delete”、“ignore”等关键字的commit。
本发明以计算机编程语言Java为例,针对Java中六种常见的代码缺陷类型,其对应的关键字如下:
空指针异常(NullPointerException):nullpointerexception、nullpointer、npe;
不合法的参数异常(IllegalArgumentException):illegalargumentException、illegalargument;
不合法的状态异常(IllegalStateException):illegalStateexception;
运行时异常(RuntimeException):runtimeexception;
IO流异常(IOException):ioexception;
文件寻址异常(FileNotFoundException):filenotfoundexception、filenotfound。
因为commit message很长,仅仅依靠关键字的匹配,是无法严格保证,每条commit真实地和修复缺陷相关。且commit涉及到文件是一个或者多个的。而在同一个文件中修改的代码行也是一处或者多处的,也有可能只是单纯的增加了代码行,没办法明确获得是哪一块代码出了问题,对定位到真实地引起缺陷的代码行增加了困难。因此本发明限制,commit涉及到修改的文件只有一个,文件的总的代码行小于1000,commit中patch里修改的代码行的行数在50行以内,且commit中patch的删除列表不能为0。
对于以上六种的缺陷,都有大量的符合要求的commit集合与之对应。每个commit,本发明获取它变更涉及到的文件,依据file_id获取修改前的文件file_old和修改后的文件file_new。这样每种类型的缺陷,都有大量的commit,以及与commit对应的文件对,file_new和file_old,我们把这些文件都下载到本地,并记录其所属仓库信息、所对应的commit信息。
步骤1.2,筛选出具有相同类型操作的项目文件信息
为了保证本方法可以同时检测出多种错误类型,且准确度高,我们限制所有的commit修改的代码行都涉及某种相同类型的操作,如数组操作、文件操作、图像处理、密码安全保护等。本实施例中,挑选的数据集限制所有的commit修改的代码行都与文件操作有关。
步骤2,从所述的项目文件信息中提取出缺陷代码行对应的代码块
步骤2.1,确定项目文件中的缺陷代码行
本实施例首先把每个项目文件信息中commit对应的文件对file_new和file_old进行逐一比对,获取到不同的代码行认定为被修改的代码行。本发明认为,一个在file_old中的代码行被删除,那么这个被删除的代码行中很有可能会引起缺陷。一个在file_new中的代码行被增加,那么这些被增加代码行则在理论上是不会引起缺陷的,但是本发明没办法排除因为用户个人在修改一个缺陷的时候还是会引起缺陷的可能性。本发明把用户在file_old中删除的代码行记录下来,则每个commit都对应着1个或者多个在file_old中被删除的代码行的行号,以及1个或者多个在file_new中增加的代码行的行号。
因此,本发明中将在file_new中增加的代码行、在file_old中被删除的代码行作为项目文件中的缺陷代码行。
步骤2.2,提取缺陷代码块
对于每一个被删除的代码行,本发明提取代码行中涉及到的变量的相关操作所对应的代码,形成一个代码块,同样地,对于每一个增加的代码行,也会利用同样的方法,提取增加的代码行中涉及到的变量的相关操作所对应的代码形成一个代码块。
在目前以模式匹配为基础的静态分析的技术中,如何选取代码块的粒度仍然是一个挑战性问题。传统的方法,因为粒度选取的过大,而导致,只能判断一个文件或者一个包是包含漏洞的。无法准确定位到漏洞位置。为了解决这一问题。本发明提出了代码块的概念。代码块即在文件中提取的从依赖关系和控制关系这两方面去看有语义关系的多行代码。本发明认为引起缺陷的原因是多种多样的。可能是不合法的方法体的调用,不合法的传参,或者是不合法地修改变量的状态,比如数组添加不合法的对象。本发明主要是集中关注点在于变量的状态改变,如申明,方法体调用,赋值等操作。因此本发明主要关注于patch中delete列表中涉及的代码行中的变量的相关操作。
步骤2.3,从提取的缺陷代码块中筛选出和文件操作有关的代码块
针对于前一步骤提取到的代码块,为了保证本方法可以同时检测出多种错误类型,且准确度高,我们限制如果增加或者删除的代码行,其涉及到的变量的类名中包含与文件有关的关键字,包括文件“file”、缓冲“buffer”、写“write”、读“read”这些关键字,则我们就保留这个代码行对应的代码块,从而保证提取的代码块都是和文件操作有关。
图2展示了本发明是如何从一个被删除的代码行中提取一个代码块的流程图,从增加的代码行中提取代码块是同样的流程。图3中给了一个实际的例子,更加具体的展示如何从一个被删除的代码行中提取一个和文件操作有关的代码块,具体步骤如下:
①获取项目文件信息中的变更记录commit、项目文件file_new和file_old、修改前的文件file_old中被删除的代码行的列表,修改后的文件file_new中增加的代码行的列表。
如图3所示,图中给定了一个commit更改的部分源码,红框中的“-”号标记的代码行第6行是此次commit被删除的代码行,“+”号标记的第6行是此次commit增加的代码行,我们利用commit删除行列表:6,提取删除行的代码块,利用commit增加行列表:6,提取增加行的代码块。本发明以提取删除行的代码行作为详细说明;
②对于一个被删除的代码行,定义代码行集合和变量名集合,分别用于存放所述被删除代码行,以及被删除的代码行的变量名。记两个集合分别为code集合、variable集合。
③添加被删除的代码行至所述的代码行集合中。
在图3中展示被删除的代码行是第6行,因此先把第6行放在code集合中。
④将项目文件file_old解析为AST树,获取被删除的代码行所涉及到的变量,然后将变量名添加至所述的变量名集合中。
图3给出的示例中,被删除的代码行是第6行,获取第6行涉及到的和文件操作有关的变量:file、Directory、name_new,将这些新获取的变量名添加到variable集合中。
⑤对项目文件file_old的源码进行数据流分析,对variable集合中的变量名提取与之语义相关的代码行,将这些代码行放入到所述的代码行集合code中。
本发明利用JavaParser将源码解析为AST树后,分析每个变量的申明,对变量的修改操作,如变量进行方法调用,变量进行赋值等,我们限制这些除申明的其他操作都必须和该变量在同一方法体中,如file变量,我们首先定位到它的申明,在第6行;定位到它有进行方法调用,在第7行、第8行。directory变量,它是一个全局变量,它的申明在第2行。name_new变量它的申明以及方法调用都在第5行,我们把这些和文件操作有关的代码行都放在code集合中。
⑥将代码行集合中的代码行进行排序拼接起来形成代码块,即得到了对于一个被删除的代码行所提取的代码块。
分析code集合中新增的代码行涉及到的变量,file、directory、name、name_new、Syestem、FileUtils,新增的变量是name、Syestem、FileUtils;这里仅分析给定的源码中的数据流。name我们可以找到其涉及到的申明在第3行,但是引入的包,我们无法简单的分析单个的java源码获取到其申明语句,修改操作的语句,将第3行添加到code集合中。最后,经过分析找到的变量都在variale集合中,对code集合中的代码依照其所属的行号进行排序,排序后生成的代码行集合即为我们提取的代码块。
步骤3,对提取到的代码块进行变量名替换和标签化处理;
步骤3.1,对代码块中的变量名进行替换
为了提取代码块的特征,我们对代码块中的众多变量名,进行变量名替换,避免因为变量名不同对提取特征造成影响。我们采取的方式是:统计代码块中的变量数目,按照出现的先后顺序进行排序,替换变量名为特定的标记加上该变量名的序号。例如本实施例中,采用“var”加上该变量名的序号的方式,如将directory替换为var1。图4展示了变量名替换前后的代码块。
步骤3.2,对代码块添加标签
从步骤二中我们提取了大量代码块,我们将从被删除的代码行中提取的代码块标记为0,认为是包含缺陷信息的。我们将从增加的代码行中提取的代码块标记为1,认为是不包含缺陷信息的。
步骤4,将步骤3处理后的代码块转换为代码块向量;
步骤4.1,对代码块进行分词
为了将代码块转换为神经网络可以接收的向量模式,我们通过词法分析将代码块划分为一系列标记(tokens),包括标识符,关键字,运算符和符号。图5展示了如何对代码行进行分词。
步骤4.2,为了将所述的标记转换为向量,我们使用word2vec工具,该工具基于分布式表示的思想,它将一个标记映射到一个整数,然后将其转换为固定长度的向量。在本发明中我们对每一个标记生成一个与之对应的50维的向量,将这些向量拼接起来形成每个代码块的代码块向量。
步骤5,利用代码块的向量对双向LSTM神经网络进行训练,保存训练后的神经网络作为检测模型;
目前,双向LSTM(Long Short-Term Memory)神经网络主要应用在NLP中的问答系统、语音识别、机器翻译等领域。相比于神经网络中其他的模型如RNN、LSTM,其主要的优点是加入了双向反馈机制,解决了RNN不能够提取句子中的长时依赖关系,解决了LSTM不能够反向信息反馈导致不能捕获上文信息的缺陷,双向LSTM这种双向反馈信息的方式使句子前后信息都能够及时反馈,参数更新更加准确,能够比较准确地提取句子前后的上下文依赖关系,这种依赖关系在代码中可以表征为代码的数据流上下位结构特征。故使用双向LSTM能够精确地捕捉缺陷代码的数据流特征,提高缺陷的识别精度。
本发明将双向LSTM看做一个黑盒,输入打好标签的代码块的向量,经过训练双向LSTM可以达到对代码块进行分类的目的。双向LSTM结构如图6所示,包括:
双向LSTM层:在序列标注任务中,通常需要同时考虑历史和未来的上下文信息。然而,LSTM的隐层单元只记录了历史信息,对于未来信息一无所知,双向LSTM模型可用来解决该问题。双向LSTM的基本思想是,使用两个LSTM神经网络,一个网络的输入是向量从前往后的顺序,用上文信息预测下文信息,去捕捉上下文关系,另一个网络的输入是向量从后往前的顺序,用下文信息去预测上文信息,从另外一个角度捕捉上下文的关系;最后,将两个网络的隐层单元输出进行拼接,作为双向LSTM层的输出。
Dense层:全连接层的目的是将两个LSTM神经网络学习到的特征映射到样本(向量)的标记空间中,将前面经过多次高度抽象化的特征进行整合,然后可以在接下来激活层,进行归一化,对各种分类情况都输出一个概率,达到分类效果。
Sigmoid层:也叫激活层。对于深度神经网络,中间的隐层的输出必须有一个激活函数。这个激活函数不一定是sigmoid,常见的有sigmoid、tanh、relu等。对于二分类问题,输出层是sigmoid函数。这是因为sigmoid函数可以把实数域光滑的映射到[0,1]空间。函数值恰好可以解释为属于正类的概率(概率的取值范围是0~1)。我们利用sigmoid层可以实现将隐藏层输出的多维向量映射到样本的标签空间上,即经过sigmoid层,可以输出得到模型对一个样本的预测标签值0或1。
步骤6,对于待检测的目标文件,将目标文件用JavaParser工具解析为AST树,然后依据AST树,分析目标文件的源文件数据流,提取每一行的代码块,将代码块转换为代码块向量后,利用训练好的检测模型进行分类,检测出是否包含有缺陷的代码块。如果检测出代码块,则代码块的位置即为缺陷的位置。
步骤6所述的代码块的提取方法,与步骤2.3所述的代码块的提取方法相同,即对于目标文件中的一行代码,以代码行集合、变量名集合分别存储该行代码,以及该行代码所涉及的与文件操作有关的变量的变量名,并提取与所述变量名语义相关的代码行存放到代码行集合中,之后将代码行集合中的代码行组成代码块。
所述的代码块向量的转换方法与步骤4相同,不再赘述。
仿真实验:
发明人从Github前65000个仓库中,一共获取了117168个包含缺陷的java文件,这些java文件中包含六种错误类型,分别为:空指针异常(NullPointerException)、不合法的参数异常(IllegalArgumentException)、不合法的状态异常(IllegalStateException)、运行时异常(RuntimeException)、IO流异常(IOException)、文件寻址异常(FileNotFoundException)。生成符合要求的代码块共计61627个,其中包含缺陷的代码块23025个、不包含缺陷的代码块38602个。
双向LSTM神经网络训练的硬件平台为:NVIDIA GeForce GTX 1080GPU、IntelXeonE5-1620 CPU。当调整双向LSTM网络的参数时,我们将模型的默认值不变,将参数设置为深度学习社区广泛使用的值。我们在输入时,每个词的向量维度word_dim是200维,限制一个样本最长max_len为200个词,不够的补零。一次输入的样本batch_size为8,学习率learning_rate为0.01。BLSTM模型中BLSTM的节点为300。
实验结果:
(1)检测准确率高、漏报率低。
经过模型训练,我们的结果如下表所示。因为我们把含有漏洞信息的代码块标记为0,不含的标记为1,因此将含有漏洞信息的样本看做负样本、不含漏洞信息的看做正样本。因此FNR,即false negative rate,也称漏报率可以达到13.3%,FPR、即falsepositive rate,也称误报率可以达到89.7%,对负样本的识别率TNR可以达到86.7%,对正样本的识别率TPR可以达到89.7%。ACC值即准确度可达87.6%。
表1检测结果的F1-measure值
FNR(%) FPR(%) TNR(%) TPR(%) ACC(%)
13.3 10.3 86.7 89.7 87.6
(2)在github仓库进行检测,检测的结果如下:
因为目前最被人知晓的的商业软件findbugs、pmd都需要源码可编译,而我们的方法建立在单个文件上的静态分析上,无需可编译,为了证明我们方法的可用性,我们从github排名前30的java仓库中下载并配置好了5个仓库,分别是:ReactiveX/RxJava、square/retrofit、apache/incubator-dubbo、huanghongxun/HMCL、zxing/zxing将这5个仓库进行检测和对比,在检测的漏洞中其中有3个漏洞,在仓库的后续更新被修补,且这3个仓库在目前的商业静态分析软件findbugs、pmd中都未检测出来。例如在github,star数为1144的仓库中找到一个漏洞,该漏洞的在最新版本的仓库中被修改。详细信息如下表所示。
表2漏洞详细信息
Figure BDA0001866958900000121
Figure BDA0001866958900000131

Claims (5)

1.一种基于开源代码库的软件缺陷自动检测方法,其特征在于,包括以下步骤:
步骤1,获取开源代码库上项目文件的变更记录,根据项目文件所采用的计算机编程语言中的代码缺陷类型的关键字筛选项目文件的变更记录,获取存在代码缺陷的项目文件信息;所述的项目文件信息包括存在代码缺陷的变更记录,以及该变更记录对应的项目文件;
步骤2,从所述的项目文件信息中提取出缺陷代码行对应的代码块;
步骤3,对提取到的代码块进行变量名替换和标签化处理;
步骤4,将步骤3处理后的代码块转换为代码块向量;
步骤5,利用代码块的向量对双向LSTM神经网络进行训练,保存训练后的神经网络作为检测模型;
步骤6,对于待检测的目标文件,分析目标文件的源文件数据流,提取每一行的代码块,将代码块转换为代码块向量后,利用所述的检测模型进行分类,检测出是否包含有缺陷的代码块;
所述的项目文件信息中提取出缺陷代码行对应的代码块,包括:
步骤2.1,确定项目文件中的缺陷代码行
所述的项目文件包括该项目文件修改前的文件file_old和修改后的文件file_new,对file_new和file_old进行逐一比对,将在file_new中增加的代码行、在file_old中被删除的代码行作为项目文件中的缺陷代码行;
步骤2.2,提取缺陷代码块
对于每一个被删除的代码行,取代码行中涉及到的变量的相关操作所对应的代码,形成一个缺陷代码块;采用同样的方法得到每一个增加的代码行对应的代码块;
步骤2.3,从提取的缺陷代码块中筛选出和文件操作有关的代码块
如果增加或者删除的代码行,其涉及到的变量的类名中包含与文件有关的关键字,则保留这个代码行对应的代码块。
2.如权利要求1所述的基于开源代码库的软件缺陷自动检测方法,其特征在于,所述的对于每一个被删除的代码行,取代码行中涉及到的变量的相关操作所对应的代码,形成一个代码块,包括:
获取项目文件信息的项目文件修改前的文件file_old中被删除的代码行的列表、修改后的文件file_new中增加的代码行的列表;对于一个被删除的代码行,定义代码行集合和变量名集合,分别用于存放所述被删除的代码行,以及被删除的代码行的变量名;
添加被删除的代码行至所述的代码行集合中,将项目文件file_old解析为AST树,获取被删除的代码行所涉及到的变量,然后将变量名添加至所述的变量名集合中;对变量名集合中的变量名提取与之语义相关的代码行,将这些代码行放入到所述的代码行集合中;将代码行集合中的代码行进行排序拼接起来形成代码块,即得到了对于一个被删除的代码行所提取的代码块。
3.如权利要求1所述的基于开源代码库的软件缺陷自动检测方法,其特征在于,所述的对提取到的代码块进行变量名替换和标签化处理,包括:
统计代码块中的变量数目,按照出现的先后顺序进行排序,替换变量名为特定的标记加上该变量名的序号;将从被删除的代码行中提取的代码块标记为0,将从增加的代码行中提取的代码块标记为1。
4.如权利要求1所述的基于开源代码库的软件缺陷自动检测方法,其特征在于,所述的将步骤3处理后的代码块转换为代码块向量,包括:
通过词法分析将代码块划分为一系列标记,包括标识符,关键字,运算符和符号;
将所述的每一个标记映射到一个整数,然后将其转换为固定长度的向量,将这些向量拼接起来形成每个代码块的代码块向量。
5.如权利要求1所述的基于开源代码库的软件缺陷自动检测方法,其特征在于,所述的双向LSTM神经网络,包括:
双向LSTM层,包括两个LSTM神经网络,一个网络的输入是向量从前往后的顺序,用上文信息预测下文信息,去捕捉上下文关系,另一个网络的输入是向量从后往前的顺序,用下文信息去预测上文信息,从另外一个角度捕捉上下文的关系;最后,将两个网络的隐层单元输出进行拼接,作为双向LSTM层的输出;
全连接层,用于将两个LSTM神经网络学习到的特征映射到样本的标记空间中;
激活层,用于将隐藏层输出的多维向量映射到样本的标签空间上。
CN201811359582.7A 2018-11-15 2018-11-15 一种基于开源代码库的软件缺陷自动检测方法 Active CN109697162B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201811359582.7A CN109697162B (zh) 2018-11-15 2018-11-15 一种基于开源代码库的软件缺陷自动检测方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201811359582.7A CN109697162B (zh) 2018-11-15 2018-11-15 一种基于开源代码库的软件缺陷自动检测方法

Publications (2)

Publication Number Publication Date
CN109697162A CN109697162A (zh) 2019-04-30
CN109697162B true CN109697162B (zh) 2021-05-14

Family

ID=66229837

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201811359582.7A Active CN109697162B (zh) 2018-11-15 2018-11-15 一种基于开源代码库的软件缺陷自动检测方法

Country Status (1)

Country Link
CN (1) CN109697162B (zh)

Families Citing this family (22)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110134613B (zh) * 2019-05-22 2020-09-08 北京航空航天大学 一种基于代码语义及背景信息的软件缺陷数据采集系统
CN110232279A (zh) * 2019-06-06 2019-09-13 深圳前海微众银行股份有限公司 一种漏洞检测方法及装置
AU2019459693B2 (en) * 2019-08-01 2023-04-13 Fujitsu Limited Control method, control program, and information processing device
CN110781072A (zh) * 2019-09-10 2020-02-11 中国平安财产保险股份有限公司 基于机器学习的代码审核方法、装置、设备及存储介质
CN112527388B (zh) * 2019-09-17 2022-10-11 中国科学院软件研究所 一种面向GitHub大规模开源代码的快速代码文件溯源方法和装置
CN111459799B (zh) * 2020-03-03 2023-03-10 西北大学 一种基于Github的软件缺陷检测模型建立、检测方法及系统
CN111460450B (zh) * 2020-03-11 2023-02-10 西北大学 一种基于图卷积网络的源代码漏洞检测方法
CN111651164A (zh) * 2020-04-29 2020-09-11 南京航空航天大学 代码标识符的归一化方法、装置
CN111638901A (zh) * 2020-05-11 2020-09-08 紫光云技术有限公司 一种针对云产品bug自动定位的处理装置及方法
CN111597122B (zh) * 2020-07-24 2020-11-06 四川新网银行股份有限公司 一种基于历史缺陷数据挖掘的软件故障注入方法
CN112131570B (zh) * 2020-09-03 2022-06-24 苏州浪潮智能科技有限公司 一种基于pca的密码硬编码检测方法、装置及介质
CN112286807B (zh) * 2020-10-28 2022-01-28 北京航空航天大学 一种基于源代码文件依赖关系的软件缺陷定位系统
CN112527631A (zh) * 2020-11-18 2021-03-19 武汉迈威通信股份有限公司 bug定位方法、系统、电子设备及存储介质
CN112528290B (zh) * 2020-12-04 2023-07-18 扬州大学 漏洞定位方法、系统、计算机设备和存储介质
CN112949282A (zh) * 2021-02-26 2021-06-11 中国联合网络通信集团有限公司 配置文件检查方法及装置
CN112579477A (zh) * 2021-02-26 2021-03-30 北京北大软件工程股份有限公司 一种缺陷检测方法、装置以及存储介质
CN113127339B (zh) * 2021-03-24 2023-02-10 西北大学 一种Github开源平台数据的获取方法及源代码缺陷修复系统
CN113094078B (zh) * 2021-03-31 2023-05-30 建信金融科技有限责任公司 一种安全检测方法、装置、设备及介质
CN115237743A (zh) * 2021-04-24 2022-10-25 华为云计算技术有限公司 代码处理方法、系统、集群、介质及程序产品
US11507352B1 (en) 2021-06-15 2022-11-22 International Business Machines Corporation Reducing semantic errors in code generated by machine learning models
CN113626826A (zh) * 2021-07-29 2021-11-09 西安电子科技大学 智能合约安全检测方法、系统、设备、终端及应用
CN114238124A (zh) * 2021-12-20 2022-03-25 南京邮电大学 一种基于图神经网络的重复Pull Request检测方法

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8286248B1 (en) * 2007-02-01 2012-10-09 Mcafee, Inc. System and method of web application discovery via capture and analysis of HTTP requests for external resources
CN104699611A (zh) * 2015-03-18 2015-06-10 北京航空航天大学 一种基于开源软件缺陷代码修改模式的缺陷信息提取方法
CN107168868A (zh) * 2017-04-01 2017-09-15 西安交通大学 一种基于采样和集成学习的软件更改缺陷预测方法
CN108710568A (zh) * 2018-05-05 2018-10-26 中科软评科技(北京)有限公司 静态代码缺陷的检测方法、计算机设备及存储介质

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8286248B1 (en) * 2007-02-01 2012-10-09 Mcafee, Inc. System and method of web application discovery via capture and analysis of HTTP requests for external resources
CN104699611A (zh) * 2015-03-18 2015-06-10 北京航空航天大学 一种基于开源软件缺陷代码修改模式的缺陷信息提取方法
CN107168868A (zh) * 2017-04-01 2017-09-15 西安交通大学 一种基于采样和集成学习的软件更改缺陷预测方法
CN108710568A (zh) * 2018-05-05 2018-10-26 中科软评科技(北京)有限公司 静态代码缺陷的检测方法、计算机设备及存储介质

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
软件安全漏洞的静态检测技术;张林等;《计算机工程》;20080630;第34卷(第12期);全文 *
面向细粒度源代码变更的缺陷预测方法;原子等;《软件学报》;20141130;全文 *

Also Published As

Publication number Publication date
CN109697162A (zh) 2019-04-30

Similar Documents

Publication Publication Date Title
CN109697162B (zh) 一种基于开源代码库的软件缺陷自动检测方法
WO2021253904A1 (zh) 测试案例集生成方法、装置、设备及计算机可读存储介质
CN111459799B (zh) 一种基于Github的软件缺陷检测模型建立、检测方法及系统
US20060047617A1 (en) Method and apparatus for analysis and decomposition of classifier data anomalies
CN107844533A (zh) 一种智能问答系统及分析方法
CN113672931B (zh) 一种基于预训练的软件漏洞自动检测方法及装置
CN114861194B (zh) 一种基于bgru与cnn融合模型的多类型漏洞检测方法
CN110750297B (zh) 一种基于程序分析和文本分析的Python代码参考信息生成方法
Yang et al. Aspect-based api review classification: How far can pre-trained transformer model go?
CN110162771A (zh) 事件触发词的识别方法、装置、电子设备
CN114398069B (zh) 一种基于交叉指纹分析的公共组件库精确版本识别方法及系统
CN112380848B (zh) 文本生成方法、装置、设备及存储介质
Saxe et al. CrowdSource: Automated inference of high level malware functionality from low-level symbols using a crowd trained machine learning model
CN112100377A (zh) 文本分类方法、装置、计算机设备和存储介质
CN112000929A (zh) 一种跨平台数据分析方法、系统、设备及可读存储介质
US20230385037A1 (en) Method and system for automated discovery of artificial intelligence (ai)/ machine learning (ml) assets in an enterprise
CN113377844A (zh) 面向大型关系型数据库的对话式数据模糊检索方法及装置
CN113553052A (zh) 使用Attention编码表示自动识别与安全相关的代码提交的方法
CN116975881A (zh) 一种基于llvm的漏洞细粒度定位方法
CN115562645B (zh) 一种基于程序语义的配置故障预测方法
CN116578700A (zh) 日志分类方法、日志分类装置、设备及介质
CN117592061B (zh) 融合代码漏洞特征及属性图的源代码安全检测方法与装置
CN113505889B (zh) 图谱化知识库的处理方法、装置、计算机设备和存储介质
CN117574391B (zh) 一种基于三地址码和神经网络的代码漏洞检测方法和系统
CN118095217B (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
GR01 Patent grant
GR01 Patent grant