当前位置: 首页 > 专利查询>河南大学专利>正文

一种基于语法和语义特征融合的智能合约漏洞检测方法及装置制造方法及图纸

技术编号:37537171 阅读:20 留言:0更新日期:2023-05-12 16:05
本发明专利技术公开一种基于语法和语义特征融合的智能合约漏洞检测方法及装置,首先,收集数据集与数据预处理,获取以太坊智能合约,使用加权随机采样方法平衡训练数据集;其次,通过Python中的第三方软件包py

【技术实现步骤摘要】
一种基于语法和语义特征融合的智能合约漏洞检测方法及装置


[0001]本专利技术涉及区块链和信息安全
,尤其涉及一种基于语法和语义特征融合的智能合约漏洞检测方法及装置。

技术介绍

[0002]智能合约由Nick Szabo于1995年提出,定义为“执行合约条款的计算机交易协议”。智能合约以数字形式定义一个合同,当合约参与方满足合约所需的条件时,合约就会自动执行。与传统合约相比,智能合约可以提高交易效率,具有去中心化、不可篡改等特性。智能合约提供了优于传统合约的安全方法,但如其他编程语言一样,智能合约也存在着一些安全漏洞。在以太坊上,绝大部分智能合约负责管理用户的数字资产交易,如果智能合约存在漏洞将会造成数字资产的损失。同时区块链不可篡改的特性使得智能合约一旦产生漏洞就很难修复,因此在智能合约部署上链之前对其进行漏洞检测具有必要性。
[0003]早期的漏洞检测方法按照检测时是否执行代码分为静态分析和动态分析两种方法。静态分析是指在不运行代码的方式下,通过词法分析、语法分析、控制流、数据流分析等技术对程序代码进行自动扫描,发现隐含的程序问题;动态分析方法借助调试器工具,在调试器中运行目标程序,对运行程序的运行状态、内存使用状况和执行路径进行分析,从而发现程序中存在的漏洞。静态分析和动态分析两种方法对智能合约进行检测时都需要依赖专家预先人工定义的规则,检测效率低、时间长。近年来,考虑到深度学习在特征学习方面的优异特性,研究人员开始使用深度学习方法进行漏洞检测,自动从源代码中提取有效特征,不再需要依赖于专家定义的漏洞特征。目前的方法多集中在对源代码单一特征表示的研究,一些模型直接使用程序源代码或二进制文件作为输入,提取与字符流相关的标识符、函数名和运算符等关键特征信息;或将源代码转为抽象语法树,从抽象语法树中提取源代码的语法特征。但由于源代码中特征具有多样性,对源代码进行单一的代码表征不能保留其丰富的语法和语义信息,因此在运用深度学习方法进行漏洞检测时需要考虑如何构建合适的数据表征方式最大程度的提取与漏洞相关的特征信息。

技术实现思路

[0004]本专利技术的目的是提供一种基于语法和语义特征融合的智能合约漏洞检测方法及装置,解决目前智能合约漏洞检测模型中代码表征单一的问题,以联合方式提取智能合约源代码特征,增强代码表征能力,提高智能合约漏洞检测的准确性。
[0005]为了实现上述目的,本专利技术采用以下技术方案:
[0006]本专利技术一方面提出一种基于语法和语义特征融合的智能合约漏洞检测方法,包括:
[0007]步骤1:收集智能合约源代码,分别统计存在漏洞的智能合约的数量与不存在漏洞的智能合约的数量,若无漏洞合约数量与有漏洞合约数量之比大于2,则使用加权随机采样
方法平衡智能合约数据集;
[0008]步骤2:将智能合约源代码转为抽象语法树(Abstract Syntax Tree,AST)形式,经过标准化和序列化操作将抽象语法树转化为token序列,使用词嵌入模型Word2vec对token序列的每个token进行嵌入表示;
[0009]步骤3:将源代码编译为字节码,通过字节码获取智能合约的控制流图(Control Flow Graph,CFG),使用Word2vec向量化控制流图节点中的每个操作码,然后对控制流图节点的操作码加权求和获取控制流图的节点特征;
[0010]步骤4:使用文本分类模型Text CNN从抽象语法树token序列中获取语法特征;使用图神经网络学习控制流图的语义和结构嵌入获取语义特征;结合语法向量和语义向量,利用多层感知机对语法和语义特征融合向量进行学习以训练检测器;
[0011]步骤5:获取待检测合约的抽象语法树和控制流图,利用嵌入矩阵和训练得到的检测器实现智能合约源代码的漏洞检测。
[0012]进一步地,所述步骤1中,加权随机采样方法包括:
[0013]计算每个智能合约的权重,权重为该合约所对应的类别的合约总数的倒数,然后利用每个合约的权重值对合约进行采样,构造数据集。
[0014]进一步地,所述步骤2包括:
[0015]步骤2.1:获取智能合约的抽象语法树:使用python第三方软件包py

