CN115495755A - 一种基于CodeBERT和R-GCN的源代码漏洞多分类检测的方法 - Google Patents

一种基于CodeBERT和R-GCN的源代码漏洞多分类检测的方法 Download PDF

Info

Publication number
CN115495755A
CN115495755A CN202211420714.9A CN202211420714A CN115495755A CN 115495755 A CN115495755 A CN 115495755A CN 202211420714 A CN202211420714 A CN 202211420714A CN 115495755 A CN115495755 A CN 115495755A
Authority
CN
China
Prior art keywords
vulnerability
codebert
code
cwe
data
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
Application number
CN202211420714.9A
Other languages
English (en)
Other versions
CN115495755B (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.)
Sichuan University
Original Assignee
Sichuan 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 Sichuan University filed Critical Sichuan University
Priority to CN202211420714.9A priority Critical patent/CN115495755B/zh
Publication of CN115495755A publication Critical patent/CN115495755A/zh
Application granted granted Critical
Publication of CN115495755B publication Critical patent/CN115495755B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

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/561Virus type analysis
    • 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
    • G06F21/563Static detection by source code analysis

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Computer Hardware Design (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Health & Medical Sciences (AREA)
  • General Physics & Mathematics (AREA)
  • Physics & Mathematics (AREA)
  • Virology (AREA)
  • General Health & Medical Sciences (AREA)
  • Computing Systems (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明公开了一种基于CodeBERT和R‑GCN的源代码漏洞多分类检测的方法,将数据根据其标签和相关漏洞信息进行归类得到CWE编号,然后将所有的CWE编号归类到第二层级;将包含源代码数据流和控制流的PDG图结构,通过特定切点对PDG图结构进行前后向切片,得到切片子图,并将其进行处理形成代码语句,进一步形成代码符号表征集;对标准的CodeBERT微调得到新的CodeBERT模型;使用其对代码表征集进行预训练,将其转化为向量表征集;将切片子图和向量表征集作为训练数据训练设计的图神经网络整体架构,得到基于软件源代码的多分类漏洞检测模型,即可对漏洞数据集进行预测,完成漏洞类型的检测。

Description

一种基于CodeBERT和R-GCN的源代码漏洞多分类检测的方法
技术领域
本发明涉及源代码漏洞检测技术领域,具体地说,是一种基于CodeBERT和R-GCN的源代码漏洞多分类检测的方法。
背景技术
随着信息化的发展,软件的种类越来越多,同时结构也越来越复杂,随之而来的是各种隐藏的缺陷。软件中的隐藏缺陷会导致安全漏洞,从而有可能允许攻击者损害系统和应用程序。面对这些问题,在软件开发周期中的早期介入,对源代码的漏洞进行检测使得安全“左移“,能够有效地降低漏洞处理成本和提高漏洞发现效率,促进软件的安全发展。
当前对于软件漏洞的检测方法主要包括:基于软件度量的漏洞检测、基于软件异常的漏洞检测、基于漏洞代码模式匹配的检测、以及其他混合的检测方式。在这几种方法中,当前最主要使用的方法是基于漏洞代码模式匹配的检测,该方法又可以分为传统的基于预先定义的规则匹配的方法,例如RATS,Flawfinder等工具。该方法较为依赖专家经验,需要专家人工定义漏洞规则,效率低且误报率高。同时也包含利用深度学习的模型自动地学习源代码漏洞的内在模式特征的方法,从而得到可以用于检测源代码漏洞的检测模型。当前利用深度学习等方法检测源代码漏洞已经成为新的发展趋势,基于深度学习的漏洞检测方法可通过多层神经网络学习源码中的漏洞特征,无需人工定义漏洞模式,有效改善了传统方法中无法批处理和模块化的缺陷,提高了漏洞检测效率。
使用深度学习等方式检测源代码漏洞主要有两种思路:一是将源代码类比于自然语言,应用现有的自然语言处理领域的成果来检测源代码漏洞。Li等人(Zhen L , D Zou ,Xu S , et al . SySeVR: A Framework for Using Deep Learning toDetect SoftwareVulnerabilities[J] . 2018)首次提出利用深度学习检测源代码漏洞的框架,首先提取源代码的数据流和控制流,得到相关代码片段,然后利用word2vec词向量转化技术将处理好的代码片段转化为深度学习可以识别的词向量,最后利用自然语言处理领域的经典模型BiLSTM(Bi-directional Long Short-Term Memory)对其进行训练,从而得到漏洞检测模型;由于文本的处理方式是逐条读取,但在代码实际运行中存在条件跳转指令,有些代码段并不可达,BiLSTM等自然语言处理领域的模型却难以处理这类问题,所以效果并不是特别理想。因此程等人(程潇. 基于流分析和图神经网络的C源代码漏洞静态检测的研究与实现[D].北京邮电大学,2021)利用程序的数据流和控制流作为基础进行切片,得到漏洞相关的子图,然后利用GNN模型来学习漏洞的潜在模式特征,得到了良好的效果。但是该模型仅用于判断漏洞的有无,对于漏洞的类型等属性信息提供较少。
发明内容
本发明的目的在于提供一种基于CodeBERT和R-GCN的源代码漏洞多分类检测的方法,提高漏洞检测率的同时,在判断漏洞有无的基础上进行多分类检测,给出漏洞的特定类型,进一步帮助开发人员快速核实漏洞的真假和获取漏洞的解决方案。
本发明通过下述技术方案实现:一种基于CodeBERT和R-GCN的源代码漏洞多分类检测的方法,包括下述步骤:
1)数据预处理并进行归类:将数据根据其标签和相关漏洞信息进行归类得到CWE编号,然后根据CWE Research Concept的树状分类图结构将所有的CWE编号归类到第二层级;
2)生成程序切片后的切片子图:将包含源代码数据流和控制流的PDG图结构,通过特定切点对PDG图结构进行前后向切片,从而得到切片子图,并根据该切片子图是否包含漏洞所在的代码语句进行判断是否为安全子图的判断;
3)生成代码的符号表征:将切片子图与源代码对应还原成代码语句,并进一步将代码语句符号化处理得到代码符号表征集;
4)对标准的CodeBERT微调:基于标准CodeBERT模型,将步骤3)得到的代码符号表征集作为标准CodeBERT模型的训练集,再把训练集中的数据逐条转化为CodeBERT要求的数据格式,并将其输入标准CodeBERT模型进行模型微调,通过微调可得到更适应本地数据集的新的CodeBERT模型;
5)生成节点的向量表征:使用新的CodeBERT模型对代码符号表征集进行预训练,将其转化为具有丰富语义信息及上下文关系的向量表征集,用于后续输入图神经网络整体架构进行模型训练;
6)将切片子图和向量表征集作为训练数据训练设计的多层R-GCN网络,得到基于软件源代码的多分类漏洞检测模型;
7)采用基于软件源代码的多分类漏洞检测模型对漏洞数据集进行预测,完成漏洞类型的检测。
进一步的为更好地实现本发明所述的一种基于CodeBERT和R-GCN的源代码漏洞多分类检测的方法:所述步骤1)的具体步骤为:
1.1)对于已经给定CWE编号的数据保留其编号;
1.2)对于仅给出CVE的编号的数据,根据CVE到CWE映射数据库得到CWE编号;
1.3)对于未给定CWE编号和CVE编号的数据,根据其漏洞描述信息查找CVE编号并进而根据CVE到CWE映射数据库得到CWE编号,若未得到CVE编号直接根据漏洞描述判断给出CWE编号;
1.4)在得到所有数据的CWE编号以后,根据CWE Research Concept的树状分类图结构将所有的CWE编号归类到第二层级,并替换为所属第二层级的CWE编号。
进一步的为更好地实现本发明所述的一种基于CodeBERT和R-GCN的源代码漏洞多分类检测的方法:所述特定切点为预先收集相关语言的危险函数;在进行前后向切片时,根据切片点的类型不同应采用不同的切片方式,且切片方式包括前向切片和后向切片;
所述根据该切片子图是否包含漏洞所在的代码语句进行判断是否为安全子图的判断,具体为:若子图包含漏洞所在语句则视为子图存在漏洞,打上所属PDG图结构的CWE标签号;若子图不含漏洞所在语句则视为无漏洞的安全子图。
进一步的为更好地实现本发明所述的一种基于CodeBERT和R-GCN的源代码漏洞多分类检测的方法:所述步骤3)具体包括下述步骤:
3.1)将切片子图中每个节点对应原始代码的行号,节点的属性则为所在行的代码语句,并对代码语句进行数据清洗和格式处理;其中,数据清洗包括删掉注释、非ASCII码在内的无关信息,格式处理包括保留引号、括号在内的代码相关符号,保证代码的整体性。
3.2)对代码语句中出现的关键字和操作符以外的标识符按照统一符号命名规则进行重新命名。
进一步的为更好地实现本发明所述的一种基于CodeBERT和R-GCN的源代码漏洞多分类检测的方法:所述步骤3.2)中标识符按照统一符号命名规则进行重新命名具体为:将用户自定义的函数名统一规范为“FUN_i”,其中,i为对应函数名的顺序,且i∈(1,……n);将用户自定义的变量名统一规范为“VAR_j”,其中,j为对应变量名的顺序,j∈(1,……n)。
进一步的为更好地实现本发明所述的一种基于CodeBERT和R-GCN的源代码漏洞多分类检测的方法:所述步骤5)中使用新的CodeBERT模型对代码表征集进行预训练,具体为:
5.1)通过调用新的CodeBERT模型的库函数convert_tokens_to_ids将token转化为数字id;
5.2)将数字id进一步转为tensor张量后送入新的CodeBERT模型中得到对应的特征向量;
5.3)将特征向量利用一个线性层将向量维度转化为128。
进一步的为更好地实现本发明所述的一种基于CodeBERT和R-GCN的源代码漏洞多分类检测的方法:所述图神经网络整体架构包括3个图卷积层/图池化层、一个读出层以及一个多层感知机(MLP),图卷积层的损失函数为
Figure 100002_DEST_PATH_IMAGE002
,其中,
Figure 100002_DEST_PATH_IMAGE004
为每一类样本的概率,
Figure 100002_DEST_PATH_IMAGE006
是用于缓解类别不平衡的权重参数,γ是用于处理难易样本不均衡的参数;所述训练数据按照训练集、验证集、测试集以8:1:1的比例进行划分;图神经网络结构中的三个卷积层/图池化层和多层感知机的参数优化函数为Adamax,学习率为0 .0002,bach_size = 64。
本发明与现有技术相比,具有以下优点及有益效果:
本发明提高漏洞检测率的同时在判断漏洞有无的基础上进行多分类检测,给出漏洞的特定类型,进一步帮助开发人员快速核实漏洞的真假和获取漏洞的解决方案。
本发明选定了一种可行的漏洞分类标准,并根据该标准给出了不同漏洞类型标注的归一化方法,使数据集标注的漏洞类型属于同一层级,避免从属关系和类型交叉。
本发明给出了一种漏洞数据集的扩充方法,综合利用具有CWE编号、具有CVE编号和仅有漏洞有无标签的数据集来生成对应的可用的CWE编号,从而扩充数据集的样本数与样本质量。
本发明将二分类中使用的Focalloss损失函数引入到多分类中,更好地缓解数据集中各类数据不均衡和样本质量不一导致的模型效果不佳的问题。
附图说明
图1为本发明实施例3所提出的方法流程图。
图2为本发明所述图神经网络整体架构图。
具体实施方式
下面结合实施例对本发明作进一步地详细说明,但本发明的实施方式不限于此。
为使本发明实施方式的目的、技术方案和优点更加清楚,下面将结合本发明实施方式中的附图,对本发明实施方式中的技术方案进行清楚、完整地描述,显然,所描述的实施方式是本发明一部分实施方式,而不是全部的实施方式。基于本发明中的实施方式,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施方式,都属于本发明保护的范围。因此,以下对在附图中提供的本发明的实施方式的详细描述并非旨在限制要求保护的本发明的范围,而是仅仅表示本发明的选定实施方式。基于本发明中的实施方式,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施方式,都属于本发明保护的范围。
名词解释:
CodeBERT:面向编程语言和自然语言的预训练模型;
R-GCN :关系图卷积神经网络;
CWE:Common Weakness Enumeration 常见缺陷列表;
CVE:Common Vulnerabilities and Exposures 通用漏洞披露;
CWE Research Concept :常见缺陷列表研究视图;
Joern:一种特定开源工具名称;
PDG:程序依赖图;
GNN:Graph Neural Networks 图神经网络
Joern-parse:开源工具Joern的子功能;
实施例1:
本发明设计出一种基于CodeBERT和R-GCN的源代码漏洞多分类检测的方法,提高漏洞检测率的同时在判断漏洞有无的基础上进行多分类检测,给出漏洞的特定类型,进一步帮助开发人员快速核实漏洞的真假和获取漏洞的解决方案,包括下述步骤:
1)数据预处理并进行归类:将数据根据其标签和相关漏洞信息进行归类得到CWE编号,然后根据CWE Research Concept的树状分类图结构将所有的CWE编号归类到第二层级,其具体包括下述步骤:
1.1)对于已经给定CWE编号的数据保留其编号;
1.2)对于仅给出CVE的编号的数据,根据CVE到CWE映射数据库得到CWE编号;
1.3)对于未给定CWE编号和CVE编号的数据,根据其漏洞描述信息查找CVE编号并进而根据CVE到CWE映射数据库得到CWE编号,若未得到CVE编号直接根据漏洞描述判断给出CWE编号;
1.4)在得到所有数据的CWE编号以后,根据CWE Research Concept的树状分类图结构将所有的CWE编号归类到第二层级,并替换为所属第二层级的CWE编号。
2)生成程序切片后的切片子图:将包含源代码数据流和控制流的PDG图结构,通过特定切点(即预先收集相关语言的危险函数)对PDG图结构进行前后向切片,在进行前后向切片时,根据切片点的类型不同应采用不同的切片方式,得到高效的切片效果,且切片方式包括前向切片和后向切片;经前后向切片得到切片子图,并根据该切片子图是否包含漏洞所在的代码语句进行判断是否为安全子图的判断,具体判断过程为:若子图包含漏洞所在语句则视为子图存在漏洞,打上所属PDG图结构的CWE标签号;若子图不含漏洞所在语句则视为无漏洞的安全子图;
3)生成代码的符号表征:将切片子图与源代码对应还原成代码语句,并进一步将代码语句符号化处理得到代码符号表征集;
该步骤的具体步骤为:
3.1)将切片子图中每个节点对应原始代码的行号,节点的属性则为所在行的代码语句,并对代码语句进行数据清洗和格式处理;其中,数据清洗包括删掉注释、非ASCII码在内的无关信息,格式处理包括保留引号、括号在内的代码相关符号,保证代码的整体性;
3.2)对代码语句中出现的关键字和操作符以外的标识符按照统一符号命名规则进行重新命名,在进行重新命名时:将用户自定义的函数名统一规范为“FUN_i”,其中,i为对应函数名的顺序,且i∈(1,……n);将用户自定义的变量名统一规范为“VAR_j”,其中,j为对应变量名的顺序,j∈(1,……n)。
4)对标准的CodeBERT微调:基于标准CodeBERT模型,将步骤3)得到的代码符号表征集作为标准CodeBERT模型的训练集,再把训练集中的数据逐条转化为CodeBERT要求的数据格式,并将其输入标准CodeBERT模型进行模型微调,通过微调可得到更适应本地数据集的新的CodeBERT模型;
5)生成节点的向量表征:使用新的CodeBERT模型对代码符号表征集进行预训练,将其转化为具有丰富语义信息及上下文关系的向量表征集,用于后续输入图神经网络整体架构进行模型训练。
在进行预训练时,具体的过程为:
5.1)通过调用新的CodeBERT模型的库函数convert_tokens_to_ids将token转化为数字id;
5.2)将数字id进一步转为tensor张量后送入新的CodeBERT模型中得到对应的特征向量;
5.3)将特征向量利用一个线性层将向量维度转化为128。
6)将切片子图和向量表征集作为训练数据训练设计的图神经网络整体架构,得到基于软件源代码的多分类漏洞检测模型;其中,图神经网络整体架构结合图2所示,包括3个图卷积层/图池化层、一个读出层以及一个多层感知机(MLP),图卷积层的损失函数采用由二分类focalloss改进的多分类focalloss,即每一类的损失函数为
Figure 476467DEST_PATH_IMAGE002
,其中,
Figure 128029DEST_PATH_IMAGE004
为每一类样本的概率,
Figure 376607DEST_PATH_IMAGE006
是用于缓解类别不平衡的权重参数,γ是用于处理难易样本不均衡的参数;所述训练数据按照训练集、验证集、测试集以8:1:1的比例进行划分;图神经网络结构中的三个卷积层/图池化层和多层感知机的参数优化函数为Adamax,学习率为0 .0002,bach_size = 64。
7)采用基于软件源代码的多分类漏洞检测模型对漏洞数据集进行预测,完成漏洞类型的检测。
实施例2:
一种基于CodeBERT和R-GCN的源代码漏洞多分类检测的方法,该方法主要针对C++源代码检测,但检测流程方法可延伸至JAVA等其他代码使用,包括下述流程:
(1)数据集预处理;不同渠道的得到的数据集类型主要分为四类;第一类有CWE编号。第二类,无CWE编号但具有CVE编号。第三类,既无CWE编号又无CVE编号,但具有漏洞描述信息。第四类,无CWE和CVE标签,也无漏洞描述信息;在该实施例中主要使用的是前三类信息,有CWE编号直接使用,有CVE编号的根据CVE到CWE映射数据库进行映射转换,给出CWE相应编号;仅有漏洞信息的可检索相关漏洞信息得到CVE编号进一步得到CWE编号,若无法得到CVE编号可根据漏洞描述信息直接推断CWE编号;再得到所有CWE编号以后,统一根据CWEResearch Concept的树状分类图结构将所有的CWE号归类到第二层级,并替换为所属第二层级的CWE编号。例如第三层级CWE1274归属于第二层级的CWE1263,则将数据标签更改为CWE1263。
(2)对处理后的数据集使用Joern-parse将源代码进行解析,然后构建PDG图结构;然后在PDG图结构上以预先收集相关语言的危险函数作为切片入口进行上下文切片。以C++语言为例,其易错函数包括“strcpy”,“printf”等一系列容易被不规范使用函数。然后针对不同的切点根据其特点考虑做不同切片,例如对于”strcpy”考虑其溢出特点,则采用后向切片。通过切片后,由于一个PDG图结构中可能存在多个不同切点,所以可能会得到多个不同的切片子图,对于这些不同的切片子图根据是否包含漏洞行来打上不同的标签。
(3)代码块中用户自定义的变量名被按顺序重新命名为“VAR1”、“VAR2”等。用户自定义的函数名被按顺序重新命名为“FUN1”、“FUN2” 等。其中“VAR”和“FUN”用于区分函数和变量,“1”和“2”表示该变量或函数在代码块中的次序。例如,a[10]、b[10]和n被依次重命名为VAR1[10]、VAR2[10]和VAR3,函数调用mystrncpy (src , dst , n)被重新命名为FUN1(VAR1 , VAR2 , VAR3),这些映射都是通过一一对应的方式执行的。每个代码块的命名替换完成后,都会对函数和变量索引重新计数,因此当多个变量和函数出现在不同的代码块中时,它们可能被映射为相同的符号名。
(4)原始的CodeBERT(标准的CodeBERT)模型下载后需要基于自己的数据集进行微调得到新的CodeBERT模型,才能使CodeBERT更加适应自己的数据,获得良好的效果;
(5)使用微调后的CodeBERT模型先通过调用其库函数convert_tokens_to_ids,将token转化为数字id,然后进一步转为tensor张量后送入新的CodeBERT模型得到对应的特征向量,从而得到切片子图节点向量表征,然后接入一个线性层将向量维度转化为128(由于CodeBERT输出向量维度为768,因此在输入前需要对输入向量进行重塑维度);
(6)为了实现对源代码的多分类,结合图2所示,本发明设计了一个图神经网络整体架构,将步骤(2)的得到的切片子图和步骤(5)得到的向量表征集联合作为图神经网络整体架构的训练数据,训练得到基于软件源代码的多分类漏洞检测模型。该架构由三个图卷积层/图池化层(卷积-池化块),一个读出层(Σ),一个多层感知机(MLP)组成。
其中图卷积层采用R-GCN模型,损失函数为改进的多分类focalloss,其原理如下列公式:
Figure 240658DEST_PATH_IMAGE002
。图神经网络结构中的三个卷积层/图池化层和多层感知机的参数优化函数为Adamax,学习率为0 .0002,bach_size = 64。将训练数据按照训练集、验证集、测试集以8:1:1的比例进行划分,训练模型。
其中参数
Figure 523872DEST_PATH_IMAGE004
即为每一类样本的概率,而
Figure 330023DEST_PATH_IMAGE006
是用于缓解类别不平衡的权重参数。最后的γ是用于处理难易样本不均衡的参数。
实施例3:
结合图1所示,一种基于CodeBERT和R-GCN的源代码漏洞多分类检测方法,在训练阶段:
第一步,漏洞数据集:准备用于进行漏洞检测的数据集,并按照训练集、验证集、测试集以8:1:1的比例进行划分。
第二步,得到训练数据集,并执行训练阶段的第二步。
第三步,源代码预处理,解析依赖关系:对于已经给定CWE编号的数据保留其编号;对于仅给出CVE的编号的数据,根据CVE到CWE映射数据库得到CWE编号;对于未给定CWE编号和CVE编号的数据,根据其漏洞描述信息查找CVE编号并进而根据CVE到CWE映射数据库得到CWE编号,若未得到CVE编号直接根据漏洞描述判断给出CWE编号;在得到所有数据的CWE编号以后,根据CWE Research Concept的树状分类图结构将所有的CWE编号归类到第二层级,并替换为所属第二层级的CWE编号。
第四步,提取程序依赖图,执行程序切片:将包含源代码数据流和控制流的PDG图结构,通过特定切点(即预先收集相关语言的危险函数)对PDG图结构进行前后向切片,在进行前后向切片时,根据切片点的类型不同应采用不同的切片方式,得到高效的切片效果,且切片方式包括前向切片和后向切片;经前后向切片得到切片子图,并根据该切片子图是否包含漏洞所在的代码语句进行判断是否为安全子图的判断,具体判断过程为:若子图包含漏洞所在语句则视为子图存在漏洞,打上所属PDG图结构的CWE标签号;若子图不含漏洞所在语句则视为无漏洞的安全子图。
第五步,子图代码符号化:将切片子图中每个节点对应原始代码的行号,节点的属性则为所在行的代码语句,并对代码语句删掉注释、非ASCII码等在内的无关信息,同时保留引号、括号在内的代码相关符号,保证代码的整体性;对代码语句中出现的关键字和操作符以外的标识符按照统一符号命名规则进行重新命名,例如将用户自定义的函数名统一规范为“FUN_i”,其中,i为对应函数名的顺序,且i∈(1,……n);将用户自定义的变量名统一规范为“VAR_j”,其中,j为对应变量名的顺序,j∈(1,……n),从而得到代码符号表征集。
第六步,CodeBERT微调和向量化:基于标准CodeBERT模型,将代码符号表征集作为标准CodeBERT模型的训练集,再把训练集中的数据逐条转化为CodeBERT要求的数据格式,并将其输入标准CodeBERT模型进行模型微调,通过微调可得到更适应本地数据集的新的CodeBERT模型。然后使用新的CodeBERT模型对代码表征集进行预训练(首先通过调用新的CodeBERT模型的库函数convert_tokens_to_ids将token转化为数字id;其次将数字id进一步转为tensor张量后送入新的CodeBERT模型中得到对应的特征向量;再次将特征向量利用一个线性层将向量维度转化为128),将其转化为具有丰富语义信息及上下文关系的向量表征集。
第七步,图神经网络模型搭建、训练:将切片子图和向量表征集作为训练数据训练设计的图神经网络整体架构,得到基于软件源代码的多分类漏洞检测模型;其中,图神经网络整体架构结合图2所示,包括3个图卷积层/图池化层、一个读出层以及一个多层感知机(MLP),图卷积层的损失函数采用改进的多分类focalloss,且损失函数为
Figure 65898DEST_PATH_IMAGE002
,其中,
Figure 999218DEST_PATH_IMAGE004
为每一类样本的概率,
Figure 136939DEST_PATH_IMAGE006
是用于缓解类别不平衡的权重参数,γ是用于处理难易样本不均衡的参数;所述训练数据按照训练集、验证集、测试集以8:1:1的比例进行划分;图神经网络结构中的三个卷积层/图池化层和多层感知机的参数优化函数为Adamax,学习率为0 .0002,bach_size = 64。
测试阶段:
第一步、测试数据集:准备合适比例的漏洞数据集(训练集、验证集、测试集以8:1:1的比例划分),而后执行测试阶段的第二步。
第二步、源代码预处理,解析依赖关系:对于已经给定CWE编号的数据保留其编号;对于仅给出CVE的编号的数据,根据CVE到CWE映射数据库得到CWE编号;对于未给定CWE编号和CVE编号的数据,根据其漏洞描述信息查找CVE编号并进而根据CVE到CWE映射数据库得到CWE编号,若未得到CVE编号直接根据漏洞描述判断给出CWE编号;在得到所有数据的CWE编号以后,根据CWE Research Concept的树状分类图结构将所有的CWE编号归类到第二层级,并替换为所属第二层级的CWE编号。
第三步,提取程序依赖图,执行程序切片:将包含源代码数据流和控制流的PDG图结构,通过特定切点(即预先收集相关语言的危险函数)对PDG图结构进行前后向切片,在进行前后向切片时,根据切片点的类型不同应采用不同的切片方式,得到高效的切片效果,且切片方式包括前向切片和后向切片;经前后向切片得到切片子图,并根据该切片子图是否包含漏洞所在的代码语句进行判断是否为安全子图的判断,具体判断过程为:若子图包含漏洞所在语句则视为子图存在漏洞,打上所属PDG图结构的CWE标签号;若子图不含漏洞所在语句则视为无漏洞的安全子图。
第四步,子图代码符号化:将切片子图中每个节点对应原始代码的行号,节点的属性则为所在行的代码语句,并对代码语句删掉注释、非ASCII码等在内的无关信息,同时保留引号、括号在内的代码相关符号,保证代码的整体性;对代码语句中出现的关键字和操作符以外的标识符按照统一符号命名规则进行重新命名,例如将用户自定义的函数名统一规范为“FUN_i”,其中,i为对应函数名的顺序,且i∈(1,……n);将用户自定义的变量名统一规范为“VAR_j”,其中,j为对应变量名的顺序,j∈(1,……n)从而得到代码符号表征集。
第五步,CodeBERT微调和向量化:基于标准CodeBERT模型,将代码符号表征集作为标准CodeBERT模型的训练集,再把训练集中的数据逐条转化为CodeBERT要求的数据格式,并将其输入标准CodeBERT模型进行模型微调,通过微调可得到更适应本地数据集的新的CodeBERT模型。然后使用新的CodeBERT模型对代码表征集进行预训练(首先通过调用新的CodeBERT模型的库函数convert_tokens_to_ids将token转化为数字id;其次将数字id进一步转为tensor张量后送入新的CodeBERT模型中得到对应的特征向量;再次将特征向量利用一个线性层将向量维度转化为128),将其转化为具有丰富语义信息及上下文关系的向量表征集。
第六步、使用模型预测:针对工程实践中的源代码,采取上述方法中的一系列步骤处理后,送入训练阶段得到的检测模型进行预测,输出检测结果,从而得到源代码是否包含漏洞的判定,以及给出源代码中存在的漏洞的类型;
最后将检测结果整理综合输出,形成可见的结构化文档报告。
以上所述,仅是本发明的较佳实施例,并非对本发明做任何形式上的限制,凡是依据本发明的技术实质对以上实施例所作的任何简单修改、等同变化,均落入本发明的保护范围之内。

