一种检测智能合约漏洞的方法与装置与流程
未命名
10-08
阅读:81
评论:0

1.本发明涉及漏洞检测技术领域,具体为一种检测智能合约漏洞的方法与装置。
背景技术:
2.智能合约是一种运行在区块链上的自动化合约,它可以实现多方之间的交易和数据共享。然而,由于智能合约的复杂性和不可逆性,广泛应用于金融、电子商务等领域,它们容易受到各种漏洞和攻击。基于静态分析的方法往往需要专家经验作为技术支撑,并且分析过程需要消耗大量时间。现有的基于深度学习和机器学习的检测方法只能检测智能合约是否存在漏洞,并不能给出漏洞的具体类型,面对新增漏洞时需要对模型进行重新训练,同时存在漏洞的智能合约所占比例较小,正负样本不平衡。
3.现有的基于深度学习的方法需要足量带漏洞标签的智能合约才能充分学习到漏洞特征,目前智能合约漏洞数据集并不完善,带有漏洞标签智能合约远少于不带漏洞的合约,现有的模型在训练数据少、标签不平衡的数据上学习的效果欠佳,这一点在使用二分类模型针对每一种漏洞数据进行训练的方法上最为明显,模型只能在单一漏洞数据上学习,而不是所有漏洞数据上;而基于多分类模型的方法,使用所有漏洞数据进行训练,但在面对新增漏洞时,需要赋予新增漏洞标签,使用现有的漏洞数据和新增漏洞数据重新进行模型的训练,当漏洞类型增多时,这是一个非常耗时的过程,为此我们提出一种检测智能合约漏洞的方法与装置用于解决上述问题。
技术实现要素:
4.本发明的目的在于提供一种检测智能合约漏洞的方法与装置,以解决上述背景技术中提出的问题。
5.为实现上述目的,本发明提供如下技术方案:一种检测智能合约漏洞的方法与装置,包括如下步骤:步骤s1、将智能合约进行标化,并标记智能合约中漏洞的位置和漏洞类型,并对漏洞进行修复,制作训练集;步骤s2、利用分析工具生成新漏洞数据库中智能合约的控制流图,通过控制流图得到程序依赖图,利用编译工具生成新漏洞数据库中智能合约的抽象语法树,通过程序依赖图对抽象语法树进行切片处理,并得到合约切片;步骤s3、使用codebert模型对合约切片进行标化,使用lstm网络提取标化后合约切片的公共特征;步骤s4、在提取的合约切片的公共特征的基础上,利用多分支结构学习相应漏洞的模式并输出对应漏洞的可能性,出现新漏洞时,增加新的漏洞分支结构,并对新的漏洞分支结构单独进行训练。
6.优选的,步骤s1中的训练集包含存在漏洞的合约、漏洞类型、漏洞修复的方法,不含漏洞的合约。
7.优选的,所述步骤s1的具体操作如下:步骤s11、通过正则表达式删除智能合约源代码中的注释;步骤s12、消除智能合约源代码中语义相同的控制流语句;步骤s13、将修饰器中的语句插入到使用到修饰器的函数中;步骤s14、定义映射统一的符号和有含义符号的名称;步骤s15、根据swc标准,对存在漏洞的智能合约漏洞出现的行号和漏洞类型进行人工标记。
8.优选的,所述步骤s2的具体操作如下:步骤s21、使用以太坊分析工具slither生成智能合约中目标函数的控制流图;步骤s22、通过控制流图将目标函数的控制依赖和数据依赖信息进行合并,得到程序依赖图;步骤s23、使用solidity编译工具solc编译智能合约的源代码生成抽象语法树;步骤s24、在抽象语法树的基础上结合区块链和智能合约的特性定义漏洞特征;步骤s25、程序依赖图的基础上对智能合约漏洞特征进行切片。
9.优选的,步骤s3的具体操作如下:步骤s31、使用codebert模型将合约切片进行词向量嵌入,生成词向量嵌入矩阵;步骤s32、对较短的词向量进行填充,较长的词向量进行截取,得到长度相同的词向量矩阵;步骤s33、使用lstm网络学习具词向量矩阵来提取公共特征。
10.优选的,步骤s4训练分支的步骤如下:步骤s411、每个分支结构共享来自步骤s3的输入;步骤s412、针对不同类型的漏洞数据,通过步骤s3提取公共特征,仅输入漏洞对应的分支进行训练;步骤s413、更新lstm网络参数和对应漏洞分支的参数。
11.优选的,步骤s4漏洞检测的具体步骤如下:步骤s421、步骤s3提取到的待检测合约公共特征,输入每漏洞分支中;步骤s422、每个漏洞分支给出合约对应漏洞的概率;步骤s423、对于新出现的漏洞,参照步骤s1构造新漏洞数据,添加对应新的漏洞分支;优选的,步骤s423中对新漏洞分支训练的具体步骤如下:步骤s4231、冻结步骤s3公共特征的提取和其他漏洞分支的参数;步骤s4232、使用新漏洞数据对新分支进行训练,仅更新新漏洞分支的参数;步骤s4233、将公共特征的提取和其他漏洞分支的参数进行解冻。
12.一种检测智能合约漏洞的装置,其特征在于:包括漏洞数据库构建模块、合约切片提取模块、多标签分类与迁移学习模块和公共特征提取模块;所述漏洞数据库构建模块:将智能合约进行标化,并标记智能合约中漏洞的位置和漏洞类型,并对漏洞进行修复,并制作数据集;所述合约切片提取模块:利用分析工具生成新漏洞数据库中智能合约的控制流图,通过控制流图得到程序依赖图,利用编译工具生成新漏洞数据库中智能合约的抽象语
法树,通过程序依赖图对抽象语法树进行切片处理,并得到合约切片;所述公共特征提取模块:使用codebert模型对合约切片进行标化,使用lstm网络提取标化后合约切片的公共特征;所述多标签分类与迁移学习模块:在提取的合约切片的公共特征的基础上,利用多分支结构学习相应漏洞的模式并输出对应漏洞的可能性,出现新漏洞时,增加新的漏洞分支结构,并对新的漏洞分支结构单独进行训练。
13.与现有技术相比,本发明的有益效果是:本发明使用多分支结构实现了智能合约漏洞多标签分类,避免针对不同漏洞的重复训练,使用迁移学习技术,将从已有漏洞合约上学习的经验应用到新增漏洞特征学习上,加快了模型训练速度,在新增漏洞数据库较小的情况下,学习到尽可能多的特征。
14.创新性地使用合约切片提取智能合约中的漏洞相关的控制流和数据流信息,对合约切片进行编码输入到公共特征提取层,学习智能合约的公共特征参数,最后使用多分支结构对学习到的公共特征进行多标签分类。
15.面对新增漏洞时,添加新增漏洞对应的分支,使用新增漏洞数据集进行训练,冻结已训练好的公共特征层和其他分支的参数,实现对模型的快速拓展的同时将现有训练数据学习到的特征应用到新增漏洞的学习上。
附图说明
16.图1为本发明基于合约切片和迁移学习的智能合约漏洞检测框架图;图2为本发明构造合约切片原理图;图3为本发明合约源程序标化处理实施例;图4为本发明实施例依赖关系图。
具体实施方式
17.下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
18.参照图1,为本发明第一个实施例,该实施例提供了一种检测智能合约漏洞的方法,包括如下步骤:步骤s1、将智能合约进行标化,并标记智能合约中漏洞的位置和漏洞类型,并对漏洞进行修复,制作训练集;步骤s2、利用分析工具生成新漏洞数据库中智能合约的控制流图,通过控制流图得到程序依赖图,利用编译工具生成新漏洞数据库中智能合约的抽象语法树,通过程序依赖图对抽象语法树进行切片处理,并得到合约切片;步骤s3、使用codebert模型对合约切片进行标化,使用lstm网络提取标化后合约切片的公共特征;步骤s4、在提取的合约切片的公共特征的基础上,利用多分支结构学习相应漏洞的模式并输出对应漏洞的可能性,出现新漏洞时,增加新的漏洞分支结构,并对新的漏洞分
支结构单独进行训练。
19.具体的,使用合约切片提取智能合约中的漏洞相关的控制流和数据流信息,对合约切片进行编码输入到公共特征提取层,学习智能合约的公共特征参数,最后使用多分支结构对学习到的公共特征进行多标签分类。
20.面对新增漏洞时,添加新增漏洞对应的分支,使用新增漏洞数据集进行训练,冻结已训练好的公共特征层和其他分支的参数,实现对模型的快速拓展的同时将现有训练数据学习到的特征应用到新增漏洞的学习上。
21.所述步骤s1的训练集包括漏洞的合约、漏洞类型、漏洞修复方案以及修改后的合约。
22.优选的,所述步骤s1的具体操作如下:步骤s11、通过正则表达式删除智能合约源代码中的注释;步骤s12、消除智能合约源代码中语义相同的控制流语句;步骤s13、将修饰器中的语句插入到使用到修饰器的函数中;步骤s14、定义映射统一的符号和有含义符号的名称;步骤s15、根据swc标准,对存在漏洞的智能合约漏洞出现的行号和漏洞类型进行人工标记。
23.具体的,步骤s12删除solidity中的if...throw,assert,if...revert,require语句。
24.为了方便codebert模型和lstm网络模型学习合约编写人员赋予该符号的含义,将驼峰和下划线命名的符号拆分为具体的单词进行学习,对于无法判断具体含义的符号名,则使用相应的符号进行代替,如变量命名为var1、var2,函数命名为fun1,fun2等替换无法判断具体含义的符号名,并删除程序中的标点符号和停用词。
25.步骤s1中的训练集包含存在漏洞的合约、漏洞类型、漏洞修复的方法,不含漏洞的合约,若对应的对象不存在则记为none参考图2,所述步骤s2的具体操作如下:步骤s21、使用以太坊分析工具slither生成智能合约中目标函数的控制流图;步骤s22、通过控制流图将目标函数的控制依赖和数据依赖信息进行合并,得到程序依赖图;步骤s23、使用solidity编译工具solc编译智能合约的源代码生成抽象语法树;步骤s24、在抽象语法树的基础上结合区块链和智能合约的特性定义漏洞特征;步骤s25、程序依赖图的基础上对智能合约漏洞特征进行切片。
26.具体的,在抽象语法树的基础上进行合约漏洞特征的定义,智能合约不同于一般的程序,一般的程序定义特征的话有外部函数调用、指针操作,智能合约特有的特征如地址操作、区块信息,结合区块链和智能合约的特性,定义了以下可能会造成漏洞的特征:外部函数调用、全局数组的使用、地址操作、区块信息和交易信息。
27.在程序依赖图的基础上,对合约漏洞特征进行切片处理,如果切片中包含漏洞相关代码,则标记为包含对应漏洞,对于程序依赖图中的一个节点,程序切片包括前向切片和后向切片以及通过函数调用到达的程序间前向切片和程序间后向切片,其中前向切片包含从该节点出发能够到达的所有节点,后向切片包括可以到达此节点的所有节点。
28.如图3和图4所示,首先对合约源程序进行标化处理,然后构建函数的控制依赖和数据依赖关系,根据控制依赖和数据依赖关系,得到合约关键全局变量candidate的合约切片,计算出节点36的前向切片和后向切片,最后得到合约切片。如果合约切片中包含漏洞代码,则将该切片标记为漏洞合约。
29.步骤s3的具体操作如下:步骤s31、使用codebert模型将合约切片进行词向量嵌入,生成词向量嵌入矩阵;步骤s32、对较短的词向量进行填充,较长的词向量进行截取,得到长度相同的词向量矩阵;步骤s33、使用lstm网络学习具词向量矩阵来提取公共特征。
30.具体的,步骤3中的codebert模型可以采用word2vec词向量嵌入模型替换,lstm网络可以使用gru循环神经网络模型。
31.步骤s4训练分支的步骤如下:步骤s411、每个分支结构共享来自步骤s3的输入;步骤s412、针对不同类型的漏洞数据,通过步骤s3提取公共特征,仅输入漏洞对应的分支进行训练;步骤s413、更新lstm网络参数和对应漏洞分支的参数。
32.具体的,分支结构包含全连接层和dropout层,它们不共享参数,但共享来自步骤3提取的公共特征特征作为输入。
33.步骤s4漏洞检测的具体步骤如下:步骤s421、步骤s3提取到的待检测合约公共特征,输入每漏洞分支中;步骤s422、每个漏洞分支给出合约对应漏洞的概率;步骤s423、对于新出现的漏洞,参照步骤s1构造新漏洞数据,添加对应新的漏洞分支;具体的,在lstm学习到合约切片的公共特征的基础上,使用多分支结构学习相应漏洞的模式,这些分支结构包含全连接层和dropout层,它们不共享参数,但共享来自特征
提取模块的输入;相比于单分支结构只能学习是否存在漏洞,多分支结构可以输出每个分支对应漏洞的可能性,实现智能合约漏洞多标签分类学习,因为不需要针对每中漏洞重复训练公共特征提取模块,极大提升了模型训练速度。
34.步骤s423中对新漏洞分支训练的具体步骤如下:步骤s4231、冻结步骤s3公共特征的提取和其他漏洞分支的参数;步骤s4232、使用新漏洞数据对新分支进行训练,仅更新新漏洞分支的参数;步骤s4233、将公共特征的提取和其他漏洞分支的参数进行解冻。
35.具体的,面对新增漏洞时,添加新的漏洞分支,使用在现有模型上对新增漏洞数据库进行训练,训练过程中冻结公共特征提取模块和其他漏洞分支的参数,仅学习新增漏洞分支的参数,同时也充分利用了现有模型学习到的特征;在保证其他漏洞检测精度的同时,快速高效地进行新增漏洞学习。
36.尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以理解在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由所附权利要求及其等同物限定。
技术特征:
1.一种检测智能合约漏洞的方法,其特征在于:包括如下步骤:步骤s1、将智能合约进行标化,并标记智能合约中漏洞的位置和漏洞类型,并对漏洞进行修复,制作训练集;步骤s2、生成新漏洞数据库中智能合约的控制流图,通过控制流图得到程序依赖图,生成新漏洞数据库中智能合约的抽象语法树,通过程序依赖图对抽象语法树进行切片处理,并得到合约切片;步骤s3、对合约切片进行标化,提取标化后合约切片的公共特征;步骤s4、在提取的合约切片的公共特征的基础上,利用多分支结构学习相应漏洞的模式并输出对应漏洞的可能性,出现新漏洞时,增加新的漏洞分支结构,并对新的漏洞分支结构单独进行训练。2.根据权利要求1所述的一种检测智能合约漏洞的方法,其特征在于:所述步骤s1的训练集包括漏洞的合约、漏洞类型、漏洞修复方案以及修改后的合约。3.根据权利要求1所述的一种检测智能合约漏洞的方法,其特征在于:所述步骤s1的具体操作如下:步骤s11、通过正则表达式删除智能合约源代码中的注释;步骤s12、消除智能合约源代码中语义相同的控制流语句;步骤s13、将修饰器中的语句插入到使用到修饰器的函数中;步骤s14、定义映射统一的符号和有含义符号的名称;步骤s15、根据swc标准,对存在漏洞的智能合约漏洞出现的行号和漏洞类型进行人工标记。4.根据权利要求1所述的一种检测智能合约漏洞的方法,其特征在于:所述步骤s2的具体操作如下:步骤s21、使用分析工具生成智能合约中目标函数的控制流图;步骤s22、通过控制流图将目标函数的控制依赖和数据依赖信息进行合并,得到程序依赖图;步骤s23、使用编译工具solc编译智能合约的源代码生成抽象语法树;步骤s24、在抽象语法树的基础上结合区块链和智能合约的特性定义漏洞特征;步骤s25、程序依赖图的基础上对智能合约漏洞特征进行切片。5.根据权利要求1所述的一种检测智能合约漏洞的方法,其特征在于:步骤s3的具体操作如下:步骤s31、使用codebert模型将合约切片进行词向量嵌入,生成词向量嵌入矩阵;步骤s32、对较短的词向量进行填充,较长的词向量进行截取,得到长度相同的词向量矩阵;步骤s33、使用lstm网络学习具词向量矩阵来提取公共特征。6.根据权利要求1所述的一种检测智能合约漏洞的方法,其特征在于:步骤s4训练分支的步骤如下:步骤s411、每个分支结构共享来自步骤s3的输入;步骤s412、针对不同类型的漏洞数据,通过步骤s3提取公共特征,仅输入漏洞对应的分支进行训练;
步骤s413、更新lstm网络参数和对应漏洞分支的参数。7.根据权利要求1所述的一种检测智能合约漏洞的方法,其特征在于:步骤s4漏洞检测的具体步骤如下:步骤s421、步骤s3提取到的待检测合约公共特征,输入每漏洞分支中;步骤s422、每个漏洞分支给出合约对应漏洞的概率;步骤s423、对于新出现的漏洞,参照步骤s1构造新漏洞数据,添加对应新的漏洞分支。8.根据权利要求7所述的一种检测智能合约漏洞的方法,其特征在于:步骤s423中对新漏洞分支训练的具体步骤如下:步骤s4231、冻结步骤s3公共特征的提取和其他漏洞分支的参数;步骤s4232、使用新漏洞数据对新分支进行训练,仅更新新漏洞分支的参数;步骤s4233、将公共特征的提取和其他漏洞分支的参数进行解冻。9.根据权利要求1所述的一种检测智能合约漏洞的装置,其特征在于:包括漏洞数据库构建模块、合约切片提取模块、多标签分类与迁移学习模块和公共特征提取模块;所述漏洞数据库构建模块:将智能合约进行标化,并标记智能合约中漏洞的位置和漏洞类型,并对漏洞进行修复,并制作数据集;所述合约切片提取模块:利用分析工具生成新漏洞数据库中智能合约的控制流图,通过控制流图得到程序依赖图,利用编译工具生成新漏洞数据库中智能合约的抽象语法树,通过程序依赖图对抽象语法树进行切片处理,并得到合约切片;所述公共特征提取模块:使用codebert模型对合约切片进行标化,使用lstm网络提取标化后合约切片的公共特征;所述多标签分类与迁移学习模块:在提取的合约切片的公共特征的基础上,利用多分支结构学习相应漏洞的模式并输出对应漏洞的可能性,出现新漏洞时,增加新的漏洞分支结构,并对新的漏洞分支结构单独进行训练。
技术总结
本发明公开了一种检测智能合约漏洞的方法与装置,将程序切片技术应用到智能合约漏洞检测中,结合智能合约特性,构造合约漏洞切片,使用公共特征提取模块和多分支结构进行漏洞特征学习;本发明通过创新性地使用合约切片提取智能合约中的漏洞相关的控制流和数据流信息,对合约切片进行编码输入到公共特征提取层,学习智能合约的公共特征参数,最后使用多分支结构对学习到的公共特征进行多标签分类。面对新增漏洞时,添加新增漏洞对应的分支,使用新增漏洞数据集进行训练,冻结已训练好的公共特征层和其他分支的参数,实现对模型的快速拓展的同时将现有训练数据学习到的特征应用到新增漏洞的学习上。到新增漏洞的学习上。到新增漏洞的学习上。
技术研发人员:李腾 张峰 陈厅 韩朝阳 刘运杰 宋书玮 王东
受保护的技术使用者:杭州后量子密码科技有限公司
技术研发日:2023.07.06
技术公布日:2023/10/6
版权声明
本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
航空之家 https://www.aerohome.com.cn/
飞机超市 https://mall.aerohome.com.cn/
航空资讯 https://news.aerohome.com.cn/