solc

x构建智能合约的抽象语法树,将智能合约源代码转换为树状结构的抽象语法树;
[0016]步骤2.2:对抽象语法树进行规范化:获取智能合约中用户定义的合约名称列表、函数名称列表和变量名称列表,将用户定义的合约名称、函数名称、变量名称表示为contract_c、function_f、var_v,c、f、v表示合约名称、函数名称、变量名称在列表中的索引,并在抽象语法树中进行替换;
[0017]步骤2.3:对合约的抽象语法树进行序列化:按照深度优先遍历抽象语法树的所有节点,将树状结构的抽象语法树转化为token序列,在进行序列化操作时仅保留抽象语法树的一些关键信息,忽略表示代码位置、节点id的一些次要信息;
[0018]步骤2.4:对合约的抽象语法树进行向量化:运用word2vec将智能合约源代码对应的token序列向量化,将每个token表示为一个具有相同维度的向量,从而将序列化后的抽象语法树表示为向量形式,得到抽象语法树特征向量;
[0019]步骤2.5:对特征向量进行截断和填充,将其表示为一个具有固定长度L的向量,当向量长度小于L时用零填充,向量长度大于L时进行截断。
[0020]进一步地,所述步骤3包括:
[0021]步骤3.1:获取智能合约的控制流图:首先将智能合约编译为opcode,然后通过python第三方软件包evm_cfg_builder将opcode转换为控制流图;
[0022]步骤3.2:控制流图中的每个块包含了源代码的操作码,通过Word2vec对操作码进行词嵌入表示,获得每个操作码的向量表示;
[0023]步骤3.3:通过TF

IDF加权平均词向量获取控制流图的节点特征:将每个操作码按照TF

IDF获取权重,根据权重将控制流图节点的操作码加权平均,控制流图的每个节点得到一个固定长度的向量,将该向量作为图节点的特征。
[0024]进一步地,所述步骤4包括:
[0025]步骤4.1:将智能合约的抽象语法树拆分为多个小的contract级别的抽象语法树;
[0026]步骤4.2:使用Text CNN提取抽象语法树的语法特征,包括:
[0027]1)输入抽象语法树特征向量;
[0028]2)定义多个不同宽度的一维卷积核,分别对输入向量执行卷积计算,捕获不同数目的相邻词元之间的局部特征;
[0029]3)在所有输出通道上执行自适应平均池化,然后将所有标量汇聚输出连接为向量,最终获得智能合约的语法特征向量;
[0030]步骤4.3:使用图神经网络对控制流图进行图嵌入表示,得到代表整个控制流图的图嵌入向量,将该向量作为源代码的本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于语法和语义特征融合的智能合约漏洞检测方法,其特征在于,包括:步骤1:收集智能合约源代码,分别统计存在漏洞的智能合约的数量与不存在漏洞的智能合约的数量,若无漏洞合约数量与有漏洞合约数量之比大于2,则使用加权随机采样方法平衡智能合约数据集;步骤2:将智能合约源代码转为抽象语法树形式,经过标准化和序列化操作将抽象语法树转化为token序列,使用词嵌入模型Word2vec对token序列的每个token进行嵌入表示;步骤3:将源代码编译为字节码,通过字节码获取智能合约的控制流图,使用Word2vec向量化控制流图节点中的每个操作码,然后对控制流图节点的操作码加权求和获取控制流图的节点特征;步骤4:使用文本分类模型Text CNN从抽象语法树token序列中获取语法特征;使用图神经网络学习控制流图的语义和结构嵌入获取语义特征;结合语法向量和语义向量,利用多层感知机对语法和语义特征融合向量进行学习以训练检测器;步骤5:获取待检测合约的抽象语法树和控制流图,利用嵌入矩阵和训练得到的检测器实现智能合约源代码的漏洞检测。2.根据权利要求1所述的一种基于语法和语义特征融合的智能合约漏洞检测方法,其特征在于,所述步骤1中,加权随机采样方法包括:计算每个智能合约的权重,权重为该合约所对应的类别的合约总数的倒数,然后利用每个合约的权重值对合约进行采样,构造数据集。3.根据权利要求1所述的一种基于语法和语义特征融合的智能合约漏洞检测方法,其特征在于,所述步骤2包括:步骤2.1:获取智能合约的抽象语法树:使用python第三方软件包py

