一种基于迁移学习的跨语言编译器漏洞挖掘方法和装置制造方法及图纸

技术编号:36773466 阅读:14 留言:0更新日期:2023-03-08 21:53
本发明专利技术涉及一种基于迁移学习的跨语言编译器漏洞挖掘方法和装置。该方法的步骤包括:1)计算源编程语言数据D

【技术实现步骤摘要】
一种基于迁移学习的跨语言编译器漏洞挖掘方法和装置


[0001]本专利技术涉及信息安全
,具体涉及一种基于迁移学习的跨语言编译器漏洞挖掘方法和装置。

技术介绍

[0002]随着计算机行业的发展,计算机软件愈发成为社会生活和行业生产重要的环节和资产。而软件的安全事件层出不穷,对社会安全稳定造成严重威胁,软件的安全性也因此愈发重要。编译器作为核心基础软件,支撑着其他绝大多数软件的稳定使用,其安全性也尤为重要。Nicholas等发现的“木马源”(Trojan Source)漏洞是编译器漏洞威胁全球软件代码的典型案例。该漏洞存在于Unicode中,能通过重排字符,影响大多数编译器的逻辑顺序,从而几乎影响所有计算机语言编写的软件(Boucher N,Anderson R.Trojan Source:Invisible Vulnerabilities[J].arXiv preprint arXiv:2111.00169,2021)。
[0003]目前,基于学习的模糊测试是挖掘编译器漏洞的常见方法之一。由于编译器的代码规模庞大,复杂性高。模糊测试在挖掘编译器漏洞时,拥有快速且有效的优势。目前,模糊测试通常采用了基于学习的测试样例生成方法,该技术通过训练神经网络来不断生成新的程序测例,作为编译器模糊测试的输入来观察该程序测例是否导致编译器异常。Godefroid等通过训练RNN用以生成格式良好的PDF文件,以此为测例来测试edge上的PDF解析器(Godefroid,P.;Peleg,H.;and Singh,R.2017.Learn&Fuzz:Machine learning for input fuzzing.In ASE

17)。而Liu等利用训练SequenceToSequence模型,提出了模糊测试工具DEEPFUZZ,该工具能够自动并持续地生成格式良好的C程序,并且成功地测试出了GCC所存在的8个漏洞。
[0004]基于学习的测试样例生成方法虽然有效,但仍然存在如下两点问题:首先模型的训练效果受到训练集质量的影响。Godefroid的工作得到edge官方开发人员的支持,从而得到了大量官方人员提供的样例用以训练。Liu用以训练的C语言程序也是GCC测试套件中所收集的。然而并非所有编译器或虚拟机引擎的程序测例都有高质量的测试套件作为训练集,这无疑会使得生成效果大打折扣。其次,模型的训练时间开销很大,想得到更好的模型,需要几十个小时以上的训练时间,还要花费大量精力对模型的参数进行调优。在这种情况下,为了生成测例的时间开销远远高于测试和挖掘漏洞的花销。
[0005]迁移学习的特点正好可以弥补传统基于学习的模糊测试方法存在的问题,迁移学习在目标数据集数据质量不高的情况下,仍然能够取得良好的训练效果,并且利用预训练模型可以缩短训练的时长。利用迁移学习来快速训练生成模型,可以提高测例生成和漏洞挖掘的效率及有效性。

技术实现思路

[0006]本专利技术的目的在于针对现有问题,提供一种基于迁移学习的跨语言编译器漏洞挖掘方法和装置。
[0007]本专利技术采用技术方案:
[0008]一种基于迁移学习的跨语言编译器漏洞挖掘方法,其包括以下步骤:
[0009]1)选择基于学习生成模糊测试样例的模型作为预训练模型,称为M
S
,在此基础上选取源语言数据集和目标语言数据集,将其序列化为源语言序列S
S
和目标语言序列S
T
,并计算两个序列的距离差值D和模型的修正正则项L;
[0010]2)对于源语言的预训练模型M
S
,根据所得到的修正正则项L,以及序列S
S
和S
T
之间的差异对预训练模型M
S
进行修正,从而得到修正后的模型M
S


[0011]3)对经过修正的M
S

,利用目标语言序列S
T
进行微调训练,最终得到生成模型M
T

