CN110543770A - 一种开源软件的漏洞检测方法、装置及系统 - Google Patents
一种开源软件的漏洞检测方法、装置及系统 Download PDFInfo
- Publication number
- CN110543770A CN110543770A CN201910821578.6A CN201910821578A CN110543770A CN 110543770 A CN110543770 A CN 110543770A CN 201910821578 A CN201910821578 A CN 201910821578A CN 110543770 A CN110543770 A CN 110543770A
- Authority
- CN
- China
- Prior art keywords
- source software
- open source
- vulnerability detection
- data
- intermediate representation
- 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
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/55—Detecting local intrusion or implementing counter-measures
- G06F21/56—Computer malware detection or handling, e.g. anti-virus arrangements
- G06F21/562—Static detection
- G06F21/563—Static detection by source code analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/57—Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
- G06F21/577—Assessing vulnerabilities and evaluating computer system security
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/04—Architecture, e.g. interconnection topology
- G06N3/044—Recurrent networks, e.g. Hopfield networks
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/04—Architecture, e.g. interconnection topology
- G06N3/045—Combinations of networks
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/08—Learning methods
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Computer Security & Cryptography (AREA)
- Computer Hardware Design (AREA)
- General Physics & Mathematics (AREA)
- Computing Systems (AREA)
- Health & Medical Sciences (AREA)
- General Health & Medical Sciences (AREA)
- Biomedical Technology (AREA)
- Molecular Biology (AREA)
- Evolutionary Computation (AREA)
- Data Mining & Analysis (AREA)
- Mathematical Physics (AREA)
- Computational Linguistics (AREA)
- Biophysics (AREA)
- Artificial Intelligence (AREA)
- Life Sciences & Earth Sciences (AREA)
- Virology (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种开源软件的漏洞检测方法、装置及系统,包括分析出待检测开源软件源代码中各关键节点的数据依赖关系和控制依赖关系,并基于所述数据依赖和控制依赖关系形成控制流图;遍历所述控制流图生成中间表示,所述中间表示中包含与各关键节点存在数据依赖关系和控制依赖关系的语句;将所述中间表示处理成若干个固定维度的向量,依据各固定维度的向量是否含有漏洞打上不同的标签,并作为输入训练出漏洞检测模型,完成开源软件的漏洞检测。本发明运用静态分析将开源软件源代码中的方法抽象为包含数据依赖关系和控制依赖关系的中间表示,再将中间表示映射为向量并贴上标签,最后训练出漏洞检测模型,能够大大提高检测出漏洞的准确率和召回率。
Description
技术领域
本发明属于漏洞检测技术领域,具体涉及一种开源软件的漏洞检测方法、装置及系统。
背景技术
随着计算机技术应用的不断深化,软件的需求和规模不断增加,这无疑给开发人员带来了新的挑战。有效地使用开源软件不仅可以提高软件开发效率,还能够降低软件开发成本。为了更快速高效地完成开发,开源软件得到了推崇和盛行。据相关数据显示,2018年各大平台的工具包的下载量均有了不同程度的上涨,仅npm在2018年全年的下载次数就达到了令人难以置信的3170亿次。
但是,开源软件的广泛使用在给开发人员提供极大便利的同时,也带来了很多问题:首先,开源软件漏洞与日俱增。2018年,npm的漏洞数量增长了47%,RHEL、Debian、Ubuntu增加了4倍多。两年内开源软件的漏洞数量增长了88%。其次,开源软件漏洞得不到重视和修复。37%的开源开发者在持续集成(Continuous Integration,CI)期间没有实施任何类型的安全测试。54%的开发者没有对Docker镜像进行任何安全测试。从漏洞添加至开源软件包到修复漏洞的时间中位数超过2年。最后,开源软件的使用引入了更多的漏洞。78%的漏洞来源于对开源软件直接或间接的引用。
目前为了检测出开源软件的漏洞常用的工具包括:SVM分类器标记可疑代码的VccFinder工具和VulPecker工具。VccFinder工具虽然降低了误报率,但在检测不同语言代码时,每次都需要重新提取特征和进行模型训练。而VulPecker工具虽然在检测代码克隆的漏洞时误报率极低,但是不适合处理其他类型的漏洞。
发明内容
针对上述问题,本发明提出一种开源软件的漏洞检测方法、装置及系统,首先运用静态分析将开源软件源代码中的方法抽象为包含数据依赖关系和控制依赖关系的中间表示,再将中间表示映射为向量并贴上标签,最后运用双向LSTM训练出漏洞检测模型,从而能够有效地检测出开源软件中的漏洞。
实现上述技术目的,达到上述技术效果,本发明通过以下技术方案实现:
第一方面,本发明提供了一种开源软件的漏洞检测方法,包括:
分析出待检测开源软件源代码中各关键节点的数据依赖关系和控制依赖关系,并基于所述数据依赖和控制依赖关系形成控制流图;
遍历所述控制流图生成中间表示,所述中间表示中包含与各关键节点存在数据依赖关系和控制依赖关系的语句;
将所述中间表示处理成若干个固定维度的向量,依据各固定维度的向量是否含有漏洞打上不同的标签,并作为输入训练出漏洞检测模型,完成开源软件的漏洞检测。
可选地,所述关键节点通过以下步骤获得:
基于待检测的开源软件代码生成抽象语法树;
遍历所述抽象语法树提取出关键节点。
可选地,所述遍历所述抽象语法树提取出关键节点,具体为:
遍历所述抽象语法树;
基于节点类型提取出关键节点,并对用户自定义的变量名做统一替换,将相同类型的变量映射为同一标识。
可选地,所述数据依赖关系表示与关键节点相关的数据定义语句;所述控制依赖关系表示与关键节点相关的语句之间的跳转关系。
可选地,所述各关键节点的数据依赖关系的获取过程为:
运用数据流分析技术分析关键节点,得到关键节点在开源软件中的各个函数方法之间的数据依赖关系,所述数据依赖关系包括数据和方法,将所述数据和方法的类型补全为完整类型;所述各关键节点间的控制依赖关系的获取过程为:运用控制流分析技术分析关键节点在方法间的控制依赖关系。
可选地,所述将所述中间表示处理成若干个固定维度的向量,具体包括以下步骤:
对所述中间表示做分词处理,其中,每个单词和符号均为一个独立的token,以函数为单位,每条函数将被转化为一条token序列;
将所有token不重复地加入到词表中,并为词表中的每个token分配一个连续的唯一的整数索引,完成词表的建立;
将所有token替换为它对应的整数索引值,实现token序列转换为整数序列;
将所有整数序列的长度补充至固定长度,缺少部分填0;
将整数序列中的整数索引值按照词表大小的长度展开,索引位置1,其余位填0,形成one-hot编码,进而得到若干个固定维度的向量。
可选地,所述固定维度的向量通过以下步骤形成:
基于one-hot编码形成m*n初始矩阵;
获取随机生成的n*p的embedding矩阵;
将所述m*n初始矩阵与n*p的embedding矩阵相乘,实现将m*n初始矩阵压缩为大小为m*p的压缩矩阵,所述m*p的压缩矩阵中包括若干个固定维度的向量。
可选地,所述漏洞检测模型的训练过程具体为:
选取双向LSTM模型;
将打上标签的固定维度的向量作为输入训练所述双向LSTM模型,获得漏洞检测模型。
第二方面,本发明提供了一种开源软件的漏洞检测装置,包括:
第一生成模块,用于分析出待检测开源软件源代码中各关键节点的数据依赖关系和控制依赖关系,并基于所述数据依赖和控制依赖关系形成控制流图;
第二生成模块,用于遍历所述控制流图生成中间表示,所述中间表示中包含与各关键节点存在数据依赖关系和控制依赖关系的语句;
检测模块,用于将所述中间表示处理成若干个固定维度的向量,依据各固定维度的向量是否含有漏洞打上不同的标签,并作为输入训练出漏洞检测模型,完成开源软件的漏洞检测。
可选地,所述关键节点通过以下步骤获得:
基于待检测的开源软件代码生成抽象语法树;
遍历所述抽象语法树提取出关键节点。
可选地,所述遍历所述抽象语法树提取出关键节点,具体为:
遍历所述抽象语法树;
基于节点类型提取出关键节点,并对用户自定义的变量名做统一替换,将相同类型的变量映射为同一标识。
可选地,所述数据依赖关系表示与关键节点相关的数据定义语句;所述控制依赖关系表示与关键节点相关的语句之间的跳转关系。
可选地,所述各关键节点的数据依赖关系的获取过程为:运用数据流分析技术分析关键节点,得到关键节点在开源软件中的各个函数方法之间的数据依赖关系,所述数据依赖关系包括数据和方法,将所述数据和方法的类型补全为完整类型;所述各关键节点间的控制依赖关系的获取过程为:运用控制流分析技术分析关键节点在方法间的控制依赖关系。
可选地,所述将所述中间表示处理成若干个固定维度的向量,具体包括以下步骤:
对所述中间表示做分词处理,其中,每个单词和符号均为一个独立的token,以函数为单位,每条函数将被转化为一条token序列;
将所有token不重复地加入到词表中,并为词表中的每个token分配一个连续的唯一的整数索引,完成词表的建立;
将所有token替换为它对应的整数索引值,实现token序列转换为整数序列;
将所有整数序列的长度补充至固定长度,缺少部分填0;
将整数序列中的整数索引值按照词表大小的长度展开,索引位置1,其余位填0,形成one-hot编码,进而得到若干个固定维度的向量。
可选地,所述固定维度的向量通过以下步骤形成:
基于one-hot编码形成m*n初始矩阵;
获取随机生成的n*p的embedding矩阵;
将所述m*n初始矩阵与n*p的embedding矩阵相乘,实现将m*n初始矩阵压缩为大小为m*p的压缩矩阵,所述m*p的压缩矩阵中包括若干个固定维度的向量。
第三方面,本发明提供了一种开源软件的漏洞检测系统,包括:
处理器,适于实现各指令;以及
存储设备,适于存储多条指令,所述指令适于由处理器加载并执行第一方面中任一项所述的步骤。
本发明的有益效果:
本发明提出的一种开源软件的漏洞检测方法、装置及系统,运用静态分析将开源软件源代码中的方法抽象为包含数据依赖关系和控制依赖关系的中间表示,再将中间表示映射为向量并贴上标签,最后训练出漏洞检测模型,能够大大提高检测出漏洞的准确率和召回率。
附图说明
图1为本发明一种实施例的整体流程示意图;
图2为本发明一种实施例的抽象语法树的结构示意图;
图3为本发明一种实施例的控制流图;
图4为本发明一种实施例的包含数据和控制依赖关系的中间表示;
图5为本发明一种实施例的增设Embedding层以压缩向量的示意图;
图6为本发明一种实施例的双向LSTM网络结构图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
下面结合附图对本发明的应用原理作详细的描述。
实施例1
本发明实施例中提供了一种开源软件的漏洞检测方法,如图1所示,具体包括以下步骤:
(1)分析出待检测开源软件源代码中各关键节点的数据依赖关系和控制依赖关系,并基于所述数据依赖和控制依赖关系形成控制流图(Control Flow Graph,CFG),具体参见图3;
在本发明实施例的一种具体实施方式中,所述关键节点通过以下步骤获得:
基于待检测的开源软件代码生成抽象语法树;所述抽象语法树是待检测的开源软件代码的一种树状的表现形式,树上的每个节点都表示源代码中的一种结构,如图2所示;
遍历所述抽象语法树提取出关键节点。
进一步地,所述遍历所述抽象语法树提取出关键节点,具体为:
遍历所述抽象语法树;
基于节点类型提取出关键节点(即关键数据和属性),并对用户自定义的变量名做统一替换,将相同类型的变量映射为同一标识,能够解决由于变量名多由程序员自定义,过于自由,会导致之后分词过后的词表过于庞大,一方面不利于神经网络的学习训练,另一方面会导致向量维度的暴增,浪费计算资源的问题,例如,同样是bool类型的变量,程序员A命名为isTrue,程序员B命名为isRight,程序员C命名为exist等等,在遍历抽象语法树的过程中将统一被替换为b,同一方法体中的不同bool类型变量用b1、b2区分。
在本发明实施例的一种具体实施方式中,所述数据依赖关系表示与关键节点相关的数据定义语句;所述控制依赖关系表示与关键节点相关的语句之间的跳转关系;
所述各关键节点的数据依赖关系的获取过程为:运用现有的数据流分析技术分析关键节点在方法间的数据依赖关系,得到关键节点在程序中的各个函数方法之间的数据依赖关系,即在方法间追踪该关键节点的数据流向,为其添加数据依赖关系,如将SecureRandom扩充为java.security.SecureRandom,并将数据流分析所得的数据依赖关系保存在节点内。,由于数据流分析技术分析得到的数据和方法的信息不是足够充分,例如在一个方法内部通过数据流分析技术分析获得了变量,由于这个变量属于全局变量不属于这个方法的局部变量,所以在这个方法内部只获得了变量类型和变量名的信息,无法获得这个变量与其他变量和方法关系等一些关键信息。而且可能会遗漏某些关键信息,为了更好地追踪数据的依赖关系,数据流分析过程中会产生一些以“$”开头的用于过渡的临时变量,并将数据和方法的类型补全为完整类型,例如将String s替换为java.lang.String s;所述各关键节点间的控制依赖关系的获取过程为:运用现有的控制流分析技术分析关键节点在方法间的控制依赖关系,即基于前面的数据流分析中的涉及到的关键节点,分析节点在方法内部的控制依赖关系,并用有向边表示出来,继而生成了控制流图,由于该过程为现有技术,因此本发明实施例中不做过多的赘述;
所述控制流图是一个方法或程序的抽象表现,代表了一个程序执行过程中会遍历到的所有路径,它用图的形式表示一个过程内所有基本块执行的可能流向。
(2)遍历所述控制流图生成中间表示,所述中间表示中包含与各关键节点存在数据依赖关系和控制依赖关系的语句;
将待检测开源软件源代码处理成如图4所示的中间表示,主要有以下几点好处:第一,简化了Java语句,将原来复杂的语句简化为15种基本语句,抽象程度较高;第二,保留了变量的类型;第三,对变量名做了统一替换,压缩了词表的大小。
(3)将所述中间表示处理成若干个固定维度的向量,依据各固定维度的向量是否含有漏洞打上不同的标签,并作为输入训练出漏洞检测模型,完成开源软件的漏洞检测。
在本发明实施例的一种具体实施方式中,所述将所述中间表示处理成若干个固定维度的向量,具体包括以下步骤:
根据空格对所述中间表示做分词处理,其中,每个单词和符号均为一个独立的token,以函数为单位,每条函数将被转化为一条token序列,统计token序列长度的分布情况,以500为界限(统计结果显示,长度不超过500的序列所占比重约为95%),删除长度大于500的token序列;例如java.lang.String将被分割为五个独立的token。以函数为单位,每条函数将被转化为一条token序列。筛除长度过短的token序列,该部分序列对应的函数过短,不具备有效的信息,无法作为训练样本;
将所有token不重复地加入到词表中,从1开始为为词表中的每个token分配一个连续的唯一的整数索引,完成词表的建立;
将所有token替换为它对应的整数索引值,实现token序列转换为整数序列;
将所有整数序列的长度补充至固定长度,缺少部分填0,比如将所有整数序列的长度补充至500,缺少部分填0;
将整数序列中的整数索引值按照词表大小的长度展开,索引位置1,其余位填0,形成one-hot编码,例如,假定词表的大小为5,整数序列为(1,2,4,1),其将被展开为(10000,01000,00010,10000)。One-hot编码,又称为独热编码、一位有效编码,其方法是采用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候只有一位有效。预处理部分将token序列转化为整数序列其实就是在为转化为one-hot编码做准备。以token序列表示的文本虽然可读性比较好,却无法用深度学习,因此我们需要对其进行特征数字化,拟采用的方法就是转换为one-hot编码。这样做的好处一是解决了分类器不好处理离散数据的问题,二是在一定程度上起到了扩充特征的作用,三是解决了token长度不一致的问题。
一个函数体对应一个整数序列,其整数数量被填充至固定长度m,每个整数被展开为固定长度n,由此一个函数体就对应成一个m*n初始矩阵。
虽然变量名的替换在一定程度上对词表进行了压缩,但是随着项目数量的不断增多,词表的大小还是很容易就能达到万的级别,这意味着一个token序列展开后的长度是百万级的。因此,需要在模型中增加embedding层对one-hot编码进行压缩。其原理如图4.5所示。但是one-hot编码有几个较明显的缺点:首先,这是一个词袋模型,不考虑词与词之间的顺序信息,该缺点可以通过选取双向LSTM学习顺序信息来有效解决。其次,它假设词与词之间相互独立,虽然在大多数情况下,词与词之间是相互影响的,但是由于该实验的研究对象是源代码,恰好符合这一情境,进而转变为一种优势。最后,它得到的特征是离散稀疏的,因此需要在模型中加入Embedding层对向量进行压缩降维。因此,所述固定维度的向量通过以下步骤形成,具体参见图5:
基于one-hot编码形成m*n初始矩阵;
获取随机生成的n*p的embedding矩阵;
将所述m*n初始矩阵与n*p的embedding矩阵相乘,实现将m*n初始矩阵压缩为大小为m*p的压缩矩阵,所述m*p的压缩矩阵中包括若干个固定维度的向量,压缩效果显著。
所述依据其是否含有漏洞打上不同的标签,具体为:
设定“0”表示没有安全漏洞,“1”表示含有安全漏洞;
依据每个函数是否包含漏洞,为其对应的固定维度的向量打上标签“0”或者“1”;
所述漏洞检测模型的训练过程具体为:
选取双向LSTM模型,具体参见图6;双向LSTM模型组合了前向LSTM与后向LSTM,一方面保留了LSTM能够解决梯度消失问题的特性,另一方面在原先仅考虑前向序列信息的基础上增加了后向序列信息,由此丰富了代码的上下文信息;
将打上标签的固定维度的向量作为输入训练所述双向LSTM模型,获得漏洞检测模型。
综上所述,本发明实施例中的用于开源软件的漏洞检测方法,首先运用静态分析将开源软件源代码中的方法抽象为包含数据依赖关系和控制依赖关系的中间表示,再将中间表示映射为向量并贴上标签,最后运用双向LSTM训练出漏洞检测模型。其中,所述静态分析包含抽象语法树分析、数据流分析以及控制流分析。
将本发明的方法分别与VulDeePecker方法以及AE-KNN方法进行比较,可知:
VulDeePecker方法首先提取源代码中的API和库方法调用,运用代码切片将源代码分割成一个个code gadgets;然后用统一的标识符替换掉用户自定义的变量名和函数名,并为每个code gadgets贴上标签;最后选取双向LSTM模型在数据集上训练出相应模型。但是该方法忽略了部分控制流信息,因此会在准确率和召回率上稍显逊色。
AE-KNN方法首先应用图形数据库形成源代码的代码属性图,然后依据某种规则遍历代码属性图形成API序列并量化为特征向量,最后对特征向量进行聚类,提取每一类中异常值排序高的样本函数匹配漏洞库,得到代码中的漏洞。实验结果如表1表明,本发明所提出的方法在准确率和召回率上均优于上述方法。
表1不同方法实验结果对比
实施例2
基于与实施例1相同的发明构思,本发明实施例中提供了一种开源软件的漏洞检测装置,包括:
第一生成模块,用于分析出待检测开源软件源代码中各关键节点的数据依赖关系和控制依赖关系,并基于所述数据依赖和控制依赖关系形成控制流图;
第二生成模块,用于遍历所述控制流图生成中间表示,所述中间表示中包含与各关键节点存在数据依赖关系和控制依赖关系的语句;
检测模块,用于将所述中间表示处理成若干个固定维度的向量,依据各固定维度的向量是否含有漏洞打上不同的标签,并作为输入训练出漏洞检测模型,完成开源软件的漏洞检测。
优选地,所述关键节点通过以下步骤获得:
基于待检测的开源软件代码生成抽象语法树;
遍历所述抽象语法树提取出关键节点。
优选地,所述遍历所述抽象语法树提取出关键节点,具体为:
遍历所述抽象语法树;
基于节点类型提取出关键节点,并对用户自定义的变量名做统一替换,将相同类型的变量映射为同一标识。
优选地,所述数据依赖关系表示与关键节点相关的数据定义语句;所述控制依赖关系表示与关键节点相关的语句之间的跳转关系。
优选地,所述各关键节点的数据依赖关系的获取过程为:运用数据流分析技术分析关键节点,得到关键节点在开源软件中的各个函数方法之间的数据依赖关系,所述数据依赖关系包括数据和方法,将所述数据和方法的类型补全为完整类型;所述各关键节点间的控制依赖关系的获取过程为:运用控制流分析技术分析关键节点在方法间的控制依赖关系。
优选地,所述将所述中间表示处理成若干个固定维度的向量,具体包括以下步骤:
对所述中间表示做分词处理,其中,每个单词和符号均为一个独立的token,以函数为单位,每条函数将被转化为一条token序列;
将所有token不重复地加入到词表中,并为词表中的每个token分配一个连续的唯一的整数索引,完成词表的建立;
将所有token替换为它对应的整数索引值,实现token序列转换为整数序列;
将所有整数序列的长度补充至固定长度,缺少部分填0;
将整数序列中的整数索引值按照词表大小的长度展开,索引位置1,其余位填0,形成one-hot编码,进而得到若干个固定维度的向量。
优选地,所述固定维度的向量通过以下步骤形成:
基于one-hot编码形成m*n初始矩阵;
获取随机生成的n*p的embedding矩阵;
将所述m*n初始矩阵与n*p的embedding矩阵相乘,实现将m*n初始矩阵压缩为大小为m*p的压缩矩阵,所述m*p的压缩矩阵中包括若干个固定维度的向量。
实施例3
本发明实施例提供了一种开源软件的漏洞检测系统,包括:
处理器,适于实现各指令;以及
存储设备,适于存储多条指令,所述指令适于由处理器加载并执行实施例1中任一项所述的步骤。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
以上结合附图对本发明的实施例进行了描述,但是本发明并不局限于上述的具体实施方式,上述的具体实施方式仅仅是示意性的,而不是限制性的,本领域的普通技术人员在本发明的启示下,在不脱离本发明宗旨和权利要求所保护的范围情况下,还可做出很多形式,这些均属于本发明的保护之内。
以上显示和描述了本发明的基本原理和主要特征和本发明的优点。本行业的技术人员应该了解,本发明不受上述实施例的限制,上述实施例和说明书中描述的只是说明本发明的原理,在不脱离本发明精神和范围的前提下,本发明还会有各种变化和改进,这些变化和改进都落入要求保护的本发明范围内。本发明要求保护范围由所附的权利要求书及其等效物界定。
Claims (16)
1.一种开源软件的漏洞检测方法,其特征在于,包括:
分析出待检测开源软件源代码中各关键节点的数据依赖关系和控制依赖关系,并基于所述数据依赖和控制依赖关系形成控制流图;
遍历所述控制流图生成中间表示,所述中间表示中包含与各关键节点存在数据依赖关系和控制依赖关系的语句;
将所述中间表示处理成若干个固定维度的向量,依据各固定维度的向量是否含有漏洞打上不同的标签,并作为输入训练出漏洞检测模型,完成开源软件的漏洞检测。
2.根据权利要求1所述的一种开源软件的漏洞检测方法,其特征在于:所述关键节点通过以下步骤获得:
基于待检测的开源软件代码生成抽象语法树;
遍历所述抽象语法树提取出关键节点。
3.根据权利要求2所述的一种开源软件的漏洞检测方法,其特征在于:所述遍历所述抽象语法树提取出关键节点,具体为:
遍历所述抽象语法树;
基于节点类型提取出关键节点,并对用户自定义的变量名做统一替换,将相同类型的变量映射为同一标识。
4.根据权利要求1所述的一种开源软件的漏洞检测方法,其特征在于:所述数据依赖关系表示与关键节点相关的数据定义语句;所述控制依赖关系表示与关键节点相关的语句之间的跳转关系。
5.根据权利要求1所述的一种开源软件的漏洞检测方法,其特征在于,所述各关键节点的数据依赖关系的获取过程为:
运用数据流分析技术分析关键节点,得到关键节点在开源软件中的各个函数方法之间的数据依赖关系,所述数据依赖关系包括数据和方法,将所述数据和方法的类型补全为完整类型;所述各关键节点间的控制依赖关系的获取过程为:运用控制流分析技术分析关键节点在方法间的控制依赖关系。
6.根据权利要求1所述的一种开源软件的漏洞检测方法,其特征在于:所述将所述中间表示处理成若干个固定维度的向量,具体包括以下步骤:
对所述中间表示做分词处理,其中,每个单词和符号均为一个独立的token,以函数为单位,每条函数将被转化为一条token序列;
将所有token不重复地加入到词表中,并为词表中的每个token分配一个连续的唯一的整数索引,完成词表的建立;
将所有token替换为它对应的整数索引值,实现token序列转换为整数序列;
将所有整数序列的长度补充至固定长度,缺少部分填0;
将整数序列中的整数索引值按照词表大小的长度展开,索引位置1,其余位填0,形成one-hot编码,进而得到若干个固定维度的向量。
7.根据权利要求6所述的一种开源软件的漏洞检测方法,其特征在于:所述固定维度的向量通过以下步骤形成:
基于one-hot编码形成m*n初始矩阵;
获取随机生成的n*p的embedding矩阵;
将所述m*n初始矩阵与n*p的embedding矩阵相乘,实现将m*n初始矩阵压缩为大小为m*p的压缩矩阵,所述m*p的压缩矩阵中包括若干个固定维度的向量。
8.根据权利要求1所述的一种开源软件的漏洞检测方法,其特征在于:所述漏洞检测模型的训练过程具体为:
选取双向LSTM模型;
将打上标签的固定维度的向量作为输入训练所述双向LSTM模型,获得漏洞检测模型。
9.一种开源软件的漏洞检测装置,其特征在于,包括:
第一生成模块,用于分析出待检测开源软件源代码中各关键节点的数据依赖关系和控制依赖关系,并基于所述数据依赖和控制依赖关系形成控制流图;
第二生成模块,用于遍历所述控制流图生成中间表示,所述中间表示中包含与各关键节点存在数据依赖关系和控制依赖关系的语句;
检测模块,用于将所述中间表示处理成若干个固定维度的向量,依据各固定维度的向量是否含有漏洞打上不同的标签,并作为输入训练出漏洞检测模型,完成开源软件的漏洞检测。
10.根据权利要求9所述的一种开源软件的漏洞检测装置,其特征在于:所述关键节点通过以下步骤获得:
基于待检测的开源软件代码生成抽象语法树;
遍历所述抽象语法树提取出关键节点。
11.根据权利要求10所述的一种开源软件的漏洞检测装置,其特征在于:所述遍历所述抽象语法树提取出关键节点,具体为:
遍历所述抽象语法树;
基于节点类型提取出关键节点,并对用户自定义的变量名做统一替换,将相同类型的变量映射为同一标识。
12.根据权利要求9所述的一种开源软件的漏洞检测装置,其特征在于:所述数据依赖关系表示与关键节点相关的数据定义语句;所述控制依赖关系表示与关键节点相关的语句之间的跳转关系。
13.根据权利要求9所述的一种开源软件的漏洞检测装置,其特征在于:所述各关键节点的数据依赖关系的获取过程为:运用数据流分析技术分析关键节点,得到关键节点在开源软件中的各个函数方法之间的数据依赖关系,所述数据依赖关系包括数据和方法,将所述数据和方法的类型补全为完整类型;所述各关键节点间的控制依赖关系的获取过程为:运用控制流分析技术分析关键节点在方法间的控制依赖关系。
14.根据权利要求9所述的一种开源软件的漏洞检测装置,其特征在于:所述将所述中间表示处理成若干个固定维度的向量,具体包括以下步骤:
对所述中间表示做分词处理,其中,每个单词和符号均为一个独立的token,以函数为单位,每条函数将被转化为一条token序列;
将所有token不重复地加入到词表中,并为词表中的每个token分配一个连续的唯一的整数索引,完成词表的建立;
将所有token替换为它对应的整数索引值,实现token序列转换为整数序列;
将所有整数序列的长度补充至固定长度,缺少部分填0;
将整数序列中的整数索引值按照词表大小的长度展开,索引位置1,其余位填0,形成one-hot编码,进而得到若干个固定维度的向量。
15.根据权利要求9所述的一种开源软件的漏洞检测装置,其特征在于:所述固定维度的向量通过以下步骤形成:
基于one-hot编码形成m*n初始矩阵;
获取随机生成的n*p的embedding矩阵;
将所述m*n初始矩阵与n*p的embedding矩阵相乘,实现将m*n初始矩阵压缩为大小为m*p的压缩矩阵,所述m*p的压缩矩阵中包括若干个固定维度的向量。
16.一种开源软件的漏洞检测系统,其特征在于,包括:
处理器,适于实现各指令;以及
存储设备,适于存储多条指令,所述指令适于由处理器加载并执行权利要求1~8中任一项所述的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910821578.6A CN110543770B (zh) | 2019-09-02 | 2019-09-02 | 一种开源软件的漏洞检测方法、装置及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910821578.6A CN110543770B (zh) | 2019-09-02 | 2019-09-02 | 一种开源软件的漏洞检测方法、装置及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110543770A true CN110543770A (zh) | 2019-12-06 |
CN110543770B CN110543770B (zh) | 2022-06-28 |
Family
ID=68712456
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910821578.6A Active CN110543770B (zh) | 2019-09-02 | 2019-09-02 | 一种开源软件的漏洞检测方法、装置及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110543770B (zh) |
Cited By (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110955898A (zh) * | 2019-12-12 | 2020-04-03 | 杭州安恒信息技术股份有限公司 | 一种建站系统的漏洞审计方法、系统及相关装置 |
CN111008376A (zh) * | 2019-12-09 | 2020-04-14 | 国网山东省电力公司电力科学研究院 | 一种基于代码动态分析的移动应用源代码安全审计系统 |
CN111143219A (zh) * | 2019-12-27 | 2020-05-12 | 中国信息安全测评中心 | 一种基于人工智能的软件代码缺陷识别方法及相关装置 |
CN112612471A (zh) * | 2020-11-19 | 2021-04-06 | 孙永杰 | 代码处理方法、装置、设备及存储介质 |
CN112651028A (zh) * | 2021-01-05 | 2021-04-13 | 西安工业大学 | 基于上下文语义和补丁验证的漏洞代码克隆检测方法 |
CN112733156A (zh) * | 2021-01-29 | 2021-04-30 | 中国人民解放军国防科技大学 | 基于代码属性图的软件脆弱性智能检测方法、系统及介质 |
CN112764878A (zh) * | 2021-01-13 | 2021-05-07 | 中科曙光(南京)计算技术有限公司 | 一种基于深度学习的大数据一体机容器集群风险预测方法 |
CN112989358A (zh) * | 2021-03-10 | 2021-06-18 | 华中科技大学 | 提高基于深度学习的源代码漏洞检测健壮性的方法及装置 |
CN113312617A (zh) * | 2021-05-24 | 2021-08-27 | 南京大学 | 一种面向代码安全的提交优先级排序方法和系统 |
CN113918951A (zh) * | 2021-12-16 | 2022-01-11 | 北京微步在线科技有限公司 | 基于抽象语法树的恶意代码检测方法、装置及电子设备 |
CN114547619A (zh) * | 2022-01-11 | 2022-05-27 | 扬州大学 | 一种基于树的漏洞修复系统及修复方法 |
CN115146282A (zh) * | 2022-08-31 | 2022-10-04 | 中国科学院大学 | 基于ast的源代码异常检测方法及其装置 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109657473A (zh) * | 2018-11-12 | 2019-04-19 | 华中科技大学 | 一种基于深度特征的细粒度漏洞检测方法 |
-
2019
- 2019-09-02 CN CN201910821578.6A patent/CN110543770B/zh active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109657473A (zh) * | 2018-11-12 | 2019-04-19 | 华中科技大学 | 一种基于深度特征的细粒度漏洞检测方法 |
Cited By (20)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111008376B (zh) * | 2019-12-09 | 2021-11-05 | 国网山东省电力公司电力科学研究院 | 一种基于代码动态分析的移动应用源代码安全审计系统 |
CN111008376A (zh) * | 2019-12-09 | 2020-04-14 | 国网山东省电力公司电力科学研究院 | 一种基于代码动态分析的移动应用源代码安全审计系统 |
CN110955898A (zh) * | 2019-12-12 | 2020-04-03 | 杭州安恒信息技术股份有限公司 | 一种建站系统的漏洞审计方法、系统及相关装置 |
CN111143219A (zh) * | 2019-12-27 | 2020-05-12 | 中国信息安全测评中心 | 一种基于人工智能的软件代码缺陷识别方法及相关装置 |
CN112612471A (zh) * | 2020-11-19 | 2021-04-06 | 孙永杰 | 代码处理方法、装置、设备及存储介质 |
CN112651028A (zh) * | 2021-01-05 | 2021-04-13 | 西安工业大学 | 基于上下文语义和补丁验证的漏洞代码克隆检测方法 |
CN112651028B (zh) * | 2021-01-05 | 2022-09-30 | 西安工业大学 | 基于上下文语义和补丁验证的漏洞代码克隆检测方法 |
CN112764878A (zh) * | 2021-01-13 | 2021-05-07 | 中科曙光(南京)计算技术有限公司 | 一种基于深度学习的大数据一体机容器集群风险预测方法 |
CN112764878B (zh) * | 2021-01-13 | 2024-04-23 | 中科曙光(南京)计算技术有限公司 | 一种基于深度学习的大数据一体机容器集群风险预测方法 |
CN112733156A (zh) * | 2021-01-29 | 2021-04-30 | 中国人民解放军国防科技大学 | 基于代码属性图的软件脆弱性智能检测方法、系统及介质 |
CN112733156B (zh) * | 2021-01-29 | 2024-04-12 | 中国人民解放军国防科技大学 | 基于代码属性图的软件脆弱性智能检测方法、系统及介质 |
CN112989358A (zh) * | 2021-03-10 | 2021-06-18 | 华中科技大学 | 提高基于深度学习的源代码漏洞检测健壮性的方法及装置 |
US12026260B2 (en) | 2021-03-10 | 2024-07-02 | Huazhong University Of Science And Technology | Deep-learning based device and method for detecting source-code vulnerability with improved robustness |
CN112989358B (zh) * | 2021-03-10 | 2022-07-01 | 华中科技大学 | 提高基于深度学习的源代码漏洞检测健壮性的方法及装置 |
CN113312617B (zh) * | 2021-05-24 | 2023-11-03 | 南京大学 | 一种面向代码安全的提交优先级排序方法和系统 |
CN113312617A (zh) * | 2021-05-24 | 2021-08-27 | 南京大学 | 一种面向代码安全的提交优先级排序方法和系统 |
CN113918951A (zh) * | 2021-12-16 | 2022-01-11 | 北京微步在线科技有限公司 | 基于抽象语法树的恶意代码检测方法、装置及电子设备 |
CN114547619A (zh) * | 2022-01-11 | 2022-05-27 | 扬州大学 | 一种基于树的漏洞修复系统及修复方法 |
CN114547619B (zh) * | 2022-01-11 | 2024-04-19 | 扬州大学 | 一种基于树的漏洞修复系统及修复方法 |
CN115146282A (zh) * | 2022-08-31 | 2022-10-04 | 中国科学院大学 | 基于ast的源代码异常检测方法及其装置 |
Also Published As
Publication number | Publication date |
---|---|
CN110543770B (zh) | 2022-06-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110543770B (zh) | 一种开源软件的漏洞检测方法、装置及系统 | |
KR101873619B1 (ko) | 상태 기계 격자에서의 불리언 로직 | |
KR101840905B1 (ko) | 상태 기계 격자에서의 카운터 동작 | |
CN111475820B (zh) | 基于可执行程序的二进制漏洞检测方法、系统及存储介质 | |
US11159547B2 (en) | Malware clustering approaches based on cognitive computing techniques | |
CN109543410B (zh) | 一种基于语义映射关联的恶意代码检测方法 | |
CN111124487A (zh) | 代码克隆检测方法、装置以及电子设备 | |
CN112148552A (zh) | 用于选择代码数据结构类型的方法、系统、制品和装置 | |
CN109144879B (zh) | 测试分析方法及装置 | |
KR20150037962A (ko) | 상태 기계 엔진에서 상태 벡터 데이터를 사용하기 위한 방법들 및 시스템들 | |
KR20190031030A (ko) | 바이너리 파일에 기초하여 오픈소스 소프트웨어 패키지를 식별하는 방법 및 시스템 | |
JP2018142188A (ja) | 解析プログラム、解析方法および解析装置 | |
CN113656763B (zh) | 确定小程序特征向量的方法、装置和电子设备 | |
CN115730313A (zh) | 一种恶意文档检测方法、装置、存储介质及设备 | |
CN113535399A (zh) | 一种nfv资源调度方法、装置以及系统 | |
CN113986950A (zh) | 一种sql语句处理方法、装置、设备及存储介质 | |
CN110737469B (zh) | 一种功能粒度上基于语义信息的源代码相似度评估方法 | |
CN109492401A (zh) | 一种内容载体风险检测方法、装置、设备及介质 | |
US7856503B2 (en) | Method and apparatus for dynamic content generation | |
CN115795487B (zh) | 漏洞检测方法、装置、设备及存储介质 | |
CN115114627B (zh) | 一种恶意软件检测方法及装置 | |
CN111126053B (zh) | 一种信息处理方法及相关设备 | |
Cotton-Barratt et al. | Weak and nested class memory automata | |
CN111898762B (zh) | 深度学习模型目录创建 | |
CN112667855B (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 |