一种基于深度学习的软件漏洞检测方法及系统技术方案

技术编号:39404324 阅读:12 留言:0更新日期:2023-11-19 15:56
本发明专利技术公开了一种基于深度学习的软件漏洞检测方法及系统,删除代码中不包含语义信息的注释,将代码中的自定义变量和自定义函数进行标准化命名以减少编码空间并使具有相同语义的代码更加相似;利用Joern为预处理后的代码生成CPG,再使用预训练的Word2Vec模型对CPG节点表示的代码进行向量表示;借助复杂网络中心性分析理论对CPG进行分析,得到每个节点的中心性值并将该值与节点向量相乘再堆叠为类似图像的矩阵;TextCNN被用于进行特征抽取并使用全连接层和softmax层构成的分类器进行分类。解决了主流基于深度学习方法存在的可拓展性问题并进一步提高了性能表现。性问题并进一步提高了性能表现。性问题并进一步提高了性能表现。

【技术实现步骤摘要】
一种基于深度学习的软件漏洞检测方法及系统


[0001]本专利技术属于深度学习和程序分析
,具体涉及一种基于深度学习的软件漏洞检测方法及系统。

技术介绍

[0002]软件安全是网络空间安全的重要组成部分。软件安全是指在软件开发、部署、维护和使用过程中,保障软件系统、数据和用户免受恶意攻击和意外损失的能力。软件安全涉及到诸多方面,包括安全设计、安全编码、安全测试、安全运维和安全管理等。软件安全的目标是确保软件系统的可靠性、稳定性、可用性和安全性。软件安全的重要性越来越受到关注,因为随着信息化的普及和发展,软件在我们生活和工作中扮演着越来越重要的角色。不安全的软件系统可能会导致经济损失、隐私泄露、信息丢失、恶意攻击和其他安全问题,对个人、企业和国家都会带来巨大的影响。软件测试通常用于检测漏洞,软件测试可分为静态测试和动态测试。静态测试不运行被测软件,只是静态地检查程序代码、接口或文件中可能存在的错误。目前市面上常见的静态测试工具属于专家系统的一种,大都利用定义好的规则进行测试。因此需要耗费较多人力来制定规则,且规则的泛化性较差。动态测试是指通过运行被测程序,检查运行结果与预期结果的差异,并分析运行效率、正确性和健壮性等性能。动态测试具有直观、简单的优点,但面对大体量软件时被测程序的运行会耗费较多时间,且运行环境还必须满足被测程序的最低运行要求。
[0003]近年来,随着机器学习、人工智能等技术的发展,基于深度学习的漏洞检测方法也得到了广泛应用。当前基于深度学习的漏洞检测方法可以根据其特征提取模型分为两类。第一类是循环神经网络(RNNs)模型。该类方法将代码视为文本,由于许多漏洞往往与调用系统API相关,所以选择API函数作为程序切片的起点来获取可能有漏洞的代码。然后利用程序语言的特点制定分词规则,使用Word2Vec对分词后获得的令牌进行向量化。由于许多漏洞需要考虑上下文,所以能够双向捕获信息的BiLSTM是最常用的模型。不过随着注意力机制的流行也有人开始使用transformer模型。第二类是图神经网络(GNNs)模型。该类方法首先需要将代码表示为图,此过程通常使用开源工具Joern完成。Joern可以将代码表示为抽象语法树(AST)、控制流图(CFG)、程序依赖图(PDG)和代码属性图(CPG)。图神经网络非常适合处理图结构的数据,对各个节点所表示的代码进行向量表示后便可以利用消息传递机制进行学习。
[0004]虽然循环神经网络和图神经网络取得了令人鼓舞的结果,但它们各有局限性。尽管循环神经网络可以捕获时序信息,但它们的计算可能非常耗时。这也是在处理大规模代码时为了保证效率往往需要程序切片的原因。此外,利用循环神经网络进行分类时通常将代码视为文本,这种做法不能很好地表达代码之间的依赖关系进而限制性能。图神经网络具有强大的表达能力,但在处理大量节点和复杂关系时,它们的计算会变得繁重。此外,图神经网络层数加深后可能会遇到过度平滑的问题,这进一步限制了整体性能。因此,如何提高基于深度学习的软件漏洞挖掘方法的可拓展性,亟需进一步研究。

技术实现思路

[0005]本专利技术所要解决的技术问题在于针对上述现有技术中的不足,提供一种基于深度学习的软件漏洞检测方法及系统,用于解决基于深度学习的软件漏洞检测技术中存在可拓展性差的技术问题,进一步提高检测漏洞的性能。
[0006]本专利技术采用以下技术方案:
[0007]一种基于深度学习的软件漏洞检测方法,包括以下步骤:
[0008]S1、以正则表达式的方式识别代码中的注释、变量和函数,删除注释,变量和函数被标准命名;
[0009]S2、利用Joern获取步骤S1识别的代码对应的程序属性图,根据程序设计语言特点制定分词规则,对程序属性图中节点所表示的代码分词后,使用Word2Vec获取向量表示;
[0010]S3、利用复杂网络中心性分析理论度量节点的重要性将步骤S2得到的程序属性图转换为图像通道;
[0011]S4、对步骤S3转换后的图像通道进行分类,判断代码是否具有漏洞,完成基于深度学习的软件漏洞检测。
[0012]具体的,步骤S1具体为:
[0013]制定用于识别程序中注释、变量和函数的正则表达式;分别将用于计数变量和函数的变量初始化为0,分别将用于映像变量和函数到标准化命名的哈希表初始化为空;初始化保留字集合,保留字集合包括语言涉及的保留字和项目涉及的保留字;遍历所有代码,识别到注释时直接删除,识别到非保留字集合中的变量或函数时先查找对应哈希表,若哈希表中已有映像则直接取出标准命名,若哈希表中没有,则命名为VAR+变量计数或FUN+函数计数并递增变量计数或函数计数,最后用标准命名替换。
[0014]进一步的,识别注释的正则表达式为'\*/\s*$',识别变数的正则表达式为'\b([_A