[0012]4)利用模型M
T
生成代码,结合种子程序生成目标语言程序作为测试样例,利用该测试样例进行模糊测试以挖掘漏洞。
[0013]进一步地,上述步骤1)在开源平台上选择已公开的、基于学习生成模糊测试样例的模型作为预训练模型,在开源平台上选择的模型称为预训练模型M
S
,该模型所生成的源代码程序语言称为“源语言”。确定待检测的目标编译器,该编译器所编译的程序语言称为“目标语言”。从漏洞信息发布平台或官方测试套件中挑选一定数量的源语言程序作为源语言数据集D
S
,目标语言程序作为目标语言数据集D
T
。将D
S
和D
T
内的每个程序都视为一个token(词元)序列,将所有程序拼接称为一个大的序列S
S
和S
T
。并计算两个序列的距离差值D和修正正则项L。
[0014]进一步地,所述计算两个序列的距离差值D和修正正则项L,包括以下步骤:
[0015]a)用最大均值差异来描述两个序列的距离差值D:
[0016][0017]其中最大均值差异(MMD)是用来度量两个不同但相关的随机变量分布的距离,即序列S
S
,S
T
中元素s
s
和s
t
之间距离。公式中函数即将样本s
s
和s
t
映射到统一空间的投影函数,然后计算两个分布的样本在函数上的均值之和,再求差。
[0018]b)利用其距离差值D来计算损失函数的修正正则项L:
[0019]L=Lc+0.25*MMD2(Ss,St)
[0020]其中L
C
是预训练模型自身的损失函数,代表了输出样本和真实样本之间的差异,而MMD代表了源域和目标域样本之间的差异。
[0021]进一步地,上述步骤2)将预训练模型进行一个修正,修正后的模型M
S

具备一些程序语言的共性特点,能够更好地拟合目标语言。其中预训练模型Ms为序列对序列(SequenceToSequence)模型。此模型由两个循环神经网络(RNN)的变体长短期记忆人工神经网络(LSTM)组成,分别为编码器和解码器。其中编码器将一个输入序列处理为一个固定维度的向量c表示,该向量隐藏了此输入序列的记忆信息,解码器利用向量c来生成一个输出序列。每个LSTM是由隐藏状态h和可选输出y组成的神经网络,其运用在一个可变序列X=<x1,x2,x3,

,x
T
>上。本专利技术所提到的模型M
S
,M
S

和M
T
均属于此种模型,模型的差异在于内部激活函数的不同。
[0022]进一步地,所述本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于迁移学习的跨语言编译器漏洞挖掘方法,其步骤包括:选择基于学习生成模糊测试样例的模型作为预训练模型M
S
,在此基础上选取源语言数据集和目标语言数据集,将其序列化为源语言序列S
S
和目标语言序列S
T
,并计算两个序列的距离差值D和模型的修正正则项L;对于源语言的预训练模型M
S
,根据所得到的修正正则项L,以及序列S
S
和S
T
之间的差异对预训练模型M
S
进行修正,从而得到修正后的模型M
S

;对经过修正的M
S

,利用基于目标数据集D
T
而生成的目标语言序列S
T
进行微调训练,最终得到生成模型M
T
;根据生成模型M
T
生成目标语言程序作为测试样例,利用测试样例进行模糊测试以挖掘漏洞。2.如权利要求1所述的方法,其特征在于,所述源语言数据集和目标语言数据集的序列化方法是:将构成数据集的每个程序视为由token构成的序列,并将数据集里的多个程序直接拼接为一整个序列。3.如权利要求1所述的方法,其特征在于,所述距离差值D用最大均值差异来计算,所述修正正则项L用损失函数来计算;其中D的计算公式如下:其中最大均值差异MMD用来度量两个不同但相关的随机变量分布的距离,即序列S
S
,S
T
中元素s
s
和s
t
之间距离;函数是将样本s
s
和s
t
映射到统一空间的投影函数;L的计算公式如下:L=Lc+0.25*MMD2(Ss,St)其中L由预训练模型自身的损失函数Lc和MMD构成,自身的损失函数代表输出样本和真实样本之间的差异,MMD代表源域和目标域样本之间的差异。4.如权利要求1所述的方法,其特征在于,所述对预训练模型M
S
进行修正,是通过序列之间的token差异和修正正则项L修改预训练模型中每个神经网络的激活函数,包括以下步骤:计算输入序列中每个元素xi和目标语言语义标准集的距离d,并用该距离来修改隐藏状态h
t
的更新函数为:利用修正正则项L,修改y
t
的更新函数为:y
t
=Ф(h
t
)=g(h
t

1,x
t
)+L。5.如权利要求1所述的方法,其特征在于,所述对经过修正的M
S

,利用基于目标数据集D
T
而生成的目标语言序列S
T
进行微调训练,包括:利用目标语言序列S
T
生成输入序列和输出序列进行训练,在训练过程中固定原模型最低层神经网络的参数,将其余层神经网络的参数作为初始化参数。6.如权利要求1所述的方法,其特征在于,所述根据模型M
T
生成目标语言程序作为测试样例,包括:从目标语言的程序集合中随机选取种子程序及其中的前缀序列,利用前缀序列和生成模型M
T
得到代码片段,利用代码片段替换原种子程序中前缀序列的后续代码段。
7.如权利要求6所述...

【专利技术属性】
技术研发人员:陈思然吴敬征芮志清罗天悦凌祥武延军
申请(专利权)人:中国科学院软件研究所
类型:发明
国别省市:

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

1