【技术实现步骤摘要】
一种基于图神经网络的智能合约漏洞检测方法及电子设备
[0001]本专利技术涉及智能合约
,具体涉及一种基于图神经网络的智能合约漏洞检测方法及电子设备。
技术介绍
[0002]智能合约是一种由事件驱动的、具有状态的代码合约。随着区块链技术的快速发展,作为区块链核心的智能合约得到了广泛应用,令区块链成为具有一定颠覆性的技术。然而,智能合约中的漏洞带来的巨大经济损失,成了这项技术不得不解决的一项难题,这也加强了人们对智能合约安全问题的关注。
[0003]恶意攻击者可以利用智能合约漏洞获取经济利益,近几年来,智能合约中存在许多被恶意利用的漏洞。2016年著名的DAO事件发生,黑客利用DAO合约的可重入性漏洞窃取了360万以太币,造成了大量经济损失。由于安全漏洞,区块链网络已经遭受了超过100亿美元的损失。而且智能合约一旦部署就不可改变,损失无法挽回。因此,在部署智能合约之前,对其进行有效的漏洞检查至关重要。
[0004]目前区块链领域内还没有公认的智能合约审计手段来检测智能合约代码中是否隐藏有安全漏洞。开始,智能合约的安全性保障工作主要依靠人工。随后,提出了许多方法,如符号执行、形式化验证KEVM、中间表示等,用来检测智能合约的漏洞。这些传统的检测方法主要依赖人工,效率较低,随着智能合约的广泛应用,其数量也在不断增长,传统方法难度加大,适用性不高。
[0005]神经网络在智能合约分析领域也越来越受欢迎,也是智能合约自动化漏洞检测的趋势。应用不同的技术,如长短时记忆(LSTM)建模、卷积神经网络或 ...
【技术保护点】
【技术特征摘要】
1.一种基于图神经网络的智能合约漏洞检测方法,其特征在于,包括如下步骤:S1,收集智能合约源代码数据集,并根据样本是否存在漏洞标记数据集样本;S2,筛选智能合约源代码样本中与漏洞相关的代码片段;S3,通过改进的独热编码算法将S2处理过的代码片段转化成可供神经网络输入的图数据结构表示;S4,构建图神经网络模型,将S3获得的图作为其输入,选用edGNN实现图结构中的节点的向量表示;按照边类型将图结构拆分成两个子图(控制流子图和数据流子图),分别进行图卷积和图池化操作;通过注意力机制聚合三个图的输出,送入分类器进行智能合约漏洞预测;S5,通过源代码图化和训练结束后的混合图神经网络模型进行智能合约源代码的漏洞检测。2.根据权利要求1所述的一种基于图神经网络的智能合约漏洞检测方法,其特征在于,所述S1的实现包括如下:S11,通过以太坊区块链浏览器Etherscan平台上收集智能合约源代码;S12,检测收集到的智能合约源代码,并根据检测结果对其进行标记,检测工具结果显示存在漏洞的智能合约标记为"1",表示该合约存在漏洞,否则标记为"0",根据检测三种漏洞的检测结果,给样本标记标签,存在可重入漏洞则在第一位标注1,否则标注0,存在时间戳依赖漏洞则在第二位标注1,否则标注0,存在无限循环漏洞则在第三位标注1,否则标注0。3.根据权利要求2所述的一种基于图神经网络的智能合约漏洞检测方法,其特征在于,所述S1的实现还包括如下:S13,通过人工审计对标记过的智能合约源代码样本的标签进一步检查修正,以确保样本标记的准确性。4.根据权利要求1所述的一种基于图神经网络的智能合约漏洞检测方法,其特征在于,所述S2的实现包括如下:S21,去除源代码样本中"//"之后到行尾的代码注释和"/*"与"*/"以及其之间的代码注释;S22,结合相关漏洞关键节点筛选出样本中与漏洞相关的代码片段:针对可重入漏洞,选择call.value关键字作为关键节点,通过分析代码中的该关键字的数据依赖关系、控制依赖关系以及调用关系,留下与此节点相关的代码片段,获得关于可重入漏洞的程序切片内容,针对时间戳依赖漏洞,选择block.timestamp关键字作为关键节点,通过分析代码中的该关键字的数据依赖关系、控制依赖关系以及调用关系,留下与此节点相关的代码片段,获得关于时间戳依赖的程序切片内容,针对无限循环漏洞,选择循环关键词for和while作为关键节点,通过分析代码中的调用依赖关系,留下与此节点相关的代码片段,获得关于无限循环漏洞的程序切片内容。5.根据权利要求1所述的一种基于图神经网络的智能合约漏洞检测方法,其特征在于,所述S3的实现包括如下:S31,分析代码片段的数据依赖、控制依赖关系,获得合约疑似漏洞图的节点和边数据,其中把关键节点的类型标记为c,其他相关节点的类型标记为n,分析出变量间的数据依赖
关系边的类型标记为de,分析出量间的控制依赖关系边的类型标记为ce:针对可重入漏洞的代码片段,关键节点为call.value,类型为c,存在call.value的语句作为分析的起点,分析该语句中的变量,类型记作n,并把变量内容按照变量类型记作类型+编号,再分析该语句所属的方法,把方法的类型记作n,内容记作function+编号,然后分析节点间的依赖关系,如果存在数据依赖就在节点间通过de类型的边连接,如果存在控制依赖就在节点间通过ce类型的边连接,最后在关键节点与所在函数节点之间添加一条无向的fallback边,针对时间戳漏洞的代码片段,关键节点为block.timestamp,类型为c,存在call.value的语句作为分析的起点,分析该语句中的变量,类型记作n,并把变量内容按照变量类型记作类型+编号,再分析该语句所属的方法,把方法的类型记作n,内容记作function+编号,然后分析节点间的依赖关系,如果存在数据依赖就在节点间通过de类型的边连接,如果存在控制依赖就在节点间通过ce类型的边连接,针对无限循环漏洞的代码片段,关键节点为call.value,类型为c,存在call.value的语句作为分析的起点,分析该语句中的变量,类型记作n,并把变量内容按照变量类型记作类型+编号,再分析该语句所属的方法,把方法的类型记作n,内容记作function+编号,然后分析节点间的依赖关系,如果存在数据依赖就在节点间通过de类型的边连接,如果存在控制依赖就在节点间通过ce类型的边连接;S32,通过改进的独热编码将提取出的漏洞特征图中节点和边转换为向量:首先统计图中最大节点数目,确定图中节点维度,给每个节点分配独热编码,特殊地,增加节点类别补位,c节点补10,n节点补01,并对节点归一化,得到图中节点的初步表示,边的向量化通过独热编码技术,对de类型表示为100,ce类型的边表示为010,fallback边表示为001,最后得到图的初始表示:H=(V,E,X)其中,V表示图节点集合,|V|=n,n为节点个数,X∈R
(n+2)*d
表示节点的特征矩阵,E∈{0,1}
n*n*c
表示边的特征集合,其中c为边的种类数目,如说明从节点v
i
到节点v
j
有一条类型为l的边。6.根据权利要求1所述的一种基于图...
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。