Claims (7)

1.一种基于CodeBERT和R-GCN的源代码漏洞多分类检测的方法,其特征在于:包括下述步骤:
1)数据预处理并进行归类:将数据根据其标签和相关漏洞信息进行归类得到CWE编号,然后根据CWE Research Concept的树状分类图结构将所有的CWE编号归类到第二层级;
2)生成程序切片后的切片子图:将包含源代码数据流和控制流的PDG图结构,通过特定切点对PDG图结构进行前后向切片,从而得到切片子图,并根据该切片子图是否包含漏洞所在的代码语句判断其是否为安全子图;
3)生成代码的符号表征:将切片子图与源代码对应还原成代码语句,并进一步将代码语句符号化处理得到代码符号表征集;
4)对标准的CodeBERT微调:将步骤3)得到的代码符号表征集作为标准CodeBERT模型的训练集,再把训练集中的数据逐条转化为CodeBERT要求的数据格式,并将其输入标准CodeBERT模型进行训练,微调得到新的CodeBERT模型;
5)生成节点的向量表征:使用新的CodeBERT模型对代码符号表征集进行预训练,将其转化为向量表征集;
6)将切片子图和向量表征集作为训练数据训练设计的图神经网络整体架构,得到基于软件源代码的多分类漏洞检测模型;
7)采用基于软件源代码的多分类漏洞检测模型对漏洞数据集进行预测,完成漏洞类型的检测。
2.根据权利要求1所述的一种基于CodeBERT和R-GCN的源代码漏洞多分类检测的方法,其特征在于:所述步骤1)的具体步骤为:
1.1)对于已经给定CWE编号的数据保留其编号;
1.2)对于仅给出CVE编号的数据,根据CVE到CWE的映射数据库得到CWE编号;
1.3)对于未给定CWE编号和CVE编号的数据,根据其漏洞描述信息查找CVE编号,并根据CVE到CWE的映射数据库得到CWE编号;若未得到CVE编号,直接根据漏洞描述判断给出CWE编号;
1.4)在得到所有数据的CWE编号后,根据CWE Research Concept的树状分类图结构将所有的CWE编号归类到第二层级,并替换为所属第二层级的CWE编号。
3.根据权利要求1或2所述的一种基于CodeBERT和R-GCN的源代码漏洞多分类检测的方法,其特征在于:所述特定切点为预先收集相关语言的危险函数;在进行前后向切片时,根据切片点的类型不同应采用不同的切片方式,且切片方式包括前向切片和后向切片;
所述根据该切片子图是否包含漏洞所在的代码语句判断是否为安全子图,具体为:若子图包含漏洞所在语句则视为子图存在漏洞,打上所属PDG图结构的CWE标签号;若子图不含漏洞所在语句则视为无漏洞的安全子图。
4.根据权利要求1或2所述的一种基于CodeBERT和R-GCN的源代码漏洞多分类检测的方法,其特征在于:所述步骤3)具体包括下述步骤:
3.1)将切片子图中每个节点对应原始代码的行号,节点的属性则为所在行的代码语句,并对代码语句进行数据清洗和格式处理;其中,数据清洗包括删掉注释、非ASCII码在内的无关信息,格式处理包括保留引号、括号在内的代码相关符号;
3.2)对代码语句中出现的关键字和操作符以外的标识符按照统一符号命名规则进行重新命名。
5.根据权利要求4所述的一种基于CodeBERT和R-GCN的源代码漏洞多分类检测的方法,其特征在于:所述步骤3.2)中标识符按照统一符号命名规则进行重新命名,具体为:将用户自定义的函数名统一规范为“FUN_i”,其中,i为对应函数名的顺序,且i∈(1,2,…,n);将用户自定义的变量名统一规范为“VAR_j”,其中,j为对应变量名的顺序,j∈(1,2,…,n)。
6.根据权利要求1或2所述的一种基于CodeBERT和R-GCN的源代码漏洞多分类检测的方法,其特征在于:所述步骤5)中使用新的CodeBERT模型对代码表征集进行预训练,具体为:
5.1)通过调用新的CodeBERT模型的库函数convert_tokens_to_ids将token转化为数字id;
5.2)将数字id进一步转为tensor张量后,送入新的CodeBERT模型中得到对应的特征向量;
5.3)利用一个线性层将特征向量维度转化为128。
7.根据权利要求1或2所述的一种基于CodeBERT和R-GCN的源代码漏洞多分类检测的方法,其特征在于:所述图神经网络整体架构包括3个图卷积层/图池化层、一个读出层以及一个多层感知机,图卷积层的损失函数为
Figure DEST_PATH_IMAGE002
,其中,
Figure DEST_PATH_IMAGE004
为每一类样本的概率,
Figure DEST_PATH_IMAGE006
是用于缓解类别不平衡的权重参数,γ是用于处理难易样本不均衡的参数;所述训练数据按照训练集、验证集、测试集以8:1:1的比例进行划分。
CN202211420714.9A 2022-11-15 2022-11-15 一种基于CodeBERT和R-GCN的源代码漏洞多分类检测的方法 Active CN115495755B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202211420714.9A CN115495755B (zh) 2022-11-15 2022-11-15 一种基于CodeBERT和R-GCN的源代码漏洞多分类检测的方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202211420714.9A CN115495755B (zh) 2022-11-15 2022-11-15 一种基于CodeBERT和R-GCN的源代码漏洞多分类检测的方法