solc

x构建智能合约的抽象语法树,将智能合约源代码转换为树状结构的抽象语法树;步骤2.2:对抽象语法树进行规范化:获取智能合约中用户定义的合约名称列表、函数名称列表和变量名称列表,将用户定义的合约名称、函数名称、变量名称表示为contract_c、function_f、var_v,c、f、v表示合约名称、函数名称、变量名称在列表中的索引,并在抽象语法树中进行替换;步骤2.3:对合约的抽象语法树进行序列化:按照深度优先遍历抽象语法树的所有节点,将树状结构的抽象语法树转化为token序列,在进行序列化操作时仅保留抽象语法树的一些关键信息,忽略表示代码位置、节点id的一些次要信息;步骤2.4:对合约的抽象语法树进行向量化:运用word2vec将智能合约源代码对应的token序列向量化,将每个token表示为一个具有相同维度的向量,从而将序列化后的抽象语法树表示为向量形式,得到抽象语法树特征向量;步骤2.5:对特征向量进行截断和填充,将其表示为一个具有固定长度L的向量,当向量长度小于L时用零填充,向量长度大于L时进行截断。4.根据权利要求1所述的一种基于语法和语义特征融合的智能合约漏洞检测方法,其特征在于,所述步骤3包括:步骤3.1:获取智能合约的控制流图:首先将智能合约编译为opcode,然后通过python第三方软件包evm_cfg_builder将opcode转换为控制流图;步骤3.2:控制流图中的每个块包含了源代码的操作码,通过Word2vec对操作码进行词
嵌入表示,获得每个操作码的向量表示;步骤3.3:通过TF

IDF加权平均词向量获取控制流图的节点特征:将每个操作码按照TF

IDF获取权重,根据权重将控制流图节点的操作码加权平均,控制流图的每个节点得到一个固定长度的向量,将该向量作为图节点的特征。5.根据权利要求1所述的一种基于语法和语义特征融合的智能合约漏洞检测方法,其特征在于,所述步骤4包括:步骤4.1:将智能合约的抽象语法树拆分为多个小的contract级别的抽象语法树;步骤4.2:使用Text CNN提取抽象语法树的语法特征,包括:1)输入抽象语法树特征向量;2)定义多个不同宽度的一维卷积核,分别对输入向量执行卷积计算,捕获不同数目的相邻词元之间的局部特征;3)在所有输出通道上执行自适应平均池化,然后将所有标量汇聚输出连接为向量,最终获得智能合约的语法特征向量;步骤4.3:使用图神经网络对控制流图进行图嵌入表示,得到代表整个控制流图的图嵌入向量,将该向量作为源代码的语义特征向量,使用消息传递机制进行图训练;步骤4.4:将对应的语法特征向量和语义特征向量进行拼接,得到语法和语义特征融合向量;步骤4.5:将语法和语义特征融合向量输入多层感知机进行二分类,“0”为无漏洞,“1”为有漏洞;步骤4.6:对模型训练多次,不断调整和优化模型参数,得到一个性能较优的漏洞检测...

【专利技术属性】
技术研发人员:韩道军李秋月张磊许涛贾培艳沈亚田丁文珂肖琦李云松王泽民王耀琪王在朝
申请(专利权)人:河南大学
类型:发明
国别省市:

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

1