本发明主要涉及到软件程序缺陷自动修复,特指一种基于思维链的软件漏洞自动修复方法及存储介质。
背景技术:
1、随着软件漏洞数量和复杂性的增加,研究人员提出了许多自动化方法来帮助开发人员发现、检测和定位漏洞,但修复漏洞仍需要研究人员花费大量精力。近年来,一些研究者开始关注软件漏洞自动修复技术,但现有技术仅将软件漏洞修复概括为通用文本生成问题,没有对缺陷修复位置进行定位,导致修复程序生成空间较大,修复程序质量较低。
2、当前的漏洞修复方法,根据是否针对特定类型漏洞,可分为特定类型漏洞的修复方法和通用类型漏洞的修复方法;其中,特定类型的漏洞修复方法通常依据特定类型漏洞的共性根因和修复机制定制专有的漏洞定位与补丁生成算法;通用类型方法不指定漏洞类型,主流方法依据漏洞的历史数据,基于学习算法对漏洞修复的过程进行学习,以实现对任意类型漏洞的修复。对于特定类型漏洞修复的方法,当前研究主要针对综合影响力较大的漏洞开展,例如缓冲区溢出和整形溢出等常见且危害性较大的漏洞。如从业者sidiroglou等人提出了code phage技术,该技术假设非漏洞程序中含有漏洞程序缺失的分支检查,缺失的分支检查将导致缓冲区溢出漏洞。依托这一假设,该技术从健康程序中搜索能够正确处理失败用例的程序,从中提取漏洞程序中缺失的分支检查,后将分支条件修改移植至漏洞程序中以实现修复。然而,该技术存在假设过于理想,实际难以找到合格的非漏洞程序作为供体等问题。
3、为了提高修复程序的生成质量,另有从业者huang等采用程序合成的方式生成漏洞修复程序。具体而言,其针对缓冲区溢出漏洞和整数溢出漏洞,首先定义一组安全约束,进而利用符号执行检测表达式是否满足安全约束,对于不满足约束的表达式,利用一组预先定义的修复模板生成修复程序。
4、对于通用类型漏洞的修复方法而言,从业者chen等人提出了基于迁移学习的漏洞修复方法vreapir。该工作利用transformer模型,首先在c语言缺陷修复数据集上进行预训练,而后在包含3754个漏洞的数据集上进行模型微调,评估结果显示,相比于直接在漏洞数据集上训练,预训练之后的修复准确率从12.58%提升至17.30%。尽管如此,vreapir仍然存在预训练任务单一,导致代码语义捕获能力差的问题。
5、为了缓解上述问题,另有从业者fu等人提出了基于t5预训练模的漏洞修复方法,该方法利用了在835万个代码实例上以4种任务预训练而得到的t5模型作为基座,在8482个漏洞数据上进行微调,缓解了vrepair代码语义捕获能力较差的问题。通过评估结果显示,相比于vreapir方法,vulrepair的修复准确率从23%提升到了44%,这一结果揭示了利用预训练模型所蕴含的丰富信息提升修复效果的可能性。尽管如此,当前的通用类型漏洞修复方法还是仅仅试图将含有缺陷的代码直接翻译为修复程序;在没有精确定位信息的情况下,整个漏洞程序中的所有元素均有可能为缺陷元素,导致修复程序生成的搜索空间较大,进而影响修复程序的生成质量。
技术实现思路
1、本发明要解决的技术问题就在于:针对现有技术存在的技术问题,本发明提出了原理简单、适用范围广、自动化程度高、修复效率和精度高的基于思维链的软件漏洞自动修复方法及存储介质。
2、为解决上述技术问题,本发明采用以下技术方案:
3、一种基于思维链的软件漏洞自动修复方法,其包括:
4、步骤s1:训练数据预处理;对模型的输入输出进行构建,包括漏洞程序、修复位置及修复程序;
5、步骤s2:模型训练;以漏洞程序作为模型的输入,构建{修复位置+修复程序}的序列作为预期输出,用以减少预期输出和模型的实际输出之间的交叉熵作为优化目标;
6、步骤s3:漏洞修复;对于给定的待修复漏洞程序,利用步骤s1的输入后,将其送入步骤s2得到的训练后模型中,利用集束搜索技术对可能的输出进行搜索,输出按照可能性从高到低排列,即得到cotrepair产生的候选修复程序。
7、作为本发明方法的进一步改进:所述步骤s1的流程包括:
8、步骤s11:数据预处理;
9、步骤s12:数据表示;
10、步骤s13:代码分词:对于输入的漏洞程序与修复程序,采用bpe算法对输入的漏洞程序进行分词。
11、作为本发明方法的进一步改进:所述步骤s11中,针对数据集中存在的一次漏洞修复提交记录,通过搜索历史修复记录,抽取出修改前与修改后代码,即原始漏洞程序与修复程序;而后利用tree-sitte去除原始漏洞程序与修复程序中的所有注释;利用tree-sitter以剔除所有未产生更改的函数,对产生变更的函数分别利用bpe分词算法进行分词,得到漏洞程序与修复程序;利用difflib工具对两个序列进行比较并生成修复位置信息。
12、作为本发明方法的进一步改进:所述步骤s12中,使用漏洞修复过程中所产生的一次提交记录作为数据集的基本构成单元;模型的输入是遵循先前基于历史驱动的漏洞自动修复方法,以标记后的漏洞程序作为输入;所述漏洞程序中使用两个特殊令牌<startloc>和<endloc>标记漏洞程序中的第一行缺陷代码;对于出现在多行的缺陷,也仅标记首行缺陷代码。
13、作为本发明方法的进一步改进:所述步骤s2包括:
14、步骤s21:嵌入层;嵌入层由代码嵌入层和位置编码层两部分组成;所述代码嵌入层用于将文本形式的代码映射至向量空间,通过代码嵌入;所述位置编码层用来捕获嵌入矩阵中的任意两个元素和之间的相对位置关系,其将至的相对位置关系编码为两个向量,;
15、步骤s22:编码器;由12层结构相同的编码器层线性叠加组成,用以将输入的数据编码为一个稠密的表示,用来提取输入数据中最重要的信息,将其转化为一个低纬度的向量,同时尽可能保留原始数据的某些特征;
16、步骤s23:解码器;在得到了由编码器抽取到的隐藏层状态之后,模型利用解码器对该特征进行解码;所述解码器由12层相同的解码层的线性叠加组成,第一层的输入为隐藏层状态和经过代码嵌入层的预期输出的向量矩阵;向量矩阵首先通过掩码多头自注意力层,而后同隐藏层状态,送入多头自注意力层,经过前馈神经网络后得到第一层的输出;
17、步骤s24:模型训练;使用交叉熵损失函数对模型进行训练。
18、作为本发明方法的进一步改进:所述编码器层由一个具有相对位置编码的多头自注意计算模块和一个前馈神经网络组成;所述多头自注意计算模块由多个自注意头组成,用于通过不同的自注意力头,在多个不同的投影空间中捕捉不同的交互信息并进行融合;对于单个具有相对位置编码的注意力头而言,其接收矩阵作为输入,利用三个线性变换矩阵将输入分别向量映射至属于三个子空间的三个矩阵,分别记为、和,每个子空间反应不同的隐藏特征。
19、作为本发明方法的进一步改进:所述嵌入层中,假定对于输入的漏洞程序,经过分词得到令牌流序列后在词嵌入矩阵中寻找第个令牌对应的语义向量,得到漏洞程序的嵌入矩阵;具体过程可表示为:
20、。
21、作为本发明方法的进一步改进:所述位置编码层的具体过程表示为:
22、
23、
24、
25、其中,clip函数的作用为对距离过大的两个元素之间的相对位置进行裁剪,即若两个元素之间相对位置大于,则认为他们之间的相对位置为;相对位置编码矩阵,为可学习的权重矩阵,其中,;
26、步骤s24:模型训练;使用交叉熵损失函数对模型进行训练;损失函数计算的具体过程可表示为:
27、
28、其中,为模型生成的令牌流中的第个元素,为理想情况下令牌的概率分布,为模型生成的令牌概率分布。
29、作为本发明方法的进一步改进:所述步骤s3包括:
30、步骤s31:提取原始漏洞程序,在剔除所有注释并利用现有的缺陷定位工具得到行级别的缺陷信息后, 利用步骤s1的输入,该数据为步骤s32所需要的输入;
31、步骤s32:将经过预处理的漏洞程序输入由步骤s2训练后得到的模型,模型对该序列进行特征抽取并解码,产生构成修复程序的令牌概率分布;生成修复程序的过程中,利用了集束搜索策略选择概率最大的 k个候选修复程序进行输出,即得到模型预测的候选修复程序。
32、本发明进一步提供一种存储介质,所述存储介质能够被计算机或处理器读取,所述存储介质中存储有用来执行上述任意一项方法的计算机程序。
33、与现有技术相比,本发明的优点就在于:
34、1、本发明基于思维链的软件漏洞自动修复方法及存储介质,原理简单、适用范围广、自动化程度高、修复效率和精度高,本发明利用思维链技术,帮助模型生成更加准确地生成修复程序,基于t5预训练模型,通过以漏洞程序为输入,在训练过程中依托思维链技术辅以修复位置信息进行学习,生成候选修复程序帮助开发人员更快更精确地对漏洞程序进行修复。
35、2、本发明基于思维链的软件漏洞自动修复方法及存储介质,提出的漏洞修复技术能够准确找到漏洞的修复位置,相比于现有的漏洞修复技术仅依托由现有缺陷定位工具或者开发人员提供的行级别的缺陷位置标记对漏洞程序进行修复,本发明提出首先在已有的缺陷位置标记的前提下,依托思维链技术,要求模型对概率较高的修复位置进行预测,而后优先在这些位置对可能的修复空间进行搜索以生成修复程序,在这种细粒度修复位置预测结果的约束下,本发明的修复程序搜索空间更加精确。
36、3、本发明基于思维链的软件漏洞自动修复方法及存储介质,基于本发明提出的漏洞修复技术能生成高质量的修复程序,相比于现有的漏洞修复技术在进行漏洞修复时,仅仅尝试将含有缺陷的代码直接翻译为修复程序,在没有修复位置信息的情况下,漏洞程序中的所有元素均有可能被模型识别为缺陷元素,导致补丁生成的搜索空间较大,进而影响补丁的生成质量。本发明针对漏洞程序中可能的缺陷元素进行预测,以期模型能够学会先通过定位修复位置再生成修复程序,从而对修复程序生成的搜索空间进行精化,以提升修复程序的生成质量。
37、4、本发明基于思维链的软件漏洞自动修复方法及存储介质,基于本发明提出的缺陷定位技术具有更高的修复效率;基于现有的漏洞修复技术由于缺少精确的修复位置信息导致修复工具的搜索空间较大,并且对漏洞程序中的非修复位置进行了修复尝试导致生成了大量不正确的修复程序。
1.一种基于思维链的软件漏洞自动修复方法,其特征在于,包括:
2.根据权利要求1所述的基于思维链的软件漏洞自动修复方法,其特征在于,所述步骤s1的流程包括:
3.根据权利要求2所述的基于思维链的软件漏洞自动修复方法,其特征在于,所述步骤s11中,针对数据集中存在的一次漏洞修复提交记录,通过搜索历史修复记录,抽取出修改前与修改后代码,即原始漏洞程序与修复程序;而后利用tree-sitte去除原始漏洞程序与修复程序中的所有注释;利用tree-sitter以剔除所有未产生更改的函数,对产生变更的函数分别利用bpe分词算法进行分词,得到漏洞程序与修复程序;利用difflib工具对两个序列进行比较并生成修复位置信息。
4.根据权利要求2所述的基于思维链的软件漏洞自动修复方法,其特征在于,所述步骤s12中,使用漏洞修复过程中所产生的一次提交记录作为数据集的基本构成单元;模型的输入是遵循先前基于历史驱动的漏洞自动修复方法,以标记后的漏洞程序作为输入;所述漏洞程序中使用两个特殊令牌<startloc>和<endloc>标记漏洞程序中的第一行缺陷代码;对于出现在多行的缺陷,也仅标记首行缺陷代码。
5.根据权利要求1-4中任意一项所述的基于思维链的软件漏洞自动修复方法,其特征在于,所述步骤s2包括:
6.根据权利要求5所述的基于思维链的软件漏洞自动修复方法,其特征在于,所述编码器层由一个具有相对位置编码的多头自注意计算模块和一个前馈神经网络组成;所述多头自注意计算模块由多个自注意头组成,用于通过不同的自注意力头,在多个不同的投影空间中捕捉不同的交互信息并进行融合;对于单个具有相对位置编码的注意力头而言,其接收矩阵作为输入,利用三个线性变换矩阵将输入分别向量映射至属于三个子空间的三个矩阵,分别记为、和,每个子空间反应不同的隐藏特征。
7.根据权利要求5所述的基于思维链的软件漏洞自动修复方法,其特征在于,所述嵌入层中,假定对于输入的漏洞程序,经过分词得到令牌流序列后在词嵌入矩阵中寻找第个令牌对应的语义向量,得到漏洞程序的嵌入矩阵;具体过程可表示为:
8.根据权利要求5所述的基于思维链的软件漏洞自动修复方法,其特征在于,所述位置编码层的具体过程表示为:
9.根据权利要求1-4中任意一项所述的基于思维链的软件漏洞自动修复方法,其特征在于,所述步骤s3包括:
10.一种存储介质,所述存储介质能够被计算机或处理器读取,其特征在于,所述存储介质中存储有用来执行上述权利要求1-9中任意一项方法的计算机程序。