Publications (2)

Publication Number Publication Date
CN115495755A true CN115495755A (zh) 2022-12-20
CN115495755B CN115495755B (zh) 2023-04-07

Family

ID=85115656

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202211420714.9A Active CN115495755B (zh) 2022-11-15 2022-11-15 一种基于CodeBERT和R-GCN的源代码漏洞多分类检测的方法

Country Status (1)

Country Link
CN (1) CN115495755B (zh)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116702160A (zh) * 2023-08-07 2023-09-05 四川大学 一种基于数据依赖增强程序切片的源代码漏洞检测方法
CN117251376A (zh) * 2023-10-09 2023-12-19 湖北大学 一种软件缺陷预测方法和系统
CN117592061A (zh) * 2024-01-19 2024-02-23 北京中科卓信软件测评技术中心 融合代码漏洞特征及属性图的源代码安全检测方法与装置

Citations (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111460450A (zh) * 2020-03-11 2020-07-28 西北大学 一种基于图卷积网络的源代码漏洞检测方法
US20200401702A1 (en) * 2019-06-24 2020-12-24 University Of Maryland Baltimore County Method and System for Reducing False Positives in Static Source Code Analysis Reports Using Machine Learning and Classification Techniques
CN112131882A (zh) * 2020-09-30 2020-12-25 绿盟科技集团股份有限公司 一种多源异构网络安全知识图谱构建方法及装置
CN112560049A (zh) * 2020-12-28 2021-03-26 苏州极光无限信息技术有限公司 一种漏洞检测方法、装置和存储介质
CN113157385A (zh) * 2021-02-08 2021-07-23 北京航空航天大学 一种基于图神经网络的智能合约漏洞自动化检测方法
CN113420296A (zh) * 2021-07-08 2021-09-21 国网甘肃省电力公司电力科学研究院 一种基于Bert模型与BiLSTM的C源代码漏洞检测方法
CN113672931A (zh) * 2021-07-13 2021-11-19 中国人民解放军军事科学院国防科技创新研究院 一种基于预训练的软件漏洞自动检测方法及装置
US20220199079A1 (en) * 2020-12-22 2022-06-23 Meta Platforms, Inc. Systems and Methods for Providing User Experiences on Smart Assistant Systems
CN114861194A (zh) * 2022-05-13 2022-08-05 兰州交通大学 一种基于bgru与cnn融合模型的多类型漏洞检测方法
CN115146279A (zh) * 2022-06-28 2022-10-04 湖南大学 程序漏洞检测方法、终端设备及存储介质

Family Cites Families (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109657473B (zh) * 2018-11-12 2020-09-18 华中科技大学 一种基于深度特征的细粒度漏洞检测方法
CN110245496B (zh) * 2019-05-27 2021-04-20 华中科技大学 一种源代码漏洞检测方法及检测器和其训练方法及系统
CN115269427A (zh) * 2022-08-03 2022-11-01 沈阳航空航天大学 针对web注入漏洞的中间语言表示方法及系统

Patent Citations (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20200401702A1 (en) * 2019-06-24 2020-12-24 University Of Maryland Baltimore County Method and System for Reducing False Positives in Static Source Code Analysis Reports Using Machine Learning and Classification Techniques
CN111460450A (zh) * 2020-03-11 2020-07-28 西北大学 一种基于图卷积网络的源代码漏洞检测方法
CN112131882A (zh) * 2020-09-30 2020-12-25 绿盟科技集团股份有限公司 一种多源异构网络安全知识图谱构建方法及装置
US20220199079A1 (en) * 2020-12-22 2022-06-23 Meta Platforms, Inc. Systems and Methods for Providing User Experiences on Smart Assistant Systems
CN112560049A (zh) * 2020-12-28 2021-03-26 苏州极光无限信息技术有限公司 一种漏洞检测方法、装置和存储介质
CN113157385A (zh) * 2021-02-08 2021-07-23 北京航空航天大学 一种基于图神经网络的智能合约漏洞自动化检测方法
CN113420296A (zh) * 2021-07-08 2021-09-21 国网甘肃省电力公司电力科学研究院 一种基于Bert模型与BiLSTM的C源代码漏洞检测方法
CN113672931A (zh) * 2021-07-13 2021-11-19 中国人民解放军军事科学院国防科技创新研究院 一种基于预训练的软件漏洞自动检测方法及装置
CN114861194A (zh) * 2022-05-13 2022-08-05 兰州交通大学 一种基于bgru与cnn融合模型的多类型漏洞检测方法
CN115146279A (zh) * 2022-06-28 2022-10-04 湖南大学 程序漏洞检测方法、终端设备及存储介质

Non-Patent Citations (6)

* Cited by examiner, † Cited by third party
Title
BOLUN WU 等: "Code Vulnerability Detection Based on Deep Sequence and Graph Models: A Survey", 《SECURITY AND COMMUNICATION NETWORKS》 *
WENBOGUO 等: "HyVulDect: A hybrid semantic vulnerability mining system based on graph neural network", 《COMPUTERS & SECURITY》 *
凌祎 等: "基于预训练的恶意软件分类方法", 《现代计算机》 *
宋子韬 等: "基于图神经网络的源码漏洞检测方法研究", 《通信技术》 *
王一凡: "基于多引擎融合的静态代码缺陷检测技术研究", 《中国优秀硕士学位论文全文数据库 信息科技辑》 *
王乐: "基于知识图谱的软件安全漏洞挖掘技术研究", 《中国优秀硕士学位论文全文数据库 信息科技辑》 *

Cited By (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116702160A (zh) * 2023-08-07 2023-09-05 四川大学 一种基于数据依赖增强程序切片的源代码漏洞检测方法
CN116702160B (zh) * 2023-08-07 2023-11-10 四川大学 一种基于数据依赖增强程序切片的源代码漏洞检测方法
CN117251376A (zh) * 2023-10-09 2023-12-19 湖北大学 一种软件缺陷预测方法和系统
CN117251376B (zh) * 2023-10-09 2024-03-19 湖北大学 一种软件缺陷预测方法和系统
CN117592061A (zh) * 2024-01-19 2024-02-23 北京中科卓信软件测评技术中心 融合代码漏洞特征及属性图的源代码安全检测方法与装置
CN117592061B (zh) * 2024-01-19 2024-04-12 北京中科卓信软件测评技术中心 融合代码漏洞特征及属性图的源代码安全检测方法与装置

Also Published As

Publication number Publication date
CN115495755B (zh) 2023-04-07

Similar Documents

Publication Publication Date Title
CN115495755B (zh) 一种基于CodeBERT和R-GCN的源代码漏洞多分类检测的方法
Hin et al. Linevd: Statement-level vulnerability detection using graph neural networks
CN110968699B (zh) 一种基于事理推荐的逻辑图谱构建及预警方法和装置
CN108446540B (zh) 基于源代码多标签图神经网络的程序代码抄袭类型检测方法与系统
CN113641586B (zh) 软件源代码缺陷检测方法、系统、电子设备及储存介质
CN109697162B (zh) 一种基于开源代码库的软件缺陷自动检测方法
Xu et al. Defect prediction with semantics and context features of codes based on graph representation learning
CN111459799A (zh) 一种基于Github的软件缺陷检测模型建立、检测方法及系统
CN106537333A (zh) 用于软件产物的数据库的系统和方法
CN108345457A (zh) 一种对程序源代码自动生成功能描述性注释的方法
CN112579469A (zh) 一种源代码缺陷检测方法与装置
Movshovitz-Attias et al. Kb-lda: Jointly learning a knowledge base of hierarchy, relations, and facts
CN111783016A (zh) 一种网站分类方法、装置及设备
JP2020126641A (ja) Apiマッシュアップ探査及びリコメンデーション
CN111758098A (zh) 利用遗传编程的命名实体识别和提取
CN116361815B (zh) 基于机器学习的代码敏感信息及硬编码检测方法及装置
Ullah et al. Programmers' de-anonymization using a hybrid approach of abstract syntax tree and deep learning
CN114861194A (zh) 一种基于bgru与cnn融合模型的多类型漏洞检测方法
CN115437952A (zh) 一种基于深度学习的语句级软件缺陷检测方法
Xu et al. A GitHub-based data collection method for software defect prediction
CN116702160B (zh) 一种基于数据依赖增强程序切片的源代码漏洞检测方法
CN116975881A (zh) 一种基于llvm的漏洞细粒度定位方法
CN115525899A (zh) 面向持续集成平台的漏洞误报消除方法
CN108647497A (zh) 一种基于特征提取的api密钥自动识别系统
CN114386048A (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