CN115525899A - 面向持续集成平台的漏洞误报消除方法 - Google Patents

面向持续集成平台的漏洞误报消除方法 Download PDF

Info

Publication number
CN115525899A
CN115525899A CN202210743364.3A CN202210743364A CN115525899A CN 115525899 A CN115525899 A CN 115525899A CN 202210743364 A CN202210743364 A CN 202210743364A CN 115525899 A CN115525899 A CN 115525899A
Authority
CN
China
Prior art keywords
warning
model
program
project
vector
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
Application number
CN202210743364.3A
Other languages
English (en)
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.)
Nanjing University
Original Assignee
Nanjing 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 Nanjing University filed Critical Nanjing University
Priority to CN202210743364.3A priority Critical patent/CN115525899A/zh
Publication of CN115525899A publication Critical patent/CN115525899A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/57Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
    • G06F21/577Assessing vulnerabilities and evaluating computer system security
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/55Detecting local intrusion or implementing counter-measures
    • G06F21/56Computer malware detection or handling, e.g. anti-virus arrangements
    • G06F21/562Static detection
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • 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)
  • General Engineering & Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Software Systems (AREA)
  • Computer Hardware Design (AREA)
  • Physics & Mathematics (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

本发明提供一种面向持续集成平台的漏洞误报消除方法,通过深度学习神经网络捕捉程序静态分析生成的漏洞警告代码特征,对警告进行排序和分类,从而消除警告中的误报,并利用项目持续集成过程中不断生成的增量警告数据更新优化模型。步骤包括:获取持续集成平台上Java项目的历史警告数据和对应警告标记数据;对警告对应程序进行程序切片、令牌化、向量化;训练深度学习神经网络得到漏洞误报消除模型;将模型加入到项目的持续集成流程中使模型随着项目迭代持续更新优化。本发明减少了项目持续集成流程中开发人员检查程序静态分析漏洞警告的时间成本,提高了处理警告的效率。

Description

面向持续集成平台的漏洞误报消除方法
技术领域
本发明涉及持续集成、程序静态分析领域,具体涉及一种面向持续集成平台的漏洞误报消除方法。
背景技术
随着软件的开发迭代周期越来越短,软件需要被更快地测试、集成,持续集成成为了流行的软件开发实践。为了在这种高速的开发模式下及时发现开发过程中引入的安全漏洞,同时减少发现、修复漏洞的成本,将程序静态分析技术加入到持续集成流程中,已经成为代码自动安全审计一个有前途的解决方案。但是,因为静态分析工具在设计分析规则时往往只考虑了有限的错误案例,因此设计出的分析规则可能缺乏数据如何流经系统、语句间依赖关系和整体软件架构的知识,导致其产生大量的误报,这些误报不仅增加了开发人员检查工具生成报告的时间成本,还会导致持续集成的非正常构建中断,从而引起开发人员对使用静态分析工具的抵触情绪,限制了静态分析工具在软件开发过程中的推广使用。
为了解决静态分析工具误报多的问题,研究人员提出了许多调整和改进措施,以降低误报对软件开发的影响,其中警告排名、警告分类的方式属于与本发明相关的警告后处理范畴:警告排名根据警告和源代码的各种特征、警告修复的历史记录和代码更改记录等,来计算每个警告可能是真实警告的概率,以便对警告列表进行排名,将更有可能反应真实问题的警告排在前列;警告分类将警告分为真实警告和误报,被分类为误报的警告不报告给开发人员,以实现对误报的消除。现有大部分研究通过统计学建模或机器学习建模的方式进行警告排名与警告分类,然而,这些技术不仅需要收集警告的相关信息,还要收集大量与项目信息、开发人员提交历史等相关的信息进行建模,与实际产业界的持续集成平台集成难度较大,因此现有研究通常是将项目不同版本的警告汇总到一起,形成一个数据全集,以此来一次性地构建误报消除模型,并没有做到将模型融入进持续集成流程中。此外,现有方法专注于静态分析警告的可观测特征,例如漏洞类型和警告优先级,其特征定义工作往往依赖于专家的经验和耗时的调研,并且往往忽略了被分析警告对应源码的深层结构,不可避免地会导致模型精确性的损失。
发明内容
本发明的目的在于:针对现有模型难以与持续集成平台集成以及忽略警告应源码深层结构的不足,提供一种面向持续集成平台的漏洞误报消除方法,模型以警告对应的代码表征作为学习特征,避免了复杂的特征工程,且用深度学习神经网络学习程序中正反双向的长期依赖关系,从而捕捉源代码级别的深层特征。在表现形式上,本发明结合了现有警告排名模型和警告分类模型的优势,对每个警告预测其置信度,代表其为真实警告的概率,然后根据开发人员设定的阈值将警告分类为真实警告和误报。
为实现上述目的,本发明的技术方案是:一种面向持续集成平台的漏洞误报消除方法,包括以下步骤:
S1:使用SpotBugs静态分析工具对项目源码进行静态分析,得到项目各个提交版本的源代码警告,人工对得到的警告进行标注,判断代码中是否包含真实漏洞;
S2:使用基于程序依赖图(Program Dependence Graph,PDG)的程序切片算法对警告对应程序进行切片,获取与警告对应代码行存在数据依赖或者控制依赖的语句作为程序切片;
S3:对程序切片进行标记和规范化处理得到Token序列,将Token序列使用Word2vec嵌入到向量形式,得到神经网络的输入;
S4:将S3生成的向量输入双向长短期记忆(Bi-directional Long Short-TermMemory,Bi-LSTM)神经网络中进行训练,构建漏洞误报消除模型,输入待预测的原始警告,模型输出警告的置信度和分类标签;
S5:将原始模型加入进项目的持续集成流程中,项目每次进行提交时都会在平台上产生新的警告数据,新产生的警告数据会作为增量训练集,对模型进行增量训练,使模型在项目迭代的过程中不断更新优化,根据开发人员对警告的实际标记情况持续调整自身参数。本发明相较于传统的基于软件工程指标训练的误报消除模型,仅需获取警告对应的代码行号和源代码作为原始输入,无需进行复杂的特征工程,使模型能方便地与持续集成平台进行集成,使用基于程序依赖图的程序切片算法对警告对应程序进行切片,减少无关函数和变量对模型产生的影响,使用Bi-LSTM深度学习模型检测程序中正反双向的长期依赖关系,将构建的模型加入到项目的持续集成流程中,使模型随着项目迭代而不断更新优化。
其中,所述S1包含以下步骤:
S1-1:选取持续集成平台上符合建模标准的项目;
项目的选择标准为:由于SpotBugs只能对Java项目编译后的可执行文件进行程序静态分析,故本发明选择能够获取到编译配置信息的Java项目;为了获得SpotBugs能识别的漏洞类型,本发明选择的项目程序应该有执行数据库和 LDAP查询、使用网络连接、读/写文件或执行系统命令的操作;本发明需选择那些正在积极开发并被高强度使用的项目,因为只有项目在不断地迭代开发,才能有连续的静态分析警告生成,才能使模型在随着项目迭代而更新优化;
S1-2:获取所需的项目编译信息,包括项目的编译环境、编译工具及其版本和项目的编译命令,并对项目进行编译获得可执行的字节码文件;
S1-3:使用静态分析工具SpotBugs的“Security”和“Malicious codevulnerability”类分析规则对项目各提交版本经过编译后的二进制可执行文件进行静态分析,得到项目的警告;
S1-4:开发人员对警告进行标记,若警告对应代码存在真实的漏洞,则将警告标记为“真实警告”,若警告对应代码不存在警告所提示的漏洞,则将警告标记为“误报”。
其中,所述S2包含以下步骤:
S2-1:获取每个警告对应的程序源码;
S2-2:将程序源码转换成程序依赖图,程序依赖图中每个节点表示程序的一行语句;
S2-3:将静态分析工具产生的警告中对应的代码行号作为程序切片准则,在程序依赖图上运用图可达算法对程序进行后向切片,获得与切片准则存在控制依赖或数据依赖的程序依赖图切片;
S2-4:将程序依赖图切片映射到源程序中,得到与切片对应的语句和控制谓词集合,作为建模所需的程序切片。
其中,所述S3包含以下步骤:
S3-1:根据开发人员对警告的人工标记情况对程序切片进行标注,若警告被开发人员标记为“真实警告”,则将对应程序切片标记为1,若警告被标记为“误报”,则将对应程序切片标记为0;
S3-2:将程序切片令牌化;
对于经过程序切片得到的代码片段,首先对每行代码,删除字符、字符串文本、空格以及分号等,同时保留引号,然后对除了系统函数、系统变量,其余所有的函数和变量统一进行替换:将函数名替换为FUN、变量名替换为VAR、类名替换为CLASS,并在其后附上不同后缀数字编号来代表不同的函数、变量,此种将程序符号化的方式可以突出程序中变量之间的约束关系,而忽略具体的输入数据对模型的影响。
S3-3:使用Word2vec进行嵌入训练将Token序列向量化;
本发明通过Word2vec嵌入技术将Token序列嵌入到向量形式,使用 Skip-Gram模型来实现Word2vec:首先使用One-hot编码方案对每个Token词汇进行编码作为wi,对于每个wi,得到一个长度为|V|的向量
Figure RE-GDA0003939508770000041
其中除了第i位为1外,其余位置全部为0,之后便对Skip-Gram网络进行训练,当
Figure RE-GDA0003939508770000042
作为输入时,输出
Figure RE-GDA0003939508770000043
尽可能与S中的One-hot嵌入向量的总和(即
Figure RE-GDA0003939508770000044
) 相接近,训练结束后,把隐藏层的权重h=(h1,…,hm)作为wi的嵌入向量,该权重向量将原始词汇wi的One-hot编码向量形式唯一地转换为其相邻形式
Figure RE-GDA0003939508770000045
便得到代码片段Token序列的向量化表示;
S3-4:对Token序列的向量化表示进行填充或者删除,以确保模型输入的一致性,
由于每个代码片段中可能具有不同的令牌数,导致对应的向量可能具有不同的长度。而Bi-LSTM需要以等长向量作为输入,因此引入一个参数k,作为代码片段对应向量的固定长度,因为代码片段是由后向切片生成的,所以当向量长度小于固定值k时,需要在向量的开头填充零;而当向量长度大于固定值k时,则删除向量的开头部分,最终得到神经网络模型的输入。
其中,所述S4包含以下步骤:
S4-1:构建Bi-LSTM神经网络模型,使用S3得到的向量对其进行训练;
为了捕获警告对应代码上下文存在的双向长期依赖性信息,本发明使用 LSTM单元作为基本构建块,并使用Bi-LSTM来检测正向和反向的长期依赖关系,将S3得到的向量表示作为网络的输入,Bi-LSTM层结合了输入序列在前向和后向两个方向上的信息,每一层包含64个LSTM单元,Dense层减少了从Bi-LSTM 层接收到的向量维数,将输出的向量转换成标签向量的维度,其中Dense层使用带泄露修正线性单元(Leaky ReLU)函数作为激活函数,其在Relu函数的负半区间引入一个泄露(Leaky)值,以解决传统修正线性单元(Rectifiedlinear unit,ReLU)在输入小于0时,梯度也为0,导致权重无法得到更新的问题。SoftMax层以Dense层接收到的低维向量作为输入,负责归一化结果,为学习阶段更新神经网络参数提供反馈,训练阶段完成后便得到调好模型参数的Bi-LSTM神经网络作为误报消除模型;
S4-2:设定模型的阈值;
S4-3:将训练好的模型应用于项目的无标签警告数据上,预测每个警告的置信度(取值为[0,1]),代表其为真实警告的概率,当置信度大于S4-2设定的阈值时,警告被模型分类为真实警告,当置信度小于阈值时,警告被模型分类为误报;
S4-4:将模型阈值设置为0.5,采用K折交叉验证法对模型警告分类效果进行评估;
使用准确率(Accuracy)、F1值(F1-measure)以及AUC值作为评估指标来评估模型的表现。
其中,所述S5包括以下步骤:
S5-1:开发人员对代码仓库进行修改或者新功能集成,持续集成服务器自动拉取变化的代码;
S5-2:持续集成服务器对仓库进行依赖安装、编译等;
S5-3:服务器对源代码和编译后的可执行文件进行程序静态分析,从而得到静态分析工具生成的原始警告列表;
S5-4:将原始警告列表和对应的代码作为输入,使用S4构建的模型进行预测,模型判断每个警告对应代码含有真实漏洞的概率,称为置信度,并根据S4 设定的阈值将原始警告分类为真实警告或误报,从而得到优化后的警告列表;
S5-5:开发人员对优化后的警告列表进行检查标记,复查确认警告为真实警告或者误报,通过开发人员对优化后的警告列表的处理,生成并导出带有标记的警告;
S5-6:将带有标注的警告和警告对应的代码作为增量训练集,输入模型,执行S2、S3、S4-1,对模型进行更新
总体而言,通过本发明所构思的以上技术方案与现有技术相比,具有以下有益效果:
(1)本发明以警告对应的代码表征作为学习特征,仅需要获取警告对应的代码行号和警告对应标记即可完成建模工作,避免了复杂的特征工程,降低了与持续集成平台的集成难度;使用基于PDG的程序切片算法,提取与警告对应的代码行号相对应的PDG切片,以减少无关函数和变量对模型产生影响;使用Bi-LSTM 神经网络代替卷积神经网络,检测警告对应代码上下文存在的双向长期依赖性信息,从而捕捉源代码级别的深层特征。
(2)本发明将模型集成进项目的持续集成流程中,将项目每次进行提交新产生的警告数据作为增量训练集,对模型进行增量训练,使模型能够在项目迭代的过程中不断更新优化,根据开发人员对警告的标记情况持续调整自身参数,从而实现模型对项目的自适应改进,得到越来越精确、越来越贴合项目的结果。
(3)本发明结合了警告排名和警告分类两种误报消除方式的优点,对每个警告预测其置信度,代表其为真实警告的概率,并根据开发人员设定的阈值将警告分类为真实警告和误报,开发人员可以通过设置阈值自定义警告的筛选力度。
附图说明
图1为一种面向持续集成平台的漏洞误报消除方法的流程示意图。
图2为本发明实施例公开的从警告对应源代码获取模型输入的流程示意图。
图3为本发明实施例公开的模型训练过程示意图。
图4为本发明实施例公开的模型更新过程示意图。
图5为本发明实施例公开的项目不同版本的模型指标变化示意图。
图6为本发明实施例公开的模型优化前后警告排序效果对比示意图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,下面结合附图和实施例对本发明作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅用于解释本发明,而非对本发明的限定。
实施例1:请参阅图1至图6所示,本发明提供了一种面向持续集成平台的漏洞误报消除方法,包括以下步骤:
S1:使用SpotBugs静态分析工具对项目源码进行静态分析,得到项目各个提交版本的源代码警告,人工对得到的警告进行标注,判断代码片段是否包含真实漏洞;
S2:使用基于程序依赖图的程序切片算法对警告对应程序进行切片,获取与警告对应代码行存在数据依赖或者控制依赖的语句作为程序切片;
S3:对程序切片进行标记和规范化处理得到Token序列,将Token序列使用Word2vec嵌入到向量形式,得到神经网络的输入;
S4:将S3生成的向量输入双向长短期记忆神经网络中进行训练,构建漏洞误报消除模型,输入待预测的原始警告,模型输出警告的置信度和分类标签;
S5:将原始模型加入进项目的持续集成流程中,项目每次进行提交时都会在平台上产生新的警告数据,新产生的警告数据会作为增量训练集,对模型进行增量训练,使模型在项目迭代的过程中不断更新优化,根据开发人员对警告的实际标记情况持续调整自身参数。
所述S1步骤包括:选取持续集成平台上符合建模标准的项目;获取所需的项目编译信息,包括项目的编译环境、编译工具及其版本和项目的编译命令,并对项目进行编译获得可执行的字节码文件;使用静态分析工具SpotBugs的“Security”和“Malicious codevulnerability”类分析规则对项目各提交版本经过编译后的二进制可执行文件进行静态分析,得到项目的警告;开发人员对警告进行标记,若警告对应代码存在真实的漏洞,则将警告标记为“真实警告”,若警告对应代码不存在警告所提示的漏洞,则将警告标记为“误报”。
具体地,所述S1步骤中项目的选择标准为:由于SpotBugs只能对Java项目编译后的可执行文件进行程序静态分析,故本发明选择能够获取到编译配置信息的Java项目;为了获得SpotBugs能识别的漏洞类型,本发明选择的项目程序应该有执行数据库和LDAP查询、使用网络连接、读/写文件或执行系统命令的操作;本发明需选择那些正在积极开发并被高强度使用的项目,因为只有项目在不断地迭代开发,才能有连续的静态分析警告生成,才能使模型在随着项目迭代而更新优化。
所述S2步骤包括:获取每个警告对应的程序源码;将程序源码转换成程序依赖图,程序依赖图中每个节点表示程序的一行语句;将静态分析工具产生的警告中对应的代码行号作为程序切片准则,在程序依赖图上运用图可达算法对程序进行后向切片,获得与切片准则存在控制依赖或数据依赖的程序依赖图切片;将程序依赖图切片映射到源程序中,得到与切片对应的语句和控制谓词集合,作为建模所需的程序切片。
所述S3步骤包括:根据开发人员对警告的人工标记情况对程序切片进行标注,若警告被开发人员标记为“真实警告”,则将对应程序切片标记为1,若警告被标记为“误报”,则将对应程序切片标记为0;将程序切片令牌化;使用 Word2vec进行嵌入训练将Token序列向量化;对Token序列的向量化表示进行填充或者删除,以确保模型输入的一致性。
具体地,所述S3步骤中对于经过程序切片得到的代码片段,首先对每行代码,删除字符、字符串文本、空格以及分号等,同时保留引号,然后对除了系统函数、系统变量,其余所有的函数和变量统一进行替换:将函数名替换为FUN、变量名替换为VAR、类名替换为CLASS,并在其后附上不同后缀数字编号来代表不同的函数、变量。此种将程序符号化的方式可以突出程序中变量之间的约束关系,而忽略具体的输入数据对模型的影响。
具体地,所述S3步骤中Word2vec嵌入技术用于学习给定语料库中单词的向量嵌入,它本质上是一个具有N个节点的单一隐藏层的神经网络。在使用 Word2vec时,共有Skip-Gram与CBOW两种实现方式,其中Skip-Gram是给定中心词,来预测上下文,而CBOW是给定上下文,来预测中心词,本发明使用 Skip-Gram模型将语料库中的词嵌入到向量中,使每个词都由其相邻的词来识别,使用One-hot编码方案对每个Token词汇进行编码作为wi,对于每个wi,得到一个长度为|V|的向量
Figure RE-GDA0003939508770000081
其中除了第i位为1外,其余位置全部为0,之后便对Skip-Gram网络进行训练,当
Figure RE-GDA0003939508770000082
作为输入时,输出
Figure RE-GDA0003939508770000083
尽可能与S中的One-hot 嵌入向量的总和(即
Figure RE-GDA0003939508770000091
)相接近。训练结束后,把隐藏层的权重h=(h1,…,hm)作为wi的嵌入向量,该权重向量将原始词汇wi的One-hot编码向量形式唯一地转换为其相邻形式
Figure RE-GDA0003939508770000092
便得到代码片段Token序列的向量化表示。最后,由于每个代码片段中可能具有不同的令牌数,导致对应的向量可能具有不同的长度。而Bi-LSTM需要以等长向量作为输入,因此引入一个参数k,作为代码片段对应向量的固定长度。因为代码片段是由后向切片生成的,所以当向量长度小于固定值k时,需要在向量的开头填充零;而当向量长度大于固定值k时,则删除向量的开头部分,最终得到神经网络模型的输入。
所述S4步骤包括:构建Bi-LSTM神经网络模型,使用S3得到的向量对其进行训练;设定模型的阈值;将训练好的模型应用于项目的无标签警告数据上,预测每个警告的置信度(取值为[0,1]),代表其为真实警告的概率,当置信度大于S4设定的阈值时,警告被模型分类为真实警告,当置信度小于阈值时,警告被模型分类为误报;将模型阈值设置为0.5,采用K折交叉验证法对模型警告分类效果进行评估。
具体地,所述S4步骤中使用的Bi-LSTM神经网络能捕获警告对应代码上下文存在的双向长期依赖性信息,本发明使用LSTM单元作为基本构建块,并使用 Bi-LSTM来检测正向和反向的长期依赖关系,将S3得到的向量表示作为网络的输入,Bi-LSTM层结合了输入序列在前向和后向两个方向上的信息,每一层包含 64个LSTM单元。Dense层减少了从Bi-LSTM层接收到的向量维数,将输出的向量转换成标签向量的维度,其中Dense层使用带泄露修正线性单元(Leaky ReLU) 函数作为激活函数,其在Relu函数的负半区间引入一个泄露(Leaky)值,以解决传统修正线性单元在输入小于0时,梯度也为0,导致权重无法得到更新的问题。SoftMax层以Dense层接收到的低维向量作为输入,负责归一化结果,为学习阶段更新神经网络参数提供反馈。训练阶段完成后便得到调好模型参数的 Bi-LSTM神经网络作为误报消除模型。
具体地,所述S4步骤中之所以使用准确率、F1值以及AUC值作为评估指标,是因为程序静态分析警告中的真实警告和误报通常存在类不平衡的问题,精确率和召回率等性能指标受类别比例的影响较大,所以采用了以往研究中常用的综合指标,各个指标的定义如下:
准确度:分类任务中最常用的评价指标之一,根据建立在数据集D上的单个模型M,S是D的大小,M(xi)和yi分别代表模型预测和人工检查的结果,其定义为:
Figure RE-GDA0003939508770000101
F1值:对于警告分类问题,可以通过模型的预测结果和人工检查的实际结果将实例分为:真阳性(TP):预测的真实警告中正确分类的数量;假阴性(FN):预测的误报中误分类的数量;假阳性(FP):预测的真实警告中误分类的数量;真阴性(TN):预测的误报中正确分类的数量,这些类别组成混淆矩阵。精确率 (P)、召回率(R)和F1值这三个指标是由混淆矩阵得出的。精确率和召回率是一对相互矛盾的指标,一般来说,较高的精确率意味着更多的真实漏洞可以被归类为阳性,而较高的召回率可以揭示更多的真实漏洞。同时考虑到精确率和召回率的F1值是一个综合两者的调和平均值。
Figure RE-GDA0003939508770000102
Figure RE-GDA0003939508770000103
Figure RE-GDA0003939508770000104
AUC值:广泛用于机器学习的接受者操作特征曲线是可视化分类器泛化性能的有效工具。然而,ROC曲线有一个缺点,当两个分类器的曲线相交时,很难预测哪个分类器更优越。因此,ROC曲线下的面积,即ROC曲线下各部分面积的总和,被引入作为一种评价指标。假设ROC曲线是由一系列的点 {(x1,y1),(x2,y2),…,(xn,yn)}依次连接,AUC可按以下公式所示进行计算:
Figure RE-GDA0003939508770000105
所述S5步骤包括:开发人员对代码仓库进行修改或者新功能集成,持续集成服务器自动拉取变化的代码;持续集成服务器对仓库进行依赖安装、编译等;服务器对源代码和编译后的可执行文件进行程序静态分析,从而得到静态分析工具生成的原始警告列表;将原始警告列表和对应的代码作为输入,使用S4构建的模型进行预测,模型判断每个警告对应代码含有真实漏洞的概率,称为置信度。并根据S4设定的阈值将原始警告分类为真实警告或误报,从而得到优化后的警告列表;开发人员对优化后的警告列表进行检查标记,复查确认警告为真实警告或者误报,通过开发人员对优化后的警告列表的处理,生成并导出带有标记的警告;将带有标注的警告和警告对应的代码作为增量训练集,输入模型,执行S2、S3、S4的步骤,对模型进行更新。
实施例2:本实施例中,主要描述的是在开源项目Juliet 1.3漏洞数据集上进行漏洞误报消除的实施过程和结果分析。Juliet是一个由实际应用、人工合成、学术研究共同组成的针对C/C++和Java的测试案例集合,在Juliet Test Suit V1.3中包含28,888个Java测试案例,涵盖112个不同的软件安全相关漏洞类别。每个测试案例都由一个具有特定漏洞实例的方法(用来捕获真正的漏洞) 以及一个附加的无漏洞的方法(用来捕获误报)组成。对于每个测试案例,Juliet 均对其中的方法进行了标注,方法名中含“good”字段表示该方法无漏洞,方法名中含“bad”字段表示该方法中有漏洞,这些命名规则可以帮助研究人员方便地对静态分析工具产生的警告进行分类。本实施例通过SpotBugs对项目全部的测试案例进行静态分析得到警告列表,根据警告对应的方法名对警告进行标记得到数据源,使用其对深度学习神经网络进行训练得到误报消除模型,通过模型预测警告的类别并对误报进行消除,从而减少警告列表中误报的数量,提高开发人员处理检查警告的效率。
步骤1:使用SpotBugs静态分析工具中和软件安全相关的“Security”和“Malicious code vulnerability”类分析规则对编译后的源码进行静态分析得到原始警告并对其进行标记。
本实施例重点关注Juliet中的CWE23、CWE78、CWE89、CWE113四种漏洞数据集,因为相比于其他的漏洞类型数据集,SpotBugs对这几种漏洞类型产生了更多的警告,根据方法名获取警告对应的标签(方法名中含“good”字段表示该方法无漏洞,对应的警告为误报;方法名中含“bad”字段表示该方法中有漏洞,对应的警告为真实警告),表1展示了四种类型的漏洞数据集所产生的警告数量和其中的误报数量。
表1
Figure RE-GDA0003939508770000121
步骤2:对警告对应程序进行切片,获取与警告对应语句相关的程序切片。
步骤3:对程序切片进行规范化处理得到Token序列并嵌入到向量形式。
以本实施例中SpotBugs实际检测出的警告为例,详细说明步骤2、步骤3 从程序源代码获取程序切片再进行预处理的过程。本实施例中的一条警告对应的程序源代码如图2a所示,生成PDG,并将SpotBugs检测出的警告对应行号28 作为程序切片的准则进行程序切片如图2b所示,其中每个椭圆框表示单独的一行语句,实线箭头表示与警告对应行号代码语句存在数据依赖的语句,包括9、 14、20、25行,虚线箭头表示与警告对应行号代码语句存在控制依赖的语句,包括2、4、5、9、14、16、17、20、25行。将所有与警告对应行号具有数据依赖和控制依赖的代码语句进行提取,便得到了此警告对应的程序切片。获取经过切片的代码片段后,要对代码片段进行预处理操作,整个流程如图2c所示,对每行代码,删除字符或字符串文本,同时保留引号,然后对除了系统函数、系统变量,其余所有的函数和变量统一进行替换,将程序切片转换成Token序列。生成的Token序列嵌入向量形式如图2d所示,向量化使用Word2vec嵌入技术的 Skip-Gram模型来实现,由于每个代码片段中可能具有不同数量的令牌,而 Bi-LSTM需要以等长向量作为输入,通过对警告对应程序的Token序列长度分析, 95%的长度在1000以下,因此将1000作为程序切片对应向量的固定长度,当向量长度小于1000时,需要在向量的开头填充零;而当向量长度大于1000时,则删除向量的开头部分。
步骤4:使用经过向量化的Token序列对Bi-LSTM神经网络进行训练,构建漏洞误报消除模型,设定模型阈值,对待预测的警告进行误报消除,使用K折交叉评估模型的性能。
本实施例Bi-LSTM神经网络的结构如图3所示,将步骤3每个经过Word2vec 向量化的Token嵌入到一个向量中,作为网络的输入。Bi-LSTM层结合了输入序列在前向和后向两个方向上的信息,每一层包含64个LSTM单元。Dense层减少了从Bi-LSTM层接收到的向量维数,将输出的向量转换成标签向量的维度,其中 Dense层使用带泄露修正线性单元(LeakyReLU)函数作为激活函数,其在Relu 函数的负半区间引入一个泄露(Leaky)值,解决了传统的修正线性单元在输入小于0时,梯度也为0,导致权重无法得到更新的问题。SoftMax层以Dense层接收到的低维向量作为输入,负责归一化结果,为学习阶段更新神经网络参数提供反馈。训练阶段完成后便得到一个调好模型参数的Bi-LSTM神经网络作为误报消除模型。在对待预测警告进行误报消除前,需要先设定模型阈值(取值为 [0,1]),代表模型对误报的筛选力度,模型会对每个警告预测其置信度(取值为[0,1]),代表其为真实警告的概率,之后根据开发人员设定的阈值对警告进行分类,将置信度大于阈值的警告分类为真实警告,进行保留,将置信度小于阈值的警告分类为误报,进行消除。本实施例的模型阈值设定为0.5,表示若经模型预测的警告置信度大于0.5,则分类为真实警告,若小于0.5,则分类为误报。
本实施例使用十折交叉验证对训练好的漏洞误报消除模型进行性能评估,评估指标为Accuracy、F1-measure以及AUC值,得到如表2所示的结果。
表2
数据集 Accuracy F1-measure AUC
CWE23 88.27% 91.83% 87.34%
CWE78 84.72% 88.34% 82.02%
CWE89 83.68% 87.87% 82.85%
CWE113 82.35% 86.57% 81.26%
本发明提出的面向持续集成平台的漏洞误报消除方法在评估指标方面相较于已有误报消除工作均有提升,验证了模型的有效性。
实施例3:本实施例针对实际某企业持续集成平台中处于开发迭代的业务项目,与人工合成的漏洞数据集不同,实际处于迭代中的业务项目会不断产生新的警告数据,本发明将新产生的警告数据作为增量训练集,对模型进行增量训练,使模型能够在项目迭代的过程中不断更新优化,根据开发人员对警告的实际标记情况持续调整自身参数,从而实现模型对项目的自适应,得到越来越精确、越来越贴合项目的结果。表3为该项目的简要信息,项目为某企业持续集成平台上的内部业务项目。
表3
项目领域 软件开发
大小(代码行数) 192190
项目时间 2020.06.11—2022.03.20(获取数据时)
提交版本数量 221
语言 Java
最新版本警告数量 1207
本实施例首先使用项目的历史警告数据训练模型(具体训练步骤如实施例一所述),然后直接执行步骤5,将所得到的初始模型加入到进项目的持续集成流程中,使模型随着项目迭代同步更新,实施例模型更新的流程如图4所示。
将项目的所有提交版本中带标签的提交版本作为评估对象,标签版本代表项目的发布版本或是开发人员对项目的阶段性归档,版本之间仓库差异较大且时间跨度较大,故能观察到模型效果在整个项目生命周期中的变化。对每个标签版本的警告数量进行统计,统计结果如表4所示。可以看出,各个版本之间检测出的警告总数相差较小,其中还存在警告数量下降的情况,经对项目源码进行分析,这可能是由于项目重构导致项目结构更加精简所致。此外,平均每个版本会有 25.4个之前从未出现过的警告被报告,这些警告在经过开发人员进行标记之后,会作为模型的增量输入来更新模型。即一个版本对应的模型由上一个版本的模型更新而来,更新模型所需的增量训练集则是这个版本中新增的被开发人员标记的警告及其对应的源码。假设按照版本提交顺序存在版本1、版本2、版本3,则版本3对应的模型是在版本2对应模型的基础上,将版本3新增的警告作为增量训练集更新而来。各个提交版本的模型性能指标变化情况如图5所示。可以看出,各个版本的模型性能指标总体呈现上升趋势,证明在持续集成背景下,本发明的漏洞误报消除模型能够随着项目迭代不断更新优化,根据开发人员对新增警告的标记情况不断调整,从而取得越来越精确的结果。
表4
版本号 历史警告数 新增警告数 警告总数
20200611 1060 0 1060
20200617 1052 45 1097
20200628 1085 49 1134
20200731 1070 23 1093
20200911 1081 8 1089
20201229 1078 24 1102
20210413 1158 32 1190
20210716 1173 14 1187
20210924 1168 23 1191
20220320 1171 36 1207
对项目最新一次提交版本的新增警告进行优化,将模型阈值设为0.5,优化前后的结果如表5所示。可以看到,原始的36个新增警告在经过模型优化后仅保留了19个(有19个警告的置信度大于0.5,被分类为真实警告;另外17个警告的置信度小于0.5,被分类为误报不予展示),为开发人员减少了近一半的需审核确认的警告,说明模型可以帮助开发人员节省检查警告的时间成本,提升处理警告的效率。
表5
真实警告 误报 需审查警告数
模型优化前 9 27 36
模型优化后 7 12 19
此外,开发团队可以根据团队、项目的需求来设置模型阈值,阈值设置得越高过滤误报程度越大,但同时丢失真实警告的风险也随之增大。为了避免丢失任何可能的真实警告,可以将模型阈值设置为0,此时模型不对任何警告进行筛选分类,所有原始警告都将展示,但是模型可以将警告按照置信度由高到低的顺序排序,将最有可能存在漏洞的警告排在警告列表前面,供开发人员优先确认审查。警告排名对开发人员实际工作起到的效果如图6所示,y轴表示所审查出的真实警告数量,x轴表示按照排名由前往后的顺序审核所有警告的数量,可以看到,按照本发明的置信度排序的方式要优于平台默认的按警告优先级排序的方式,在30次检查后将警告中所有的真实警告全部识别,并且在前5次检查中,其中4个都是真实警告。说明模型在进行警告排名时能够将存在漏洞概率较高的警告排在列表前列,从而让开发人员在较短的时间内审核出较多漏洞。
注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。

Claims (6)

1.一种面向持续集成平台的漏洞误报消除方法,其特征在于,包括以下步骤:
S1:使用SpotBugs静态分析工具对项目源码进行静态分析,得到项目各个提交版本的源代码警告,人工对得到的警告进行标注,判断代码中是否包含真实漏洞;
S2:使用基于程序依赖图(Program Dependence Graph,PDG)的程序切片算法对警告对应程序进行切片,获取与警告对应代码行存在数据依赖或者控制依赖的语句作为程序切片;
S3:对程序切片进行标记和规范化处理得到Token序列,将Token序列使用Word2vec嵌入到向量形式,得到神经网络的输入;
S4:将S3生成的向量输入双向长短期记忆(Bi-directional Long Short-TermMemory,Bi-LSTM)神经网络中进行训练,构建漏洞误报消除模型,输入待预测的原始警告,模型输出警告的置信度和分类标签;
S5:将原始模型加入进项目的持续集成流程中,项目每次进行提交时都会在平台上产生新的警告数据,新产生的警告数据会作为增量训练集,对模型进行增量训练,使模型在项目迭代的过程中不断更新优化,根据开发人员对警告的实际标记情况持续调整自身参数。
2.根据权利要求1所述的面向持续集成平台的漏洞误报消除方法,其特征在于,所述S1包含以下步骤:
S1-1:选取持续集成平台上符合建模标准的项目;
项目的选择标准为:由于SpotBugs只能对Java项目编译后的可执行文件进行程序静态分析,故选择能够获取到编译配置信息的Java项目;为了获得SpotBugs能识别的漏洞类型,选择的项目程序应该有执行数据库和LDAP查询、使用网络连接、读/写文件或执行系统命令的操作;选择正在积极开发并被高强度使用的项目;
S1-2:获取所需的项目编译信息,包括项目的编译环境、编译工具及其版本和项目的编译命令,并对项目进行编译获得可执行的字节码文件;
S1-3:使用静态分析工具SpotBugs的“Security”和“Malicious code vulnerability”类分析规则对项目各提交版本经过编译后的二进制可执行文件进行静态分析,得到项目的警告;
S1-4:开发人员对警告进行标记,若警告对应代码存在真实的漏洞,则将警告标记为“真实警告”,若警告对应代码不存在警告所提示的漏洞,则将警告标记为“误报”。
3.根据权利要求1所述的面向持续集成平台的漏洞误报消除方法,其特征在于,所述S2包含以下步骤:
S2-1:获取每个警告对应的程序源码;
S2-2:将程序源码转换成程序依赖图,程序依赖图中每个节点表示程序的一行语句;
S2-3:将静态分析工具产生的警告中对应的代码行号作为程序切片准则,在程序依赖图上运用图可达算法对程序进行后向切片,获得与切片准则存在控制依赖或数据依赖的程序依赖图切片;
S2-4:将程序依赖图切片映射到源程序中,得到与切片对应的语句和控制谓词集合,作为建模所需的程序切片。
4.根据权利要求1所述的面向持续集成平台的漏洞误报消除方法,其特征在于,所述S3包含以下步骤:
S3-1:根据开发人员对警告的人工标记情况对程序切片进行标注,若警告被开发人员标记为“真实警告”,则将对应程序切片标记为1,若警告被标记为“误报”,则将对应程序切片标记为0;
S3-2:将程序切片令牌化;
对于经过程序切片得到的代码片段,首先对每行代码,删除字符、字符串文本、空格以及分号,同时保留引号,然后对除了系统函数、系统变量,其余所有的函数和变量统一进行替换:将函数名替换为FUN、变量名替换为VAR、类名替换为CLASS,并在其后附上不同后缀数字编号来代表不同的函数、变量;
S3-3:使用Word2vec进行嵌入训练将Token序列向量化;
通过Word2vec嵌入技术将Token序列嵌入到向量形式,使用Skip-Gram模型来实现Word2vec:首先使用One-hot编码方案对每个Token词汇进行编码作为wi,对于每个wi,得到一个长度为|V|的向量
Figure RE-FDA0003939508760000021
其中除了第i位为1外,其余位置全部为0,之后便对Skip-Gram网络进行训练,当
Figure RE-FDA0003939508760000022
作为输入时,输出
Figure RE-FDA0003939508760000023
尽可能与S中的One-hot嵌入向量的总和(即
Figure RE-FDA0003939508760000031
)相接近,训练结束后,把隐藏层的权重h=(h1,…,hm)作为wi的嵌入向量,该权重向量将原始词汇wi的One-hot编码向量形式唯一地转换为其相邻形式
Figure RE-FDA0003939508760000032
便得到代码片段Token序列的向量化表示;
S3-4:对Token序列的向量化表示进行填充或者删除,以确保模型输入的一致性,
引入一个参数k,作为代码片段对应向量的固定长度,因为代码片段是由后向切片生成的,所以当向量长度小于固定值k时,需要在向量的开头填充零;而当向量长度大于固定值k时,则删除向量的开头部分,最终得到神经网络模型的输入。
5.根据权利要求1所述的面向持续集成平台的漏洞误报消除方法,其特征在于,所述S4包含以下步骤:
S4-1:构建Bi-LSTM神经网络模型,使用S3得到的向量对其进行训练;
使用LSTM单元作为基本构建块,并使用Bi-LSTM来检测正向和反向的长期依赖关系,将S3得到的向量表示作为网络的输入,Bi-LSTM层结合了输入序列在前向和后向两个方向上的信息,每一层包含64个LSTM单元,Dense层减少了从Bi-LSTM层接收到的向量维数,将输出的向量转换成标签向量的维度,其中Dense层使用带泄露修正线性单元(Leaky ReLU)函数作为激活函数,其在Relu函数的负半区间引入一个泄露(Leaky)值,以解决传统修正线性单元(Rectified linear unit,ReLU)在输入小于0时,梯度也为0,导致权重无法得到更新的问题,SoftMax层以Dense层接收到的低维向量作为输入,负责归一化结果,为学习阶段更新神经网络参数提供反馈,训练阶段完成后便得到调好模型参数的Bi-LSTM神经网络作为误报消除模型;
S4-2:设定模型的阈值;
S4-3:将训练好的模型应用于项目的无标签警告数据上,预测每个警告的置信度(取值为[0,1]),代表其为真实警告的概率,当置信度大于S4-2设定的阈值时,警告被模型分类为真实警告,当置信度小于阈值时,警告被模型分类为误报;
S4-4:将模型阈值设置为0.5,采用K折交叉验证法对模型警告分类效果进行评估;
使用准确率(Accuracy)、F1值(F1-measure)以及AUC值作为评估指标来评估模型的表现。
6.根据权利要求1所述的面向持续集成平台的漏洞误报消除方法,其特征在于,所述S5包括以下步骤:
S5-1:开发人员对代码仓库进行修改或者新功能集成,持续集成服务器自动拉取变化的代码;
S5-2:持续集成服务器对仓库进行依赖安装、编译;
S5-3:服务器对源代码和编译后的可执行文件进行程序静态分析,从而得到静态分析工具生成的原始警告列表;
S5-4:将原始警告列表和对应的代码作为输入,使用S4构建的模型进行预测,模型判断每个警告对应代码含有真实漏洞的概率,称为置信度,并根据S4设定的阈值将原始警告分类为真实警告或误报,从而得到优化后的警告列表;
S5-5:开发人员对优化后的警告列表进行检查标记,复查确认警告为真实警告或者误报,通过开发人员对优化后的警告列表的处理,生成并导出带有标记的警告;
S5-6:将带有标注的警告和警告对应的代码作为增量训练集,输入模型,执行S2、S3、S4-1,对模型进行更新。
CN202210743364.3A 2022-06-28 2022-06-28 面向持续集成平台的漏洞误报消除方法 Pending CN115525899A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210743364.3A CN115525899A (zh) 2022-06-28 2022-06-28 面向持续集成平台的漏洞误报消除方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210743364.3A CN115525899A (zh) 2022-06-28 2022-06-28 面向持续集成平台的漏洞误报消除方法

Publications (1)

Publication Number Publication Date
CN115525899A true CN115525899A (zh) 2022-12-27

Family

ID=84696341

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210743364.3A Pending CN115525899A (zh) 2022-06-28 2022-06-28 面向持续集成平台的漏洞误报消除方法

Country Status (1)

Country Link
CN (1) CN115525899A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117077153A (zh) * 2023-10-18 2023-11-17 深圳海云安网络安全技术有限公司 基于大规模语言模型的静态应用安全检测误报判别方法

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117077153A (zh) * 2023-10-18 2023-11-17 深圳海云安网络安全技术有限公司 基于大规模语言模型的静态应用安全检测误报判别方法
CN117077153B (zh) * 2023-10-18 2024-01-26 深圳海云安网络安全技术有限公司 基于大规模语言模型的静态应用安全检测误报判别方法

Similar Documents

Publication Publication Date Title
CN109426722B (zh) Sql注入缺陷检测方法、系统、设备及存储介质
US11681925B2 (en) Techniques for creating, analyzing, and modifying neural networks
Balayn et al. Managing bias and unfairness in data for decision support: a survey of machine learning and data engineering approaches to identify and mitigate bias and unfairness within data management and analytics systems
US7606784B2 (en) Uncertainty management in a decision-making system
US11256502B2 (en) Automatic generation of documentation and aggregation of community content
CN117951701A (zh) 用于确定软件代码中的缺陷和漏洞的方法
Halkidi et al. Data mining in software engineering
CN111459799A (zh) 一种基于Github的软件缺陷检测模型建立、检测方法及系统
US11640539B2 (en) Techniques for visualizing the operation of neural networks using samples of training data
CN112364352B (zh) 可解释性的软件漏洞检测与推荐方法及系统
Vasudevan et al. Learning semantic representations to verify hardware designs
CN114238100A (zh) 基于GGNN和分层注意力网络的Java漏洞检测定位方法
Zhang et al. Code smells for machine learning applications
CN115495755A (zh) 一种基于CodeBERT和R-GCN的源代码漏洞多分类检测的方法
CN116305158A (zh) 一种基于切片代码依赖图语义学习的漏洞识别方法
CN115437952A (zh) 一种基于深度学习的语句级软件缺陷检测方法
CN116578980A (zh) 基于神经网络的代码分析方法及其装置、电子设备
CN115525899A (zh) 面向持续集成平台的漏洞误报消除方法
Gajowniczek et al. ImbTreeAUC: An R package for building classification trees using the area under the ROC curve (AUC) on imbalanced datasets
Saheb Nasagh et al. A fuzzy genetic automatic refactoring approach to improve software maintainability and flexibility
CN115098389B (zh) 一种基于依赖模型的rest接口测试用例生成方法
CN115700492A (zh) 一种基于图区间神经网络的程序语义表示学习和预测方法
Tang et al. An attention-based automatic vulnerability detection approach with GGNN
Pulket et al. Universal prediction model for construction litigation
Watson Deep learning in software engineering

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