人工AI算法对代码的漏洞检测

必须先谈到SZZ算法,它通常被用于识别漏洞引入的变化,从而推动了缺陷检测技术的发展。该方法是根据版本控制系统(例如Git)的变更记录确定的,其主要过程如下:标识漏洞修正更改:在所有代码更改中,标识包含漏洞Id的更改。确定修复的漏洞代码:使用版本控制系统的修正算法,以确定相应漏洞的代码行(即漏洞代码)修改。确定引入变更的可能漏洞:根据变更历史,对于漏洞代码的第一提交记录可能是引入漏洞的更改。


噪声数据消除:噪声数据从可能的漏洞引入的更改中消除,例如,某些无关的代码提交,如在漏洞发现后提交SZZ算法提供了一种在变更中发现漏洞的方法,后来的研究发现,SZZ算法产生的数据有很大的噪声,因此产生了许多优化算法来解决这个问题:

AnnotationGraphSZZ(AG-SZZ):它将移除空行,与代码风格相关的修改,并使用AnnotationGraph(代码更改过程的跟踪工具)来跟踪代码更改提交历史。


meta-cangaCwareSZZ(BA-SZZ):它将忽略包含分支创建、合并以及修改文件属性的更改,即meta-cangaCwareSZZ。refactorignAwareSZZ:由于重构不改变软件的外部行为,所以它将忽略代码重构修改。尽管SZZ算法存在噪声,但大多数代码缺陷测方案仍然采用SZZ算法对数据进行标注。根据SZZ算法检测到的漏洞变化,提取不同纬度的漏洞特征,并用机器学习技术构建漏洞预测模型。通常提取的特征包括:


根据更改元数据,如开发人员,提交时间,更改日志,修改文件行数等特征。根据更改代码内容进行的更改,如代码复杂性特征,更改代码的频率、日志和文件名,或基于更改前后代码文件的抽象语法树(AST)同一类型节点数量的差异。以软件演化过程为基础的变更,也就是根据项目代码的修改历史量化变更,例如,变更相关文件被修改的次数,开发人员修改文件的数量等等。


将CR信息、漏洞信息等多个维度的特征与软件项目管理系统结合起来。代码信息中有缺陷的特征,通常是源代码或相应的抽象语法树。通常使用的模型分成有监管模型(Supervised)和无监管模型(Unsupervised)。这两种方法的区别在于是否有已知标签的数据集(即已知有缺陷的代码更改数据),其中有监管可根据标注的代码来构建分类或回归模型,通常使用svm算法(SupportsVectorMachine,SAS)分类器等;无监管模型不需要这些标注数据,可以从代码更改的不同角度提取特征,并用特征向量来表示,常用的模型有LSTM、双向LSTM(Bi-LSTM)等。

分享: