CN113420296A - 一种基于Bert模型与BiLSTM的C源代码漏洞检测方法 - Google Patents
一种基于Bert模型与BiLSTM的C源代码漏洞检测方法 Download PDFInfo
- Publication number
- CN113420296A CN113420296A CN202110770650.4A CN202110770650A CN113420296A CN 113420296 A CN113420296 A CN 113420296A CN 202110770650 A CN202110770650 A CN 202110770650A CN 113420296 A CN113420296 A CN 113420296A
- Authority
- CN
- China
- Prior art keywords
- code
- model
- vulnerability
- data
- bert model
- 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
Images
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
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/43—Checking; Contextual analysis
- G06F8/436—Semantic checking
-
- 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/08—Learning methods
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2221/00—Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F2221/03—Indexing scheme relating to G06F21/50, monitoring users, programs or devices to maintain the integrity of platforms
- G06F2221/033—Test or assess software
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- Software Systems (AREA)
- Computer Security & Cryptography (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Computing Systems (AREA)
- Health & Medical Sciences (AREA)
- Computational Linguistics (AREA)
- General Health & Medical Sciences (AREA)
- Biomedical Technology (AREA)
- Molecular Biology (AREA)
- Evolutionary Computation (AREA)
- Mathematical Physics (AREA)
- Data Mining & Analysis (AREA)
- Biophysics (AREA)
- Artificial Intelligence (AREA)
- Life Sciences & Earth Sciences (AREA)
- Virology (AREA)
- Stored Programmes (AREA)
- Debugging And Monitoring (AREA)
Abstract
一种基于Bert模型与BiLSTM的C源代码漏洞检测方法,通过对软件源代码进行分析,构建控制依赖图与数据依赖图,依据代码间的控制依赖关系和数据依赖关系将代码进行切片,生成切片级代码块,再对生成的代码块进行数据清洗和预处理,并对生成的每个代码块打标签以区分代码块是否包含漏洞信息。其次,将处理过的代码块作为训练集输入Bert预训练模型对标准Bert模型进行微调,得到新的Bert模型。再将代码块输入新的Bert模型以无监督方式学习代码间的语义信息和上下文关系,对代码块进行词嵌入编码,得到具有最大化代码语义信息和上下文关系的词向量。最后,将得到的词向量输入BiLSTM中训练检测模型,得到源代码漏洞检测模型。本发明能提高漏洞检测准确率,降低误报率。
Description
技术领域
本发明涉及一种软件源代码漏洞检测方法,具体为一种基于Bert模型与BiLSTM的C源代码漏洞检测方法。
背景技术
当前生活中发生的大多数网络攻击安全事件大都基于设备软件中存在的各种不同的软件漏洞,软件漏洞是指软件开发者在开发阶段由于技术问题、经验不足等因素造成的软件缺陷,并且该缺陷存在于软件部署与运行的整个阶段。因此,攻击者可在任何时间或地点使用漏洞利用工具基于此类软件漏洞缺陷对目标***发起攻击,提取管理员权限,获取***数据与命令控制权限以达到扰乱***的正常运行或获取经济利益的目的。
目前存在的比较成熟的漏洞挖掘技术主要包括:二进制漏洞检测方法、基于模式匹配的漏洞检测方法、基于代码相似性的漏洞检测方法。其中基于二进制的漏洞检测方法是将源代码转化为二进制流,再对二进制流进行分析,因此缺失了大部分语义与逻辑信息,不利于漏洞的检测。基于模式匹配的漏洞检测方法的原理是首先需要专家人工定义漏洞模式,再依据定义好的漏洞模式在源代码中搜索是否存在与之匹配的代码段,确定漏洞是否存在,但这种方法效率较低,主观性较强,误报率较高。基于代码相似性的漏洞检测方法的检测原理是通过分析并统计代码之间相似度高低,从而判断被测程序中是否存在漏洞,可以对由代码复制及代码克隆引起的漏洞进行有效检测,但对其他类型漏洞的检测具有一定的局限性。以上三种方法都是通过具有丰富经验的专家去定义漏洞特征,设定漏洞检测规则对软件中的代码进行安全性检测。这种方法最大的缺陷就是检测效率低、主观依赖性强、无法实现批量检测。因此基于自动化的漏洞检测方法已经成为当前发展的新趋势,目前基于深度学习的漏洞检测方法可通过多层神经网络学习源码中的漏洞特征,无需人工定义漏洞模式,有效改善了传统方法中无法批处理和模块化的缺陷,提高了漏洞检测效率。Li等人(Zhen L, D Zou, Xu S , et al. SySeVR: A Framework for Using Deep Learning toDetect Software Vulnerabilities[J]. 2018.)首次提出使用深度学习技术构建基于软件源代码的漏洞检测模型,该模型利用word2vec词向量转化技术将处理好的漏洞代码块转化为深度学习可以识别的词向量,再将其放入深度学习网络训练模型,以上方法虽然可以对漏洞有效分类,但由于word2vec技术在词向量转化过程中不考虑原始文本的上下文语义关系,因此基于该向量训练得到的检测模型仍然存在检测准确率低的问题。专利CN201910447971提出使用深度学习技术学习漏洞特征,避免了人工定义漏洞特征,提高了漏洞检测效率,但上述方法在词向量生成阶段使用了word2vec中的Skip-Gram模型,该模型不能对文本中的上下文关系进行编码,且只能对单个词进行编码。因此,在生成词向量的过程中必然会造成语义信息缺失,导致训练得到的模型检测准确率较低。专利CN202011046243提出的源代码漏洞检测方法的词向量转化过程和专利CN201910447971一致,同样是基于word2vec词向量转化技术将包含漏洞的源代码数据转化为其对应的向量表示。因此,在生成词向量的过程中必然会造成语义信息缺失,从而影响模型的检测准确率。专利CN201911363149使用半监督学习技术,将有标签数据和无标签数据共同作为训练数据,直接将代码元素输入ELMo模型中对源代码是否包含漏洞信息进行预测,虽然节省了代码处理的时间,但是由于ELMo模型在训练下游需要设置每层的参数,因其只能对单个词进行编码,且无负采样过程,无法保证较高的检测准确率。专利CN202010576421提出了一种基于图卷积神经网络的源代码漏洞检测方法,该方法通过得到源代码对应的代码属性图,基于漏洞特征构建代码切片图结构,再使用图卷积网络学习每个图节点的向量表示,训练得到源代码漏洞检测模型,但当训练代码结构较为复杂时,生成的代码属性图复杂度较高,图卷积网络不能有效学习复杂的图节点,因此仍然存在检测准确率较低的问题。
发明内容
本发明提供一种基于Bert模型与BiLSTM的C源代码漏洞检测方法,提高漏洞检测准确率,降低误报率。
本发明采用的技术方案如下:
一种基于Bert模型与BiLSTM的C源代码漏洞检测方法,主要包含以下步骤:
步骤A:生成程序切片,本发明基于软件的源代码,利用Joern工具生成源代码对应的程序依赖图PDG和抽象语法树AST,程序依赖图PDG包含代码间的控制依赖图CDG和数据依赖图DDG,抽象语法树AST包含程序语句间的语法信息;基于控制依赖图CDG和数据依赖图DDG中的控制依赖信息和数据依赖信息,基于漏洞规则对代码进行切片,最终得到想要的程序切片;
步骤B:生成代码的符号表征,将步骤A得到的原始程序切片进行数据清洗和格式化处理,即对代码块中出现的除关键字和操作符以外的标识符,如用户定义的函数名和变量名,按照自定义命名规则进行重新命名,将处理过的代码块中的每一行代码语句转化为由单个字符组成的有序子集,得到代码符号表征;
步骤C:对标准Bert模型进行微调,基于标准Bert模型,将步骤B得到的代码符号表征作为Bert模型的训练集,再把训练集中的数据逐条转化为Bert模型输入要求的数据格式,并将其输入标准Bert模型进行模型微调,通过微调可得到更适应本地数据集的新的Bert模型;
步骤D:生成代码表征对应的向量表征,使用步骤C中微调得到的新的Bert模型对步骤B中得到的代码表征集进行预训练,将其转化为具有丰富语义信息及上下文关系的向量表征集,用于后续输入神经网络进行模型训练;
步骤E:训练软件源代码漏洞检测模型,设计双层BiLSTM网络,并将步骤D中由Bert模型预训练得到的词向量作为其训练数据,得到基于软件源代码的漏洞检测模型。
其中步骤A进一步包括:
A1:使用公开的Joern工具构建程序依赖图和抽象语法树,基于漏洞语法规则,在抽象语法树中寻找与漏洞语法规则相匹配的代码语句,构建有序的代码语句集合;
A2:基于程序依赖图中的控制依赖信息和数据依赖信息,对有序的代码语句集合进行切片,得到切片级代码块,将代码块与现存的漏洞库中的漏洞代码块进行匹配对比,对包含漏洞特征的代码块,用标签1表示,对不包含漏洞特征的代码块用标签0表示。
其中步骤B进一步包括:
B1:所述代码块清洗过程表示为:得到的带有标签的代码块由有序的多行代码语句组成;针对每行代码语句,删除不存在造成漏洞的无关字符串信息、代码注释和非ASCII字符,同时保留引号和括号这类具有语法信息的符号,保留分号以区分每行代码;
B2:所述代码块格式化过程表示为:代码块中用户自定义的变量名被按顺序重新命名为 VAR1、VAR2,用户自定义的函数名被按顺序重新命名为FUN1、FUN2;其中VAR和FUN用于区分函数和变量,1和2表示该变量或函数在代码块中的次序;这些映射都是以一对一的方式执行的;每个代码块的命名替换完成后,都会对函数和变量索引重新计数,因此当多个变量和函数出现在不同的代码块中时,它们可能被映射为相同的符号名。
其中步骤C进一步包括:
C1:所述将训练集转化为Bert模型输入的格式表示为:首先,读取得到的代码块,以分号为界,将多行代码组成单行列表,得到格式为Text, Label的数据集,其中Text表示代码集合,Label表示对应代码集合的标签;其次,采用Bert自带的vocab.txt词表对Text进行词嵌入,将代码块表示成单个字符的集合,生成Text的词嵌入表示,即Tokens数组,其中每条数据对应的Tokens数组以[CLS]作为文本开头标识,以[SEP]作为结尾表示;
C2:定义一个Tokens数组中字符被标记后序列的最大长度max_seq_length,再将得到的Tokens数组中的每个字符映射为对应的id,生成input_ids数组;input_ids中每个字符被唯一的id替换,如[CLS]被替换为101;同时基于Tokens数组得到其对应的长度为max_seq_length的segment_ids数组。最终生成的input_ids、segment_ids将作为Bert模型的输入,用于Bert模型的微调。
其中步骤D进一步包括:
D1:所述向量表征集即为将代码表征集转化为Bert模型输入要求的格式input_ids,segment_ids,再将其输入步骤C得到的微调后的Bert模型,Bert模型对输入信息进行编码,得到原始代码表征对应的词向量数据,作为BiLSTM深度学习网络的输入。
其中步骤E进一步包括:取20%的训练数据对所述漏洞检测模型进行测试,以检测准确率和训练损失作为评价指标,评价模型的检测性能。
本发明在得到代码切片之后,首先对切片进行数据清洗和格式化处理,其次使用Bert模型自带的词袋和词嵌入技术对代码切片进行字符编码和字符位置编码,得到字符映射数组和位置映射数组,再使用微调后的Bert模型以无监督的方式学习代码切片间的上下文关系、语义关系和位置关系,生成具有语义信息的向量,再将向量作为BiLSTM模型的输入,进行模型训练。由于本发明在代码切片的词向量转化过程中很好的保留了代码语句的语义信息和上下文关系,并引入了位置编码,因此,本发明提出的方法有效提高了源代码检测模型的准确率,降低误报率。
附图说明
图1为本发明所提源代码漏洞检测模型的训练流程图;
图2为本发明基于深度学习的源代码漏洞检测模型的***架构图;
图3为本发明源代码程序切片提取及处理过程示意图;
图4为本发明Bert模型对代码切片的词向量转化过程示意图。
具体实施方式
下面结合具体实施方式对本发明进一步说明。
一种基于Bert(Bidirectional Encoder Representations from Transformers)模型与双向长短期记忆网络BiLSTM(Bi-directional Long Short-Term Memory)的C源代码漏洞检测方法,主要包含以下步骤:
步骤A:生成程序切片,本发明基于软件的源代码,利用Joern工具生成源代码对应的程序依赖图PDG(Program Dependence Graph)和抽象语法树AST(Abstract SyntaxTree),PDG包含代码间的控制依赖图CDG(Control Dependence Graph)和数据依赖图DDG(Data Dependence Graph),AST包含程序语句间的语法信息;基于控制依赖图CDG和数据依赖图DDG中的控制依赖信息和数据依赖信息,基于漏洞规则对代码进行切片,最终得到想要的程序切片。
步骤B:生成代码的符号表征,将步骤A得到的原始程序切片进行数据清洗和格式化处理,即对代码块中出现的除关键字(如int,char等)和操作符(如+,*,%等)以外的标识符,如用户定义的函数名和变量名,按照自定义命名规则进行重新命名,将处理过的代码块中的每一行代码语句转化为由单个字符组成的有序子集,得到代码符号表征。
步骤C:对标准Bert模型进行微调,基于标准Bert模型,将步骤B得到的代码符号表征作为Bert模型的训练集,再把训练集中的数据逐条转化为Bert模型输入要求的数据格式,并将其输入标准Bert模型进行模型微调,通过微调可得到更适应本地数据集的新的Bert模型;
步骤D:生成代码表征对应的向量表征,使用步骤C中微调得到的新的Bert模型对步骤B中得到的代码表征集进行预训练,将其转化为具有丰富语义信息及上下文关系的向量表征集,用于后续输入神经网络进行模型训练;
步骤E:训练软件源代码漏洞检测模型,设计双层BiLSTM网络,并将步骤D中由Bert模型预训练得到的词向量作为其训练数据,得到基于软件源代码的漏洞检测模型。
下面将基于CWE-399(资源管理错误漏洞)和CWE-119(缓冲区溢出漏洞)详细介绍本发明的实现步骤,主要从代码块的生成、代码数据的编码映射及Bert模型的微调、词向量转化及模型训练这几个方面详细介绍。图1主要介绍了本发明所提的源代码漏洞检测模型的构建流程,图2主要介绍了本发明所提漏洞检测模型的架构及使用原理。
1、得到训练数据集(带有标签的代码块)。
步骤1-1:生成源代码的程序依赖图和抽象语法树。使用Joern工具解析得到软件源代码对应的程序依赖图PDG和抽象语法树AST,其中程序依赖图PDG包含代码语句的数据依赖图DDG和控制依赖图CDG,抽象语法树AST包含程序语句间的语法信息。
步骤1-2:生成代码块。基于漏洞语法规则(API函数调用,数组、指针、表达式的定义与使用)在抽象语法树中寻找与漏洞语法规则相匹配的代码语句,如图3中(a)和(b)所示,在源代码中找到与漏洞语法规则匹配的API调用函数strncpy(b,a,n),并基于程序依赖图中的控制依赖和数据依赖关系,向前向后切取可能具有漏洞语义信息的代码语句,组成图3中(c)所示的代码块。将代码块与现存漏洞库中的漏洞代码块进行匹配对比,对包含漏洞特征的代码块,用标签1表示,对不包含漏洞特征的代码块用标签0表示,以用于后续输入神经网络进行有监督分类,训练漏洞检测模型。
2、对得到的代码块进行数据清洗和格式化操作。
步骤2-1:所述代码块清洗过程表示为:得到的带有标签的代码块由有序的多行代码语句组成。针对每行代码语句,删除不存在造成漏洞的无关字符串信息、代码注释和非ASCII字符等,同时保留引号和括号这类具有语法信息的符号,保留分号以区分每行代码(C,C++中每行代码均以分号结尾)。
步骤2-2:所述代码块格式化过程表示为:代码块中用户自定义的变量名被按顺序重新命名为 “VAR1”、“VAR2”等。用户自定义的函数名被按顺序重新命名为“FUN1”、“FUN2”等。其中“VAR”和“FUN”用于区分函数和变量,“1”和“2”表示该变量或函数在代码块中的次序。如图3中(c)所示,a[10]、b[10]和n被依次重命名为VAR1[10]、VAR2[10]和VAR3,函数调用strncpy (b, a, n)被重新命名为FUN1(VAR1, VAR2, VAR3),这些映射都是以一对一的方式执行的。每个代码块的命名替换完成后,都会对函数和变量索引重新计数,因此当多个变量和函数出现在不同的代码块中时,它们可能被映射为相同的符号名。
3、使用Bert模型对训练数据集进行预训练,生成向量表示。
步骤3-1:基于我们的数据集对Bert模型进行微调,以使得模型更适应我们的数据。首先,将训练集转化为Bert模型输入的格式,代码读取得到的代码块,以分号为界,将多行代码组成单行列表,得到格式为(Text, Label)的数据集,其中Text表示代码集合,Label表示对应代码集合的标签。其次,采用Bert自带的vocab.txt词表对Text进行词嵌入,将代码块表示成单个字符的集合,生成Text的词嵌入表示,即Tokens数组。如图4所示,其中每条数据对应的Tokens数组以[CLS]作为文本开头标识,以[SEP]作为结尾表示。定义一个Tokens数组中字符被标记后序列的最大长度max_seq_length,再将得到的Tokens数组中的每个字符映射为对应的id,生成input_ids数组,若序列长度大于max_seq_length,则只保留长度为max_seq_length大小的序列,否则用max_seq_length-len (input_ids)个0补齐序列,input_ids中每个字符被唯一的id替换,如[CLS]被替换为“101”。同时基于Tokens数组得到其对应的长度为max_seq_length的segment_ids数组,其中segment_ids的作用是使用Embedding的信息对文本中每句话的位置进行区分,本发明使用segment_ids标记每个字符在每行代码语句中的位置信息。最终生成的input_ids、segment_ids将作为Bert模型的输入用于Bert模型的微调,得到新的Bert模型。
步骤3-2:如图4所示,与步骤3-1同理,先将训练集转化为Bert模型输入需要的格式(input_ids、segment_ids),并将其输入微调后的Bert模型,通过编码得到原始代码表征对应的词向量数据。Bert模型采用transformer特征提取技术和self attantion 技术学习文本的上下文关系和语义信息。另外,Bert模型的输入数据segment_ids表示单个语句的位置信息,一般情况下,同一字符在不同语句中可能表示不同的语义与语法信息,因此对不同位置出现的同一字符给予不同的向量表示,最大化保留了代码语句的上下文关系和语法信息,避免了漏洞检测模型训练过程中代码语义信息和代码结构的信息缺失,从而有效提高了漏洞检测模型的准确率。
4、使用改进后的BiLSTM模型实现软件源代码漏洞检测模型。
步骤4-1:将步骤3-2中由Bert模型预训练得到的词向量作为改进后的BiLSTM深度学习网络的训练数据,训练得到基于软件源代码的漏洞检测模型。由于Bert词向量训练网络模型已具备一定的分类能力,因此无需后接太过复杂的网络模型。本发明设计了一个由单个单层BiLSTM模型。其中,损失函数为binary_crossentropy,优化函数为Adamax,学习率为0.0001,输入神经元个数为128(由于Bert输出向量维度为768,因此在输入前需要对输入向量进行重塑维度)。模型训练完成之后,取20%的训练数据对漏洞检测模型进行测试,以检测准确率,训练损失作为指标,评价模型的检测性能。
参阅表1,在cwe399和cwe119漏洞数据集上进行实验,结果表明本发明使用Bert模型对得到的函数级别的代码块进行预训练,可以有效学习并保留源代码的语义信息和上下文关系,相比于使用word2vec词向量转化技术,本发明可以保证训练得到的检测模型具有较高的检测准确率。
表1在CWE-399和CWE-119漏洞数据集上的模型分类准确率和模型训练损失
Claims (6)
1.一种基于Bert模型与BiLSTM的C源代码漏洞检测方法,其特征在于:主要包含以下步骤:
步骤A:生成程序切片,本发明基于软件的源代码,利用Joern工具生成源代码对应的程序依赖图PDG和抽象语法树AST,程序依赖图PDG包含代码间的控制依赖图CDG和数据依赖图DDG,抽象语法树AST包含程序语句间的语法信息;基于控制依赖图CDG和数据依赖图DDG中的控制依赖信息和数据依赖信息,基于漏洞规则对代码进行切片,最终得到想要的程序切片;
步骤B:生成代码的符号表征,将步骤A得到的原始程序切片进行数据清洗和格式化处理,即对代码块中出现的除关键字和操作符以外的标识符,如用户定义的函数名和变量名,按照自定义命名规则进行重新命名,将处理过的代码块中的每一行代码语句转化为由单个字符组成的有序子集,得到代码符号表征;
步骤C:对标准Bert模型进行微调,基于标准Bert模型,将步骤B得到的代码符号表征作为Bert模型的训练集,再把训练集中的数据逐条转化为Bert模型输入要求的数据格式,并将其输入标准Bert模型进行模型微调,通过微调可得到更适应本地数据集的新的Bert模型;
步骤D:生成代码表征对应的向量表征,使用步骤C中微调得到的新的Bert模型对步骤B中得到的代码表征集进行预训练,将其转化为具有丰富语义信息及上下文关系的向量表征集,用于后续输入神经网络进行模型训练;
步骤E:训练软件源代码漏洞检测模型,设计双层BiLSTM网络,并将步骤D中由Bert模型预训练得到的词向量作为其训练数据,得到基于软件源代码的漏洞检测模型。
2.根据权利要求1所述的一种基于Bert模型与BiLSTM的C源代码漏洞检测方法,其特征在于,其中步骤A进一步包括:
A1:使用公开的Joern工具构建程序依赖图和抽象语法树,基于漏洞语法规则在抽象语法树中寻找与漏洞语法规则相匹配的代码语句,构建有序的代码语句集合;
A2:基于程序依赖图中的控制依赖信息和数据依赖信息,对有序的代码语句集合进行切片,得到切片级代码块,将代码块与现存的漏洞库中的漏洞代码块进行匹配对比,对包含漏洞特征的代码块,用标签1表示,对不包含漏洞特征的代码块用标签0表示。
3.根据权利要求1所述的一种基于Bert模型与BiLSTM的C源代码漏洞检测方法,其特征在于,其中步骤B进一步包括:
B1:所述代码块清洗过程表示为:得到的带有标签的代码块由有序的多行代码语句组成;针对每行代码语句,删除不存在造成漏洞的无关字符串信息、代码注释和非ASCII字符,同时保留引号和括号这类具有语法信息的符号,保留分号以区分每行代码;
B2:所述代码块格式化过程表示为:代码块中用户自定义的变量名被按顺序重新命名为 VAR1、VAR2,用户自定义的函数名被按顺序重新命名为FUN1、FUN2;其中VAR和FUN用于区分函数和变量,1和2表示该变量或函数在代码块中的次序;这些映射都是以一对一的方式执行的;每个代码块的命名替换完成后,都会对函数和变量索引重新计数,因此当多个变量和函数出现在不同的代码块中时,它们可能被映射为相同的符号名。
4.根据权利要求1所述的一种基于Bert模型与BiLSTM的C源代码漏洞检测方法,其特征在于,其中步骤C进一步包括:
C1:所述将训练集转化为Bert模型输入的格式表示为:首先,读取得到的代码块,以分号为界,将多行代码组成单行列表,得到格式为Text, Label的数据集,其中Text表示代码集合,Label表示对应代码集合的标签;其次,采用Bert自带的vocab.txt词表对Text进行词嵌入,将代码块表示成单个字符的集合,生成Text的词嵌入表示,即Tokens数组,其中每条数据对应的Tokens数组以[CLS]作为文本开头标识,以[SEP]作为结尾表示;
C2:定义一个Tokens数组中字符被标记后序列的最大长度max_seq_length,再将得到的Tokens数组中的每个字符映射为对应的id,生成input_ids数组;input_ids中每个字符被唯一的id替换,如[CLS]被替换为101;同时基于Tokens数组得到其对应的长度为max_seq_length的segment_ids数组;最终生成的input_ids、segment_ids将作为Bert模型的输入,用于Bert模型的微调。
5.根据权利要求1所述的一种基于Bert模型与BiLSTM的C源代码漏洞检测方法,其特征在于,其中步骤D进一步包括:
D1:所述向量表征集即为将代码表征集转化为Bert模型输入要求的格式input_ids,segment_ids,再将其输入步骤C得到的微调后的Bert模型,Bert模型对输入信息进行编码,得到原始代码表征对应的词向量数据,作为BiLSTM深度学习网络的输入。
6.根据权利要求1所述的一种基于Bert模型与BiLSTM的C源代码漏洞检测方法,其特征在于,其中步骤E进一步包括:取20%的训练数据对所述漏洞检测模型进行测试,以检测准确率和训练损失作为评价指标,评价模型的检测性能。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110770650.4A CN113420296B (zh) | 2021-07-08 | 2021-07-08 | 一种基于Bert模型与BiLSTM的C源代码漏洞检测方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110770650.4A CN113420296B (zh) | 2021-07-08 | 2021-07-08 | 一种基于Bert模型与BiLSTM的C源代码漏洞检测方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113420296A true CN113420296A (zh) | 2021-09-21 |
CN113420296B CN113420296B (zh) | 2022-05-13 |
Family
ID=77720560
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110770650.4A Active CN113420296B (zh) | 2021-07-08 | 2021-07-08 | 一种基于Bert模型与BiLSTM的C源代码漏洞检测方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113420296B (zh) |
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113806750A (zh) * | 2021-09-24 | 2021-12-17 | 深信服科技股份有限公司 | 文件安全风险检测方法、模型的训练方法、装置和设备 |
CN113986345A (zh) * | 2021-11-01 | 2022-01-28 | 天津大学 | 一种预训练增强的代码克隆检测方法 |
CN114491540A (zh) * | 2022-02-22 | 2022-05-13 | 南通大学 | 一种基于GraphCodeBERT的安全漏洞检测方法 |
CN114547619A (zh) * | 2022-01-11 | 2022-05-27 | 扬州大学 | 一种基于树的漏洞修复***及修复方法 |
CN114861194A (zh) * | 2022-05-13 | 2022-08-05 | 兰州交通大学 | 一种基于bgru与cnn融合模型的多类型漏洞检测方法 |
CN115495755A (zh) * | 2022-11-15 | 2022-12-20 | 四川大学 | 一种基于CodeBERT和R-GCN的源代码漏洞多分类检测的方法 |
CN115563626A (zh) * | 2022-10-21 | 2023-01-03 | 四川大学 | 一种面向cve的漏洞可利用性预测方法 |
CN116048615A (zh) * | 2023-01-31 | 2023-05-02 | 安徽工业大学 | 基于自然语言处理的分布式程序切片方法、装置及设备 |
CN116661852A (zh) * | 2023-04-06 | 2023-08-29 | 华中师范大学 | 一种基于程序依赖图的代码搜索方法 |
CN117786705A (zh) * | 2024-02-28 | 2024-03-29 | 南京信息工程大学 | 一种基于异构图变换网络的语句级漏洞检测方法及*** |
Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101510241A (zh) * | 2009-03-12 | 2009-08-19 | 南京大学 | 整形溢出漏洞的二进制检测定位装置 |
CN101714118A (zh) * | 2009-11-20 | 2010-05-26 | 北京邮电大学 | 一种二进制代码缓冲区溢出漏洞的检测器及其检测方法 |
CN110245496A (zh) * | 2019-05-27 | 2019-09-17 | 华中科技大学 | 一种源代码漏洞检测方法及检测器和其训练方法及*** |
CN111026548A (zh) * | 2019-11-28 | 2020-04-17 | 国网甘肃省电力公司电力科学研究院 | 一种逆向深度强化学习的电力通信设备测试资源调度方法 |
CN111401061A (zh) * | 2020-03-19 | 2020-07-10 | 昆明理工大学 | 基于BERT及BiLSTM-Attention的涉案新闻观点句识别方法 |
CN111460820A (zh) * | 2020-03-06 | 2020-07-28 | 中国科学院信息工程研究所 | 一种基于预训练模型bert的网络空间安全领域命名实体识别方法和装置 |
CN111540470A (zh) * | 2020-04-20 | 2020-08-14 | 北京世相科技文化有限公司 | 一种基于bert迁移学习的社交网络抑郁倾向检测模型及其训练方法 |
CN112131352A (zh) * | 2020-10-10 | 2020-12-25 | 南京工业大学 | 一种网页文本类不良信息的检测方法与检测*** |
CN112668013A (zh) * | 2020-12-31 | 2021-04-16 | 西安电子科技大学 | 一种面向Java源码的语句级模式探索的漏洞检测方法 |
US20210174923A1 (en) * | 2019-12-06 | 2021-06-10 | Ankon Technologies Co., Ltd | Method, device and medium for structuring capsule endoscopy report text |
CN112989811A (zh) * | 2021-03-01 | 2021-06-18 | 哈尔滨工业大学 | 一种基于BiLSTM-CRF的历史典籍阅读辅助***及其控制方法 |
-
2021
- 2021-07-08 CN CN202110770650.4A patent/CN113420296B/zh active Active
Patent Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101510241A (zh) * | 2009-03-12 | 2009-08-19 | 南京大学 | 整形溢出漏洞的二进制检测定位装置 |
CN101714118A (zh) * | 2009-11-20 | 2010-05-26 | 北京邮电大学 | 一种二进制代码缓冲区溢出漏洞的检测器及其检测方法 |
CN110245496A (zh) * | 2019-05-27 | 2019-09-17 | 华中科技大学 | 一种源代码漏洞检测方法及检测器和其训练方法及*** |
CN111026548A (zh) * | 2019-11-28 | 2020-04-17 | 国网甘肃省电力公司电力科学研究院 | 一种逆向深度强化学习的电力通信设备测试资源调度方法 |
US20210174923A1 (en) * | 2019-12-06 | 2021-06-10 | Ankon Technologies Co., Ltd | Method, device and medium for structuring capsule endoscopy report text |
CN111460820A (zh) * | 2020-03-06 | 2020-07-28 | 中国科学院信息工程研究所 | 一种基于预训练模型bert的网络空间安全领域命名实体识别方法和装置 |
CN111401061A (zh) * | 2020-03-19 | 2020-07-10 | 昆明理工大学 | 基于BERT及BiLSTM-Attention的涉案新闻观点句识别方法 |
CN111540470A (zh) * | 2020-04-20 | 2020-08-14 | 北京世相科技文化有限公司 | 一种基于bert迁移学习的社交网络抑郁倾向检测模型及其训练方法 |
CN112131352A (zh) * | 2020-10-10 | 2020-12-25 | 南京工业大学 | 一种网页文本类不良信息的检测方法与检测*** |
CN112668013A (zh) * | 2020-12-31 | 2021-04-16 | 西安电子科技大学 | 一种面向Java源码的语句级模式探索的漏洞检测方法 |
CN112989811A (zh) * | 2021-03-01 | 2021-06-18 | 哈尔滨工业大学 | 一种基于BiLSTM-CRF的历史典籍阅读辅助***及其控制方法 |
Non-Patent Citations (4)
Title |
---|
WENTAO ZHANG等: "A BERT-BiLSTM-CRF model for Chinese electronic medical records named entity recognition", 《网页在线公开:HTTPS://IEEEXPLORE.IEEE.ORG/STAMP/STAMP.JSP?TP=&ARNUMBER=9017143》 * |
张媛: "基于污染源追踪的PHP源代码漏洞检测方法研究", 《环境科学与管理》 * |
张驯等: "基于内核检测的数据库漏洞扫描器的设计与实现", 《电力信息与通信技术》 * |
李珍等: "面向源代码的软件漏洞静态检测综述", 《网络与信息安全学报》 * |
Cited By (19)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113806750B (zh) * | 2021-09-24 | 2024-02-23 | 深信服科技股份有限公司 | 文件安全风险检测方法、模型的训练方法、装置和设备 |
CN113806750A (zh) * | 2021-09-24 | 2021-12-17 | 深信服科技股份有限公司 | 文件安全风险检测方法、模型的训练方法、装置和设备 |
CN113986345B (zh) * | 2021-11-01 | 2024-05-07 | 天津大学 | 一种预训练增强的代码克隆检测方法 |
CN113986345A (zh) * | 2021-11-01 | 2022-01-28 | 天津大学 | 一种预训练增强的代码克隆检测方法 |
CN114547619A (zh) * | 2022-01-11 | 2022-05-27 | 扬州大学 | 一种基于树的漏洞修复***及修复方法 |
CN114547619B (zh) * | 2022-01-11 | 2024-04-19 | 扬州大学 | 一种基于树的漏洞修复***及修复方法 |
CN114491540A (zh) * | 2022-02-22 | 2022-05-13 | 南通大学 | 一种基于GraphCodeBERT的安全漏洞检测方法 |
CN114861194A (zh) * | 2022-05-13 | 2022-08-05 | 兰州交通大学 | 一种基于bgru与cnn融合模型的多类型漏洞检测方法 |
CN114861194B (zh) * | 2022-05-13 | 2024-03-08 | 兰州交通大学 | 一种基于bgru与cnn融合模型的多类型漏洞检测方法 |
CN115563626A (zh) * | 2022-10-21 | 2023-01-03 | 四川大学 | 一种面向cve的漏洞可利用性预测方法 |
CN115563626B (zh) * | 2022-10-21 | 2023-08-22 | 四川大学 | 一种面向cve的漏洞可利用性预测方法 |
CN115495755B (zh) * | 2022-11-15 | 2023-04-07 | 四川大学 | 一种基于CodeBERT和R-GCN的源代码漏洞多分类检测的方法 |
CN115495755A (zh) * | 2022-11-15 | 2022-12-20 | 四川大学 | 一种基于CodeBERT和R-GCN的源代码漏洞多分类检测的方法 |
CN116048615A (zh) * | 2023-01-31 | 2023-05-02 | 安徽工业大学 | 基于自然语言处理的分布式程序切片方法、装置及设备 |
CN116048615B (zh) * | 2023-01-31 | 2023-08-25 | 安徽工业大学 | 基于自然语言处理的分布式程序切片方法、装置及设备 |
CN116661852B (zh) * | 2023-04-06 | 2023-12-08 | 华中师范大学 | 一种基于程序依赖图的代码搜索方法 |
CN116661852A (zh) * | 2023-04-06 | 2023-08-29 | 华中师范大学 | 一种基于程序依赖图的代码搜索方法 |
CN117786705A (zh) * | 2024-02-28 | 2024-03-29 | 南京信息工程大学 | 一种基于异构图变换网络的语句级漏洞检测方法及*** |
CN117786705B (zh) * | 2024-02-28 | 2024-05-14 | 南京信息工程大学 | 一种基于异构图变换网络的语句级漏洞检测方法及*** |
Also Published As
Publication number | Publication date |
---|---|
CN113420296B (zh) | 2022-05-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN113420296B (zh) | 一种基于Bert模型与BiLSTM的C源代码漏洞检测方法 | |
CN111177394B (zh) | 基于句法注意力神经网络的知识图谱关系数据分类方法 | |
CN112215013B (zh) | 一种基于深度学习的克隆代码语义检测方法 | |
CN116627708B (zh) | 存储故障分析***及其方法 | |
CN116245513B (zh) | 基于规则库的自动化运维***及其方法 | |
CN101751385B (zh) | 一种采用层次管道过滤器体系结构的多语言信息抽取方法 | |
CN112306494A (zh) | 一种基于卷积和循环神经网络的代码分类及聚类方法 | |
CN113761893B (zh) | 一种基于模式预训练的关系抽取方法 | |
CN112394973B (zh) | 一种基于伪孪生网络的多语言代码剽窃检测方法 | |
CN113947161A (zh) | 一种基于注意力机制的多标签文本分类方法及*** | |
CN116661852B (zh) | 一种基于程序依赖图的代码搜索方法 | |
CN111967267A (zh) | 一种基于XLNet的新闻文本地域提取的方法及*** | |
CN115437952A (zh) | 一种基于深度学习的语句级软件缺陷检测方法 | |
CN110866172B (zh) | 一种面向区块链***的数据分析方法 | |
CN116340952A (zh) | 一种基于操作码程序依赖图的智能合约漏洞检测方法 | |
CN115757695A (zh) | 一种日志语言模型训练方法及*** | |
CN116702160B (zh) | 一种基于数据依赖增强程序切片的源代码漏洞检测方法 | |
CN116956289B (zh) | 动态调整潜在黑名单和黑名单的方法 | |
CN113704473A (zh) | 基于长文本特征提取优化的媒体假新闻检测方法及*** | |
CN116643759A (zh) | 一种基于程序依赖图预测的代码预训练模型训练方法 | |
CN111199152A (zh) | 一种基于标签注意力机制的命名实体识别方法 | |
CN114065210A (zh) | 一种基于改进的时间卷积网络的漏洞检测方法 | |
CN112256838B (zh) | 相似域名查找方法、装置及电子设备 | |
CN117349186B (zh) | 一种基于语义流图的程序语言缺陷定位方法、***及介质 | |
CN117787252A (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 |