Za

z]\w*)\b(?:(?=\s*\w+\()|(?!\s*\w+))(?!\s*\()',识别函数的正则表达式为'\b([_A

Za

z]\w*)\b(?=\s*\()',保留字集合包含C++17标准内的关键词和Linux、FFmpeg和Wireshark的关键词,定义变量var_count和fun_count用于储存已记录的变量或函数的总数。
[0015]具体的,步骤S2中,利用Joern获取步骤S1识别的代码对应的程序属性图具体为:
[0016]使用“joern

parse”命令将源代码文件解析为.bin文件;使用“joern

export”从.bin文件中汇出.dot格式的程序属性图。
[0017]具体的,步骤S2中,使用Word2Vec获取向量表示具体为:
[0018]S2021、根据语言特点制定分词规则,利用改分词规则对所有代码进行分词得到令牌集合,使用令牌集合作为训练语料对Word2Vec模型进行预训练;
[0019]S2022、依次遍历图中的每个节点,对节点所表示的代码使用与预训练相同的分词规则进行分词,利用训练好的Word2Vec模型依次获取所有权杖对应的向量并将这些向量的均值作为该节点的向量表示。
[0020]进一步的,步骤S2021中,对Word2Vec模型进行预训练具体为:
[0021]使用收集到的语料对gensim实现的Word2Vec模型进行预训练,参数包括min_count=1,vector_size=100,sg=0,alpha=0.025,window=5。
[0022]具体的,步骤S3具体为:
[0023]S301、根据边的类型将CPG中的所以节点复制3份分别代表AST、CFG和PDG;遍历CPG对象中的所有边,根据边的类型添加到相应的图中;
[0024]S302、分别利用networkx提供的度中心性、紧密度中心性和特征向量中心性计算步骤S301得到的AST、CFG和PDG中节点的度中心性、紧密度本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于深度学习的软件漏洞检测方法,其特征在于,包括以下步骤:S1、以正则表达式的方式识别代码中的注释、变量和函数,删除注释,变量和函数被标准命名;S2、利用Joern获取步骤S1识别的代码对应的程序属性图,根据程序设计语言特点制定分词规则,对程序属性图中节点所表示的代码分词后,使用Word2Vec获取向量表示;S3、利用复杂网络中心性分析理论度量节点的重要性将步骤S2得到的程序属性图转换为图像通道;S4、对步骤S3转换后的图像信道进行分类,判断代码是否具有漏洞,完成基于深度学习的软件漏洞检测。2.根据权利要求1所述的基于深度学习的软件漏洞检测方法,其特征在于,步骤S1具体为:制定用于识别程序中注释、变量和函数的正则表达式;分别将用于计数变量和函数的变量初始化为0,分别将用于映像变量和函数到标准化命名的哈希表初始化为空;初始化保留字集合,保留字集合包括语言涉及的保留字和项目涉及的保留字;遍历所有代码,识别到注释时直接删除,识别到非保留字集合中的变量或函数时先查找对应哈希表,若哈希表中已有映像则直接取出标准命名,若哈希表中没有,则命名为VAR+变量计数或FUN+函数计数并递增变量计数或函数计数,最后用标准命名替换。3.根据权利要求2所述的基于深度学习的软件漏洞检测方法,其特征在于,识别注释的正则表达式为'\*/\s*$',识别变数的正则表达式为'\b([_A

Za

z]\w*)\b(?:(?=\s*\w+\()|(?!\s*\w+))(?!\s*\()',识别函数的正则表达式为'\b([_A

Za

z]\w*)\b(?=\s*\()',保留字集合包含C++17标准内的关键词和Linux、FFmpeg和Wireshark的关键词,定义变量var_count和fun_count用于储存已记录的变量或函数的总数。4.根据权利要求1所述的基于深度学习的软件漏洞检测方法,其特征在于,步骤S2中,利用Joern获取步骤S1识别的代码对应的程序属性图具体为:使用“joern

parse”命令将源代码文件解析为.bin文件;使用“joern

export”从.bin文件中汇出.dot格式的程序属性图。5.根据权利要求1所述的基于深度学习的软件漏洞检测方法,其特征在于,步骤S2中,使用Word2Vec获取向量表示具体为:S2021、根据语言特点制定分词规则,利用改分词规则对所有代码进行分词得到令牌集合,使用令牌集合作为训练语料对Word2Vec模型进行预训练;S2022、依次遍历图中的每个节点,对节点...

【专利技术属性】
技术研发人员:蔡文静高利鹏
申请(专利权)人:西北工业大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1