CN117828615A - 一种基于生成对抗网络的程序漏洞自动修复方法 - Google Patents
一种基于生成对抗网络的程序漏洞自动修复方法 Download PDFInfo
- Publication number
- CN117828615A CN117828615A CN202410030910.8A CN202410030910A CN117828615A CN 117828615 A CN117828615 A CN 117828615A CN 202410030910 A CN202410030910 A CN 202410030910A CN 117828615 A CN117828615 A CN 117828615A
- Authority
- CN
- China
- Prior art keywords
- code
- training
- generator
- data set
- bug
- 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
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; 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 OR CALCULATING; 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
- G06N3/0442—Recurrent networks, e.g. Hopfield networks characterised by memory or gating, e.g. long short-term memory [LSTM] or gated recurrent units [GRU]
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; 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/045—Combinations of networks
- G06N3/0455—Auto-encoder networks; Encoder-decoder networks
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; 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/0464—Convolutional networks [CNN, ConvNet]
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; 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/0475—Generative networks
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; 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
- G06N3/094—Adversarial learning
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Physics & Mathematics (AREA)
- Computing Systems (AREA)
- General Health & Medical Sciences (AREA)
- Artificial Intelligence (AREA)
- Evolutionary Computation (AREA)
- Computational Linguistics (AREA)
- Molecular Biology (AREA)
- Biophysics (AREA)
- Biomedical Technology (AREA)
- Data Mining & Analysis (AREA)
- Mathematical Physics (AREA)
- Life Sciences & Earth Sciences (AREA)
- Health & Medical Sciences (AREA)
- Computer Hardware Design (AREA)
- Computer Security & Cryptography (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开了一种基于生成对抗网络的程序漏洞自动修复方法,属于计算机技术领域。本方法通过构建原始数据集,并扩展为用于预训练的扩充数据集;利用扩充数据集对基于编解码器的生成模型进行自编码预训练;获取漏洞修复代码对数据集,在自编码预训练得到的生成模型的基础上构造生成对抗网络,利用漏洞修复代码对数据集对该生成对抗网络进行交替迭代训练,训练完成后得到漏洞修复模型;利用漏洞修复模型完成实际代码漏洞修复任务。本发明可以提高开发人员在实际修复代码漏洞时的效率和准确度,进而加速漏洞修复过程。
Description
技术领域
本发明属于计算机技术领域,涉及一种基于生成对抗网络的程序漏洞自动修复方法。
背景技术
软件程序中的安全漏洞对计算机系统构成严重威胁。恶意用户可以通过这些漏洞破坏程序,迫使程序以不良方式运行(如崩溃、暴露用户敏感信息等)。每年都有成千上万个这样的漏洞被公开报告给公共漏洞和暴露数据库(CVE,Common Vulnerabilities andExposures),还有更多的漏洞是在内部专有代码中发现并修复的。这些漏洞通常是由程序员的错误造成的,由于开放源代码软件的盛行和代码的重复使用,这些漏洞得以迅速传播。因此,如何有效帮助开发人员修复代码中出现的漏洞变得尤为重要,而自动程序修复(APR,Automated Program Repair)正是提供了这样的支持,它只需较少的人工投入即可为错误程序生成补丁,从而提高软件可靠性并降低软件开发成本。
随着深度学习(DL)的快速发展,最近基于学习的APR技术利用先进的DL技术,通过从现有代码库中学习生成补丁。基于DL的APR通常将程序漏洞修复问题表述为从给定存在漏洞的代码到良好代码的翻译,并采用神经机器翻译(NMT)技术。它们通常采用编码器-解码器架构,其中编码器首先嵌入漏洞代码,而解码器则迭代生成补丁序列,然后根据测试用例对生成的补丁进行验证。然而,在该方法中,模型更多的是从生成补丁和给定目标补丁在词元(token)级别的对比中学习到一对一的映射方式,即一个漏洞代码到其给定标准修复代码之间的修复方法,但实际上,漏洞代码和对应修复代码之间的映射并不是一对一而是一对多甚至说多对多的,它更类似于两片域之间的映射,因为一个漏洞代码往往有多种不同的修复方法,同样的不同漏洞代码的修复方式可能相同。在这种情况下,根据一对一修复模式设计并训练得到的漏洞修复模型的修复能力被限制,在面对现实世界中各类复杂漏洞代码时的表现往往不尽人意。
发明内容
本发明的目的在于为了解决现有漏洞修复技术主要针对一对一的修复模式进行训练从而造成模型修复能力受限的问题,提供一种基于生成对抗网络的程序漏洞自动修复方法,该方法通过结合语义等价代码进行自编码预训练模式和基于生成对抗网络的训练模式,可以准确地修复存在漏洞的程序,提高开发人员进行漏洞修复的效率。
为实现上述目的,本发明采用如下技术方案:
一种基于生成对抗网络的程序漏洞自动修复方法,其步骤包括:
1)构建原始数据集,并扩展为用于预训练的扩充数据集;
2)利用扩充数据集对基于编解码器的生成模型进行自编码预训练,预训练目标是让生成器学习到语义等价代码之间的映射关系,包括从代码空间到特征空间进行特征提取和从特征空间到代码空间进行代码重构;
3)获取漏洞修复代码对数据集,在自编码预训练得到的生成模型的基础上构造生成对抗网络,利用漏洞修复代码对数据集对该生成对抗网络进行交替迭代训练,训练完成后得到漏洞修复模型;
4)利用漏洞修复模型完成实际代码漏洞修复任务。
进一步地,步骤1)中构建原始数据集的步骤包括:下载用于训练大语言模型的开源代码语料The Stack,首先筛选出The Stack中利用Java编程语言进行编写的代码文件,然后过滤掉该代码文件中词元数超过2000个的代码文件,最后从剩余的代码文件中选择基于Java SE 8进行开发的程序,构建原始数据集。
进一步地,步骤1)中扩展为用于预训练的扩充数据集的步骤包括:设计语义等价变换规则,对原始数据集中的每一份代码文件逐条应用语义等价变换规则进行代码变换,获得变换后代码,由每个初始代码和对应的变换后代码组成代码对,由所有的代码对构建扩充数据集。
进一步地,步骤2)中基于编解码器的生成模型包括编码器、解码器以及指针网络模块,其中编码器由一个词嵌入层和一个双向LSTM层组成,解码器由一个词嵌入层和一个LSTM层组成;对于扩充数据集中的每一对代码对其中为初始代码,为变换后代码,以作为生成模型的输入,以作为生成模型的输出,损失函数的设置如下:
其中,θG表示生成模型G的参数,N表示扩充数据集所包含的数据对数量,Δ表示交叉熵损失函数。
进一步地,步骤3)中漏洞修复代码对数据集包含由漏洞代码cv和对应修复后代码cf组成的代码对。
进一步地,步骤3)中在自编码预训练得到的生成模型的基础上构造生成对抗网络是指,将两个基于编解码器的生成模型作为两个生成器Gv和Gf,生成器Gv负责向良好代码引入漏洞,生成器Gf负责修复漏洞代码;在此基础上增加两个判别器Dv和Df,每个判别器是由一个卷积网络层和一个全连接层组成,判别器Dv负责分辨漏洞代码的来源是生成器Gv生成的还是来自于漏洞修复代码对数据集,判别器Df负责分辨良好代码的来源是生成器Gf生成的还是来自于漏洞修复代码对数据集。
进一步地,步骤3)中利用漏洞修复代码对数据集对该生成对抗网络进行交替迭代训练包括以下步骤:
将漏洞修复代码对数据集中每个代码对<cv,cf>输入到生成对抗网络中进行以下生成操作;
向生成器Gv输入修复后代码cf得到合成漏洞代码Gv(cf),设置标签为1,并给代码cv设置标签为0,得到两组新的带标签的数据<cv,0>和<Gv(cf),1>,构建成数据集
向生成器Gf输入漏洞代码cv得到合成良好代码Gf(cv),设置标签为1,并给代码cf设置标签为0,得到两组新的带标签的数据<cf,0>和<Gf(cv),1>,构建成数据集
利用数据集训练判别器Dv,利用数据集训练判别器Df,对判别器重复训练若干次后停止训练;
向生成器Gv输入修复后代码cf,向生成器Gf输入漏洞代码cv,对这两个生成器进行训练,采用SeqGAN的更新策略,在生成器逐步生成词元并最终得到完整序列的过程中计算动作奖励值;
根据计算的动作奖励值在固定判别器的参数不变的情况下更新生成器的参数,对生成器重复训练若干次后停止训练;
上述对生成器和判别器的训练停止后,完成第一轮完整训练;在第二轮完整训练中,利用更新后的生成器Gv和Gf从漏洞修复代码对数据集中重新生成分别用于判别器Dv和Df训练的数据集和按照与第一轮相同的步骤训练判别器和生成器;如此重复多轮完整训练,直至当判别器Df的准确率与50%相差不超过设定值ε或完整训练轮次达到设定值S时,停止整个训练过程。
进一步地,步骤3)中计算动作奖励值的式子如下:
其中,表示当生成器为G,判别器为D,当前状态为s并采取动作a时获得的动作奖励值,Y1:t-1表示在生成器在第t步时已经生成的共t-1个词元组成的部分序列,并有完整序列Y1:T=G(x),x表示生成器的输入,T表示生成器总步数,yt表示第t步时生成的词元,并有yt∈V,V表示一个有限大小的词表,N表示蒙特卡洛搜索的次数,表示蒙特卡洛搜索的第n个结果,并有表示利用生成器G并根据当前已生成的部分序列Y1:t执行N次蒙特卡洛搜索的结果,其中进行蒙特卡洛搜索的生成器和当前正在训练的生成器的设置保持一致;对于生成器Gv,上式中判别器D为Dv,输入x为cf;对于生成器Gf,上式中判别器D为Df,输入x为cv。
进一步地,步骤3)中更新生成器的参数的式子如下:
其中,表示生成器在生成序列的第t步时,根据已生成的部分序列Y1:t-1生成yt(yt∈V)时,通过采样计算得到近似期望值,表示关于生成器的参数θ求导计算梯度。
进一步地,步骤4)中利用漏洞修复模型完成实际代码漏洞修复任务包括以下步骤:给漏洞修复模型输入待修复的漏洞代码并在其中标注存在漏洞的代码行,该漏洞修复模型自动进行特征提取后输出修复补丁,并对原代码行进行替换后得到修复后代码,如果待修复的代码中有多行存在漏洞,则进行单行迭代修复直到所有漏洞代码行均被修复。
与现有技术相比,本发明具体的优点如下:
1.本发明设计一系列语义等价变换规则并引入预训练模块,通过自编码预训练让模型从语义等价代码的变换中学习到在实际修复中所隐藏的多对多映射的规律。
2.本发明针对多对多映射的修复模式,提出了基于生成对抗网络的程序漏洞自动修复方法,同时利用生成器和判别器之间以及双生成器之间的持续对抗推动模型的性能提升。本发明可以提高开发人员在实际修复代码漏洞时的效率和准确度,进而加速漏洞修复过程。
附图说明
图1是基于生成对抗网络的漏洞修复方法的流程图。
图2是扩充数据集构造方法的流程图。
图3是利用扩充数据集对生成模型进行自编码预训练的流程图。
图4是获取漏洞修复代码对数据集并构造生成对抗网络进行交替迭代训练的流程图。
图5是利用漏洞修复模型对实际待修复的代码进行漏洞修复的流程图。
具体实施方式
为使本发明的上述技术方案中各项技术特征和各项优点或技术效果能更明显易懂,下面结合附图,对本发明做进一步的说明。
本实施例基于生成对抗网络的程序漏洞自动修复方法,其中总体流程如图1所示,主要包括以下步骤:
1)收集良好的代码构建原始数据集Co,并将其扩展为用于预训练的扩充数据集Ca,扩充过程遵守一系列设计好的语义等价变换规则,具体是将规则应用于该数据集中的每一份代码文件,收集成功变换的代码文件与原始代码文件组成代码对从而构建扩充数据集Ca,其中,C为代码(Code)的简称,上标o是源(origin)的简称,上标a是增强(augmentation)的简称,表示原始数据集中第i个代码,表示利用规则rj对原始代码进行变换得到的代码。其具体流程如图2所示,具体说明如下:
1a)下载用于训练大语言模型的开源代码语料The Stack,转到1b)。
1b)首先筛选出其中利用Java编程语言进行编写的代码文件,然后过滤掉其中词元数超过2000个的代码文件,最后选择基于Java SE 8进行开发的代码,构建原始数据集 其中,其中,L表示原始数据集中代码的数量,表示该数据集中的第i个代码文件,转到1c)。
1c)设计语义等价变换规则R={r1,r2,…,rK},其中,R是规则(Rule)的简称,K表示语义等价变换规则的数量,ri表示第i条规则,表1为语义等价规则名称和描述,转到1d)。
表1语义等价规则名称和描述
1d)对于原始数据集Co中的每一份代码文件逐条应用规则rk,k={1,2,…,K},获得相应的变换成功后的代码其中,以为例,表示应用规则ri1(i1∈{1,2,…K})于初始代码后得到的变换后代码,共有l条规则{ri1,ri2,…ril}成功应用,转到1e)。
1e)将转换后代码分别与初始代码进行配对组成代码对从而构建扩充数据集
2)利用扩充数据集Ca作为训练数据集,对基于编解码器的生成模型进行自编码预训练,目的是让生成器能学习到语义等价代码之间的映射关系,包括从代码空间到特征空间进行特征提取和从特征空间到代码空间进行代码重构两个方面。其训练流程如图3所示,具体说明如下:
2a)构建基于编解码器的生成模型G,其主要由编码器Ge和解码器Gd组成,其中,下标e是编码器(encoder)的简称,下标d是解码器(decoder)的简称,编码器由一个词嵌入层和一个双向LSTM层组成,解码器由一个词嵌入层和一个LSTM层组成,除此之外还包含有一个指针网络模块,转到2b)。
2b)对于扩充数据集Ca中的每一对代码对模型的输入是输出为损失函数的设置如下:
其中,是损失(Loss)的简称,下标auto是自编码器(autoencoder)的简称,θG表示生成模型G的参数,N表示的是扩充数据集Ca所包含的数据对数量,Δ表示的是交叉熵损失函数。
3)获取漏洞修复代码对数据集,并在自编码预训练得到的模型的基础上构造生成对抗网络进行交替迭代训练,用于训练生成对抗网络的漏洞修复代码对数据集Cg是指由包含有漏洞代码cv和修复后代码cf的代码对<cv,cf>构成的数据集,其中,g是生成对抗网络(GAN,Generative Adversarial Networks)的简称,上标v是漏洞(vulnerability)的简称,上标f是修复(fix)的简称。生成对抗网络包括两个作为生成器的基于编解码器的生成模型,其结构和初始参数与预训练后得到的生成模型保持一致,其中生成器Gv负责向良好代码引入漏洞,生成器Gf负责修复漏洞代码,同样设置两个判别器,判别器Dv负责分辨漏洞代码的来源是生成器Gv生成还是真实世界即数据集Cg,判别器Df负责分辨良好代码的来源是生成器Gf生成还是真实世界即数据集Cg,其中,G是生成器(Generator)的简称,D是判别器(Discriminator)的简称。在交替迭代训练的过程中,生成器引入漏洞和修复漏洞的能力在判别器分辨能力提升的同时也在互相对抗中得到提升,最后训练在迭代次数达到目标要求或是判别器准确率接近50%时终止。
其训练流程如图4所示,具体说明如下。
3a)从GitHub上下载CURE和Recoder工作整理好的共享可重现错误数据集,其中的对于每个项目中的漏洞都有相应的漏洞版本代码和修复版本代码,转到3b)。
3b)首先过滤掉其中词元数超过2000个的代码文件,然后选择基于Java SE 8进行开发的代码,最后标注出所有筛选后的代码中漏洞行的位置,由于主要针对的是单行漏洞修复问题,所以标注方式是在存在漏洞的代码行首尾分别插入特殊词元”<sos>”和”<eos>”,从而构建用于生成对抗网络训练的数据集其中,M表示该训练数据集中代码对的数量,表示该数据集中的第i个存在漏洞的代码文件,表示该数据集中第i个存在漏洞的代码所对应的修复版本的代码文件,转到3c)。
3c)构造生成对抗网络,设置两个生成器Gv和Gf,均是基于编解码器的生成模型,它们的结构和初始参数与自编码预训练后生成模型G的结构和参数保持一致,同时设置两个判别器Df和Dv,其结构包含一个卷积网络层和一个全连接层,转到3d)。
3d)完整训练次数设置为0,转到3e)。
3e)判断完整训练次数是否达到设定值S,若是,则转到3n),若否,则转到3f)。
3f)判别器训练次数和生成器训练次数均设置为0,转到3g)。
3g)判断该轮完整训练中关于判别器训练的次数是否达到设定值Sd,若是,则转到3j),若否,则转到3h)。
3h)对于数据集Cg中的每个代码对执行如下操作:向生成器Gv输入良好代码cf得到合成漏洞代码Gv(cf),设置标签为1,表示该代码是生成器生成的,并给代码cv设置标签为0,表示该代码来自现实世界,进而得到两个新的带标签的数据<cv,0>和<Gv(cf),1>;同理向生成器Gf输入漏洞代码cv得到合成良好代码Gf(cv),设置标签为1,并给代码cf设置标签为0,同样得到两个新的带标签的数据<cf,0>和<Gf(cv),1>;收集新生成的带标签数据和构建数据集收集数据 和构建数据集其中,下标s表示当前判别器训练次数,转到3i)。
3i)利用数据集训练判别器Dv,利用数据集训练判别器Df,判别器是作为一个二分类器判断某一良好/漏洞代码的来源是生成器合成还是真实世界,通过如下方式获得判别器的最优参数和
同时判别器训练次数加1,转到3g)。
3j)判断判别器在最后一轮训练中的最好准确率是否与50%相差不超过设定值ε,若是,转到3n),若否,转到3k)。
3k)判断该轮完整训练中关于生成器训练的次数是否达到设定值Sg,若是,则转到3m),若否,则转到3l)。
3l)生成器Gv和Gf的输入分别为和i={1,2,…M},由于离散数据梯度无法在传统生成对抗网络中回传,采用SeqGAN的更新策略,在生成器逐步生成词元并最终得到完整序列的过程中,通过如下方式计算动作奖励值:
其中,表示当生成器为G,判别器为D,当前状态为s并采取动作a时获得的动作奖励值,Y1:t-1表示在生成器在第t步时已经生成的共t-1个词元组成的部分序列,并有完整序列Y1:T=G(x),x表示生成器的输入,T表示生成器总步数(即完整序列长度),yt表示第t步时生成的词元,并有yt∈V,V表示一个有限大小的词表,N表示蒙特卡洛搜索的次数, 表示蒙特卡洛搜索的第n个结果,并有表示利用生成器G并根据当前已生成的部分序列Y1:t执行N次蒙特卡洛搜索的结果,其中进行蒙特卡洛搜索的生成器和当前正在训练的生成器的设置保持一致。对于生成器Gv,上式中判别器D为Dv,输入x为对于生成器Gf,上式中判别器D为Df,输入x为在得到完整序列后,通过如下方式更新生成器的参数:
其中,表示生成器在生成序列的第t步时,根据已生成的部分序列Y1:t-1生成yt(yt∈V)时,通过采样计算得到近似期望值,表示的是关于生成器的参数θ求导计算梯度。注意在生成器参数更新的过程中需要固定判别器的参数不变。在生成器参数更新后生成器训练次数加1,转到3k)。
3m)完整训练次数加1,转到3e)。
3n)交替迭代训练结束
4)利用训练好的漏洞修复模型完成实际代码漏洞修复任务,其流程如图5所示,具体说明如下:
4a)对已知漏洞位置的程序可以直接实施本方法,在实际应用中如果不清楚待修复的代码中漏洞的具体数目和位置,可以结合技术发展已比较成熟的漏洞定位工具如DeepFL获得,转到4b)。
4b)选择一行存在漏洞并未被修复的代码行,并在其首尾分别添加词元”<sos>”和”<eos>”进行标注,转到4c)。
4c)选择训练后的生成器Gf作为漏洞修复模型,输入已标注的待修复代码,输出补丁序列,转到4d)。
4d)用生成的补丁序列替换原标注漏洞行,得到修复后代码,转到4e)。
4e)判断修复后代码是否仍然存在漏洞行未修复,若是,则转到4b),若否,则转到4f)。
4f)表明所有漏洞代码行均被模型生成补丁进行修复,输出最终的修复代码。
虽然本发明已以实施例公开如上,然其并非用以限定本发明,本领域的普通技术人员对本发明的技术方案进行的适当修改或者等同替换,均应涵盖于本发明的保护范围内,本发明的保护范围以权利要求所限定者为准。
Claims (10)
1.一种基于生成对抗网络的程序漏洞自动修复方法,其特征在于,其步骤包括:
1)构建原始数据集,并扩展为用于预训练的扩充数据集;
2)利用扩充数据集对基于编解码器的生成模型进行自编码预训练,预训练目标是让生成器学习到语义等价代码之间的映射关系,包括从代码空间到特征空间进行特征提取和从特征空间到代码空间进行代码重构;
3)获取漏洞修复代码对数据集,在自编码预训练得到的生成模型的基础上构造生成对抗网络,利用漏洞修复代码对数据集对该生成对抗网络进行交替迭代训练,训练完成后得到漏洞修复模型;
4)利用漏洞修复模型完成实际代码漏洞修复任务。
2.如权利要求1所述的程序漏洞自动修复方法,其特征在于,步骤1)中构建原始数据集的步骤包括:下载用于训练大语言模型的开源代码语料The Stack,首先筛选出The Stack中利用Java编程语言进行编写的代码文件,然后过滤掉该代码文件中词元数超过2000个的代码文件,最后从剩余的代码文件中选择基于Java SE 8进行开发的程序,构建原始数据集。
3.如权利要求1所述的程序漏洞自动修复方法,其特征在于,步骤1)中扩展为用于预训练的扩充数据集的步骤包括:设计语义等价变换规则,对原始数据集中的每一份代码文件逐条应用语义等价变换规则进行代码变换,获得变换后代码,由每个初始代码和对应的变换后代码组成代码对,由所有的代码对构建扩充数据集。
4.如权利要求3所述的程序漏洞自动修复方法,其特征在于,步骤2)中基于编解码器的生成模型包括编码器、解码器以及指针网络模块,其中编码器由一个词嵌入层和一个双向LSTM层组成,解码器由一个词嵌入层和一个LSTM层组成;对于扩充数据集中的每一对代码对其中为初始代码,为变换后代码,以作为生成模型的输入,以作为生成模型的输出,损失函数的设置如下:
其中,θG表示生成模型G的参数,N表示扩充数据集所包含的数据对数量,Δ表示交叉熵损失函数。
5.如权利要求1所述的程序漏洞自动修复方法,其特征在于,步骤3)中漏洞修复代码对数据集包含由漏洞代码cv和对应修复后代码cf组成的代码对。
6.如权利要求5所述的程序漏洞自动修复方法,其特征在于,步骤3)中在自编码预训练得到的生成模型的基础上构造生成对抗网络是指,将两个基于编解码器的生成模型作为两个生成器Gv和Gf,生成器Gv负责向良好代码引入漏洞,生成器Gf负责修复漏洞代码;在此基础上增加两个判别器Dv和Df,每个判别器是由一个卷积网络层和一个全连接层组成,判别器Dv负责分辨漏洞代码的来源是生成器Gv生成的还是来自于漏洞修复代码对数据集,判别器Df负责分辨良好代码的来源是生成器Gf生成的还是来自于漏洞修复代码对数据集。
7.如权利要求6所述的程序漏洞自动修复方法,其特征在于,步骤3)中利用漏洞修复代码对数据集对该生成对抗网络进行交替迭代训练包括以下步骤:
将漏洞修复代码对数据集中每个代码对<cv,cf>输入到生成对抗网络中进行以下生成操作;
向生成器Gv输入修复后代码cf得到合成漏洞代码Gv(cf),设置标签为1,并给代码cv设置标签为0,得到两组新的带标签的数据<cv,0>和<Gv(cf),1>,构建成数据集
向生成器Gf输入漏洞代码cv得到合成良好代码Gf(cv),设置标签为1,并给代码cf设置标签为0,得到两组新的带标签的数据<cf,0>和<Gf(cv),1>,构建成数据集
利用数据集训练判别器Dv,利用数据集训练判别器Df,对判别器重复训练若干次后停止训练;
向生成器Gv输入修复后代码cf,向生成器Gf输入漏洞代码cv,对这两个生成器进行训练,采用SeqGAN的更新策略,在生成器逐步生成词元并最终得到完整序列的过程中计算动作奖励值;
根据计算的动作奖励值在固定判别器的参数不变的情况下更新生成器的参数,对生成器重复训练若干次后停止训练;
上述对生成器和判别器的训练停止后,完成第一轮完整训练;在第二轮完整训练中,利用更新后的生成器Gv和Gf从漏洞修复代码对数据集中重新生成分别用于判别器Dv和Df训练的数据集和按照与第一轮相同的步骤训练判别器和生成器;如此重复多轮完整训练,直至当判别器Df的准确率与50%相差不超过设定值ε或完整训练轮次达到设定值S时,停止整个训练过程。
8.如权利要求7所述的程序漏洞自动修复方法,其特征在于,步骤3)中计算动作奖励值的式子如下:
其中,表示当生成器为G,判别器为D,当前状态为s并采取动作a时获得的动作奖励值,Y1:t-1表示在生成器在第t步时已经生成的共t-1个词元组成的部分序列,并有完整序列Y1:T=G(x),x表示生成器的输入,T表示生成器总步数,yt表示第t步时生成的词元,并有yt∈V,V表示一个有限大小的词表,N表示蒙特卡洛搜索的次数,表示蒙特卡洛搜索的第n个结果,并有表示利用生成器G并根据当前已生成的部分序列Y1:t执行N次蒙特卡洛搜索的结果,其中进行蒙特卡洛搜索的生成器和当前正在训练的生成器的设置保持一致;对于生成器Gv,上式中判别器D为Dv,输入x为cf;对于生成器Gf,上式中判别器D为Df,输入x为cv。
9.如权利要求8所述的程序漏洞自动修复方法,其特征在于,步骤3)中更新生成器的参数的式子如下:
其中,表示生成器在生成序列的第t步时,根据已生成的部分序列Y1:t-1生成h(yt∈V)时,通过采样计算得到近似期望值,表示关于生成器的参数θ求导计算梯度。
10.如权利要求1所述的程序漏洞自动修复方法,其特征在于,步骤4)中利用漏洞修复模型完成实际代码漏洞修复任务包括以下步骤:给漏洞修复模型输入待修复的漏洞代码并在其中标注存在漏洞的代码行,该漏洞修复模型自动进行特征提取后输出修复补丁,并对原代码行进行替换后得到修复后代码,如果待修复的代码中有多行存在漏洞,则进行单行迭代修复直到所有漏洞代码行均被修复。
Priority Applications (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| CN202410030910.8A CN117828615A (zh) | 2024-01-09 | 2024-01-09 | 一种基于生成对抗网络的程序漏洞自动修复方法 |
Applications Claiming Priority (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| CN202410030910.8A CN117828615A (zh) | 2024-01-09 | 2024-01-09 | 一种基于生成对抗网络的程序漏洞自动修复方法 |
Publications (1)
| Publication Number | Publication Date |
|---|---|
| CN117828615A true CN117828615A (zh) | 2024-04-05 |
Family
ID=90524145
Family Applications (1)
| Application Number | Title | Priority Date | Filing Date |
|---|---|---|---|
| CN202410030910.8A Pending CN117828615A (zh) | 2024-01-09 | 2024-01-09 | 一种基于生成对抗网络的程序漏洞自动修复方法 |
Country Status (1)
| Country | Link |
|---|---|
| CN (1) | CN117828615A (zh) |
Cited By (7)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| CN118445812A (zh) * | 2024-05-21 | 2024-08-06 | 西安交通大学 | 一种基于大模型的漏洞修复方法及相关装置 |
| CN118965361A (zh) * | 2024-07-25 | 2024-11-15 | 浙江御安信息技术有限公司 | 一种基于深度学习的程序源代码自动化漏洞修复方法 |
| CN118981433A (zh) * | 2024-08-02 | 2024-11-19 | 北京智谱华章科技有限公司 | 一种程序修复方法、设备及计算机可读存储介质 |
| CN119128892A (zh) * | 2024-07-22 | 2024-12-13 | 中国人民解放军国防科技大学 | 一种基于检索增强的漏洞补丁生成方法、系统及存储介质 |
| CN119226842A (zh) * | 2024-08-15 | 2024-12-31 | 国网冀北电力有限公司 | 一种用于电力数据分类整理的系统及方法 |
| CN119398173A (zh) * | 2024-10-30 | 2025-02-07 | 北京理工大学 | 一种基于蒙特卡洛树搜索的代码大模型自我进化方法 |
| CN120524493A (zh) * | 2025-05-15 | 2025-08-22 | 北京摄星科技有限公司 | 一种基于大语言模型的capec漏洞管理系统 |
-
2024
- 2024-01-09 CN CN202410030910.8A patent/CN117828615A/zh active Pending
Cited By (9)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| CN118445812A (zh) * | 2024-05-21 | 2024-08-06 | 西安交通大学 | 一种基于大模型的漏洞修复方法及相关装置 |
| CN119128892A (zh) * | 2024-07-22 | 2024-12-13 | 中国人民解放军国防科技大学 | 一种基于检索增强的漏洞补丁生成方法、系统及存储介质 |
| CN118965361A (zh) * | 2024-07-25 | 2024-11-15 | 浙江御安信息技术有限公司 | 一种基于深度学习的程序源代码自动化漏洞修复方法 |
| CN118981433A (zh) * | 2024-08-02 | 2024-11-19 | 北京智谱华章科技有限公司 | 一种程序修复方法、设备及计算机可读存储介质 |
| CN118981433B (zh) * | 2024-08-02 | 2026-03-20 | 北京智谱华章科技股份有限公司 | 一种程序修复方法、设备及计算机可读存储介质 |
| CN119226842A (zh) * | 2024-08-15 | 2024-12-31 | 国网冀北电力有限公司 | 一种用于电力数据分类整理的系统及方法 |
| CN119398173A (zh) * | 2024-10-30 | 2025-02-07 | 北京理工大学 | 一种基于蒙特卡洛树搜索的代码大模型自我进化方法 |
| CN119398173B (zh) * | 2024-10-30 | 2025-10-10 | 北京理工大学 | 一种基于蒙特卡洛树搜索的代码大模型自我进化方法 |
| CN120524493A (zh) * | 2025-05-15 | 2025-08-22 | 北京摄星科技有限公司 | 一种基于大语言模型的capec漏洞管理系统 |
Similar Documents
| Publication | Publication Date | Title |
|---|---|---|
| CN117828615A (zh) | 一种基于生成对抗网络的程序漏洞自动修复方法 | |
| US11048502B1 (en) | Systems, devices, and methods for source code generation from binary files | |
| US20240143292A1 (en) | Unit test case generation with transformers | |
| CN112416806B (zh) | 一种基于标准文档分析的js引擎模糊测试方法 | |
| US8589870B2 (en) | System and method for transforming graphical models | |
| Devlin et al. | Semantic code repair using neuro-symbolic transformation networks | |
| CN119487512A (zh) | 通过机器学习的源代码漏洞检测和修复 | |
| CN106537333A (zh) | 用于软件产物的数据库的系统和方法 | |
| CN115237760B (zh) | 一种基于自然语言处理的JavaScript引擎定向模糊测试方法及系统 | |
| CN118171291B (zh) | 代码漏洞检测大模型构建方法、装置和电子设备 | |
| WO2023010916A1 (zh) | 软件自动修复方法、系统、电子设备及存储介质 | |
| US20220245056A1 (en) | Automated program repair using stack traces and back translations | |
| CN118103822A (zh) | 利用变换器使测试驱动的开发自动化 | |
| Lamela Seijas et al. | Towards property-based testing of RESTful web services | |
| CN119396689A (zh) | 代码缺陷预测方法、可读存储介质、计算机程序产品 | |
| CN112948193B (zh) | 一种基于差异测试的fpga综合工具缺陷检测方法 | |
| Hellendoorn et al. | On the naturalness of proofs | |
| CN113222160B (zh) | 一种量子态的转换方法及装置 | |
| Licorish et al. | Dissecting copy/delete/replace/swap mutations: Insights from a gin case study | |
| Habibi et al. | Towards an efficient assertion based verification of SystemC designs | |
| Li et al. | Improving automated program repair using two-layer tree-based neural networks | |
| CN118690375A (zh) | 一种基于大模型的软件开发验证方法 | |
| CN115758379A (zh) | 一种基于迁移学习的跨语言编译器漏洞挖掘方法和装置 | |
| Lee et al. | GRAFT: Graph-Assisted Reinforcement Learning for Automated SSD Firmware Testing | |
| Liang | Hardware descriptions code completion based on a pre-training model |
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 |