一种基于机器学习的合约漏洞处理方法

文档序号:31930719发布日期:2022-10-26 00:18阅读:32来源:国知局
一种基于机器学习的合约漏洞处理方法

1.本发明属于机器学习、区块链技术领域,具体涉及一种基于机器学习的合约漏洞处理方法。


背景技术:

2.智能合约是将以"数字加密货币"技术为主的区块链1.0时代转向"可编程金融"技术为主的区块链2.0时代的桥梁,随着智能合约的数量越多,这吸引了许多黑客利用合约的漏洞盗取资金,由于合约一旦上链就无法更改,目前主流的方法依赖领域专家总结漏洞模式,制定有针对性的漏洞模板,这种方法的局限是自动化程度低、依赖人工对代码进行观察以及泛化性弱。
3.为了避免合约参与者在交易过程中造成经济损失,针对智能合约的漏洞检测开始被人们重视起来,当前智能合约检测方向主要分为以下五类:(1)基于代码特征或者模式的漏洞检测;(2)基于形式化验证的漏洞检测;(3)基于模糊测试的漏洞检测;(4)基于符号执行的漏洞检测;(5)基于深度学习方法的漏洞检测。
4.其中前四种方法主要依赖于领域专家总结漏洞特征或漏洞模式,其存在以下两点共性问题(1)自动化程度低,每个漏洞都需要人工分析漏洞特征或者漏洞模式;(2)泛化性低,一款工具因为自身机制的限制,导致他们只能检测一些特定的漏洞,比如oyente只能检测出5种漏洞,securify只分析7种漏洞,mythril只分析10种漏洞。
5.深度学习方法可以通过其自身对数据进行挖掘,从数据中学习其隐含的代码特征,然而当深度学习技术直接应用于智能合约漏洞检测中,将会遇到如下三大挑战:
6.第一,深度学习模型效果好坏很大程度上依赖于数据集,但是目前尚不存在一个标签良好的智能合约漏洞数据集;现有的数据集大多采取一些现有工具(如mythril、securify和oyente)联合标注获得,通过这种方法获得的数据集通常不够准确;如果对联合标注的结果取交集,将导致漏报率偏高,比如交易顺序依赖漏洞只有mythril工具能够检测,取交集导致出现这个漏洞的合约被标记为安全;如果对联合标注的结果取并集,将导致误报率偏高。
7.第二,现有的深度学习应用于漏洞检测相关研究中,缺乏对区块链领域特征的考虑,如某人通过bag-of-feature的方式将函数特征信息编码为向量,虽然取得了一定效果,但是缺乏对区块链自身的领域特征的考虑,根据我们的观察发现,有大量漏洞是智能合约所特有的代码特性导致的,比如solidity特有的call.value()内置函数就可能会导致可重入漏洞,address.send()可能导致未校验返回值漏洞。
8.第三,solidity源代码丢进模型训练面临着两个问题:1.solidity源代码是非结构化的,而结构化的数据更便于深度学习模型模型提取其语义特征;2.模型在学习漏洞代码模式时,容易受到与漏洞逻辑无关的代码段,即所谓的”噪声”影响,因此如何尽可能的让模型关注到关键函数,去除“噪声”影响,减少误报是一个需要考虑的问题。


技术实现要素:

9.为解决现有技术中存在的上述问题,本发明提供了一种基于机器学习的合约漏洞处理方法,具有泛化性好、能够识别多种类型漏洞以及自动化程度高的特点。
10.为实现上述目的,本发明提供如下技术方案:一种基于机器学习的合约漏洞处理方法,包含如下处理步骤:
11.步骤一:根据漏洞判断依据,总结出漏洞类型为12类、区块链漏洞领域特征31种,作为人工打标签的依据;
12.步骤二:根据漏洞判断依据,从etherscan上爬取的9000余个真实发生的智能合约进行人工打标签;
13.步骤三:将非结构化的solidity源代码序列通过代码切片划分,得到结构化的代码序列;
14.步骤四:对代码序列进行词嵌入矩阵的构建,在构建词嵌入矩阵时嵌入区块链领域特征,通过采用word2vec模型针对代码切片进行词向量训练,得到训练好的词向量模型;
15.步骤五:模型训练,通过对多种神经网络模型在相同的实验环境和数据集的条件下进行训练,并对模型参数进行不断调整优化,最终得到效果最佳的神经网络模型和模型参数。
16.作为本发明的一种优选技术方案,在步骤一和步骤二中,漏洞判断依据包括swc-registry、dasp top10、smartbugs。
17.作为本发明的一种优选技术方案,在步骤一中,漏洞类型包括solidity源码层、evm虚拟机层、区块链系统层。
18.作为本发明的一种优选技术方案,在步骤二中,还包括人工构建公共数据集和真实合约数据集两个数据集,具体为:
19.公共数据集:从etherscan平台爬取4545个合约,按照设定好的漏洞规则人工打标签;
20.真实合约数据集:从dasp top10、smartbugs和swc已经标注好的智能合约漏洞中针对每一种类型的漏洞都找10份智能合约源码。
21.作为本发明的一种优选技术方案,在步骤四中,还包括在构建词嵌入矩阵时对包含区块链领域信息的词进行加权。
22.作为本发明的一种优选技术方案,在步骤五中,多种神经网络模型包括循环神经网络、文本卷积神经网络、长短期记忆神经网络、双向长短期记忆神经网络。
23.作为本发明的一种优选技术方案,在步骤五中,调整优化的模型参数包括隐藏层层数、学习率、epoch、训练迭代数量。
24.与现有技术相比,本发明的有益效果是:本发明的合约漏洞处理方法,通过机器学习的方法自动学习漏洞代码模式,不必依赖于人工总结漏洞模式,泛化性好,能够识别多种类型漏洞,自动化程度高;由于solidity代码有其独有的代码领域特征,而漏洞的发生往往都与这些领域特征有着相关性,本方法引入注意力机制,使得模型关注区块链领域特征,提升模型预测漏洞能力。
附图说明
25.附图用来提供对本发明的进一步理解,并且构成说明书的一部分,与本发明的实施例一起用于解释本发明,并不构成对本发明的限制。在附图中:
26.图1为本发明的实施流程示意图;
27.图2为本发明中的bilstm
att
模型框架示意图;
具体实施方式
28.下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
29.请参阅图1-图2,本发明提供以下技术方案:一种基于机器学习的合约漏洞处理方法,包含如下处理步骤:
30.步骤一:根据swc-registry、dasp top10、smartbugs,总结出漏洞类型为12类、区块链漏洞领域特征31种,作为人工打标签的依据,其中,漏洞类型包括solidity源码层、evm虚拟机层、区块链系统层,如下表所示。
31.领域特征类别表
[0032][0033]
步骤二:根据swc-registry、dasp top10、smartbugs,从etherscan上爬取的9000余个真实发生的智能合约进行人工打标签;
[0034]
步骤三:将非结构化的solidity源代码序列通过代码切片划分,得到结构化的代码序列;
[0035]
步骤四:对代码序列进行词嵌入矩阵的构建,在构建词嵌入矩阵时嵌入区块链领域特征,通过采用word2vec模型针对代码切片进行词向量训练,得到训练好的词向量模型,此外,考虑到合约漏洞和区块链领域特征密切相关,在构建词嵌入矩阵时对包含区块链领域信息的词进行加权;
[0036]
智能合约切片化后,需要将其转换为深度学习可以处理的向量形式,本发明选用word2vec模型来作为word embdding的方法,word2vec是利用浅层神经网络学习词嵌入最常用的技术之一,word2vec可以将词转换为低纬稠密的向量来表示,避免了one-hot可能纬度过高而导致的纬度灾难问题,word2vec有两个重要的模型cbow模型和skip-gram模型,两个模型的根本区别cbow是从上下文预测目标词,skip-gram模型是从目标词预测上下文,cbow具有更快,对于高频词有更好的表示,基于此,本发明采用了cbow模型。
[0037]
假设智能合约代码包含词大小为v,最终词向量的维度为n,每个词的one-hot纬度为1*v,上下文词个数为c,w为权重矩阵,其纬度为v*n,w’为隐藏层权重矩阵,其纬度为n*v。
[0038]
cbow模型训练过程为首先隐藏层输入one-hot编码,当输入的上下文词有多个时,cbow计算隐藏层输出并不是直接复制输入上下文词的one-hot向量,而是通过取c个上下文词向量求平均,最终得到输出层的向量h,计算公式如下:
[0039][0040]
输出层中每个节点的输入其中代表权重矩阵w

的第j行向量,输出层最终通过softmax获得词表中每个单词为中心词的概率p,通过不断训练使得概率p达到最大。
[0041][0042]
在word2vec词向量训练的时候,由于智能合约具有其独特的领域特征,且智能合约漏洞的发生与其具有强相关性,因此本文在构建词嵌入矩阵时对前述领域特征类别表中出现的领域特征赋与更高的权重,首先将这行合约中每个词变为one-hot形式传入输入层,乘以特征矩阵w
v*n
,得到n*1维的隐藏层向量hi,对在输出层的输入u进行处理,原本word2vec模型中uj=h*w

,若该词为领域特征时,则uj=h*w

*2,使得该词具有更高的权重,最后对uj进行softmax归一化,得到v纬的词向量。
[0043]
步骤五:模型训练,通过对多种神经网络模型在相同的实验环境和数据集的条件下进行训练,并对模型参数进行不断调整优化,最终得到效果最佳的神经网络模型和模型参数,其中,调整优化的模型参数包括隐藏层层数、学习率、epoch、训练迭代数量,多种神经网络模型包括循环神经网络、文本卷积神经网络、长短期记忆神经网络、双向长短期记忆神经网络。
[0044]
a、对于模型训练:
[0045]
在附图2中展示了bilstm
att
模型框架,首先对智能合约源代码预处理后得到切片序列,由嵌入层预先训练好的word2vec模型对该切片序列进行初始化,得到向量后传入bilstm层得到合约代码特征h=[h1,h2,h3

hi];双向长短期神经网络用特殊的结构替换
循环神经网络的节点,包括前向传播和后向传播,通过前向遍历x1到xi和后向遍历xi到x1分别得到两个向量h
left
和h
right
,然后将两个向量连接,得到输出向量h,计算公式如下,其中表示连接的函数,l是单向lstm的大小。
[0046][0047]
经过bilstm层后得到的输出向量,进入attention层,attention层的主要作用对于每一个词特征hi分配一个权重ωi,最后通过加权求和函数,计算句子中的特征r,假设h是i个词经过bilstm层后得到的向量集合,h=[h1,h2,h3

hi],dw表示向量的纬度,w
t
表示需要学习的参数,具体计算公式如下:
[0048]
m=tan(h)
[0049]
α=softmax(w
t
m)
[0050]
r=hα
t
[0051]
最终用于分类的向量h
*
=tanh(r),针对一个智能合约代码切片s,经过embedding、bilstm层和attention层后,得到最终用于分类的向量h
*
,传入output层,得到最终的预测结果。
[0052]
p(y|s)=softmax(w
(s)h*
+b
(s)
)
[0053]
得到预测值p后,根据预测值与漏洞的标签偏差loss,不断调整w和b,定义y
*
是模型预测样本为有漏洞的概率,y是样本标签,有漏洞为1否则为0,计算loss的公式如下:
[0054]
loss=-(y
×
log(y
*
)+(1-y)log(1-y
*
))
[0055]
最后通过梯度下降公式进行迭代训练,得到最优权重,定义为神经网络学习效率因子一般为0.1、0.01,需要不断根据模型效果调优,loss
×
q为梯度,具体公式如下:
[0056][0057]
模型经过不断的迭代学习最终得到具有最优参数组合的深度学习模型。
[0058]
b、对于漏洞检测:
[0059]
智能合约漏洞检测可以简化地看为是一个二分类问题,我们使用precision(精确率)、recall(召回率也被称为查全率)、f1-score评价模型的性能:
[0060]
precision(精确率):在预测为正类即有漏洞的样本中占所有真正有漏洞的合约样本的比例,计算公式如下:
[0061][0062]
recall(召回率也被称为查全率):在所有正类样本中预测为正类的比例,衡量模型的查全率,recall值越高,模型查的越全面,计算公式如下:
[0063][0064]
f1-score:综合考虑了precision和recall两个指标,对这两个值进行加权调和平均,可以很好的反映模型的好坏,f1-score越高,模型质量越好。具体计算公式如下:
[0065]
[0066]
c、总结:
[0067]
针对第一个挑战,本发明考虑从智能合约漏洞分类划分和人工打标签两方面考虑,在智能合约漏洞分类划分方面,本文通过整理总结dasp top10、smartbugs和swc等现有漏洞划分中,将合约漏洞归纳为12类,人工打标签方面,本发明选择有经验的专业人员来独立为合约打标签,如果所选人员所打的标签不同,则选择具有多年合约开发经验的区块链领域专家进行判断。
[0068]
针对第二个挑战,本发明从代码特征强化和模型选型两方面进行考虑,在代码特征强化方面,本发明总共归纳总结了27种与智能合约漏洞相关的领域特征(如导致可重入漏洞的call.value内置函数),在模型训练时让模型更加关注与区块链领域特征;在模型选型方面,本发明设计了多组实验分析不同深度学习模型(rnn、birnn、lstm、bilstm)的效果并得到最符合智能合约漏洞检测任务的模型。
[0069]
针对第三个挑战,本发明从模型优化和代码切片两方面考虑,在代码切片方面,本发明通过对每个合约切割其代码,并去除噪音,最后用列表来表达这个合约;在模型优化方面通过引入attention机制对与智能合约漏洞相关的领域特征代码进行加权,促使模型更关注与区块链合约漏洞相关的代码领域特征,忽视无关信息。
[0070]
根据上述针对挑战的对策分析,本发明归纳了12种合约漏洞类型,统计出27种与漏洞相关的区块链系统及程序语言领域特征,并采用了rnn、birnn、lstm、bilstm四种深度学习模型,得到效果最好的为bilstm模型,并引入了注意力机制使模型更加关注与合约漏洞相关的领域特征,学习漏洞模式。
[0071]
具体地,本实施例中,为评估本文提出的深度学习模型效果,本发明的方法准备了人工构建公共数据集和真实合约数据集两个数据集,具体为:
[0072]
公共数据集:从etherscan平台爬取4545个合约,按照设定好的漏洞规则人工打标签;
[0073]
真实合约数据集:根据划分的12种类型的合约漏洞,从dasp top10、smartbugs和swc已经标注好的智能合约漏洞中针对每一种类型的漏洞都找10份智能合约源码。
[0074]
d、围绕人工构建公共数据集和真实合约数据集两个数据集,发明给出4个研究问题(rq)及其结论:
[0075]
rq1:不同神经网络模型对漏洞检测的效果比较与分析:
[0076]
基于公共数据集dataset1对rnn、birnn、lstm、bilstm四种神经网络模型进行训练测试,结果表明在f1值上,birnn、bilstm高于rnn和lstm,说明在检测智能合约漏洞时,双向神经网络优于循环神经网络,其中bilstm更适用于智能合约漏洞检测任务。
[0077]
rq2:注意力机制对漏洞检测的效果比较与分析:
[0078]
基于公共数据集dataset1对bilstm深度学习模型和bilstm层后加入了attention层的bilstmatt深度学习模型进行训练,结果表明加入注意力机制后f1-score值提高了2.56%,说明注意力机制在一定程度上能够有助于提取代码序列中重要的信息。
[0079]
rq3:领域特征对漏洞检测的效果比较与分析:
[0080]
分别通过嵌入领域特征和不嵌入领域特征得到词向量模型vec0和vec1,采用不含领域特征训练的词向量vec0训练模型得到bilstmatt0,采用含领域特征训练的词向量vec1训练模型得到bilstmatt1,基于公共数据集dataset1对bilstmatt0和bilstmatt1进行训
练;结果表明bilstmatt1的f1-score相比于bilstmatt0提高了6.90%,为了进一步探究领域特征对于模型的影响,使用dataset2真实数据集中的合约对bilstmatt0和bilstmatt1进行测试比较,分析领域特征对于各种类型的漏洞检测能力,结果表明bilstmatt1相较于bilstmatt0的f1值在预测重入漏洞、未校验返回值、合约权限控制、tx.orgin、时间戳依赖和伪随机数漏洞的效果上有一定程度提升,这是因为,这几类漏洞的发生与区块链的solidity编程语言的领域特征密切相关。
[0081]
rq4:与目前传统方法获得的分析工具(oyente、smartcheck、mythril、slither、smartcheck、securify)相比:
[0082]
基于公共数据集dataset1对本文模型和六款主流漏洞检测工具(oyente、mythril、osiris、slither、smartcheck、securify)进行比较,结果表明本发明方法f1-score优于其它六款工具,说明综合能力更强。
[0083]
e、关于利用本发明方法进行漏洞检测的规则:
[0084]
对待检测的智能合约,首先根据制定的策略对关键函数进行切片;再将代码切片经过word2vec转换为向量,再转换时对领域特征词赋与更高的权重,最后将向量传入bilstm深度学习模型,得到向量集合h=[h1,h2,h3

hi];再进入attention层,对每一个词特征hi分配一个权重ωi,通过加权求和函数计算隐藏状态以产生因此在句子中的特征r,得到最终用于分类的向量h
*
,最后经过传输层得到对合约的预测结果p,如果p接近1则表明有漏洞,反之则无漏洞。
[0085]
f、神经网络模型对于最终的漏洞检测效果的影响:
[0086]
本发明针对四种不同的深度学习模型包括:rnn、birnn、lstm、bilstm,将公共数据集dataset1按照8:1:1的比例划分训练集、验证集和测试集,在模型参数和实验环境一致的情况下,训练模型得到实验结果如下表所示:
[0087]
各机器学习模型效果比较
[0088] accuracyprecisionrecallf1-scorernn61.65%81.79%60.96%69.85%birnn65.39%84.36%64.46%73.08%lstm74.39%89.47%73.59%80.76%bilstm81.36%92.14%81.37%86.42%
[0089]
由上表可以发现在深度学习模型中,birnn、bilstm比rnn和lstm的f1-score值都高,说明在检测智能合约漏洞时,双向神经网络优于循环神经网络,这是由于单向神经网络的下一次输出仅受之前的输入所影响的,而双向神经网络是由之前的输入和之后的输入所组成的若干个神经元所共同决定的,智能合约的每一行代码,其上下文代码之间联系密切,某一行的代码存在的漏洞,一般是由于其前后若干行代码所共同决定的,因此在处理智能合约漏洞检测问题时,双向神经网络的recall值和f1-score值都优于单向神经网络。
[0090]
基于前述rq1可知双向长短期记忆神经网络相较于其它三款神经网络模型有更好的效果,因此引入注意力机制评估其对双向长短期记忆神经网络模型的一个影响,首先通过嵌入领域特征构建词嵌入矩阵,再针对bilstm深度学习模型和bilstm层后加入了attention层的bilstm
att
深度学习模型,将dataset1按照8:1:1的比例划分训练集、验证集和测试集,在模型参数和实验环境一致的情况下,训练模型得到实验结果如下表所示:
[0091]
bilstm深度学习模型和bilstm
att
实验对比
[0092][0093][0094]
由上表可知,bilstm
att
相较于bilstm的recall和f1-score都有一定的提高,这表明注意力机制有助于于提高模型检测漏洞的能力,这是由于在没有attention机制时,模型对于每一个合约代码token的重要程度都是认为是一样的,但是实际上,每一个代码token对于整条代码语句的一个影响应该是不一样的,而注意力机制有助于模型对于代码序列中每一个代码token的重要程度进行排序,有助于模型检测漏洞合约。
[0095]
g、为了进一步探究领域特征是否有助于深度学习模型的学习:
[0096]
将dataset1中的合约词嵌入矩阵处理时,分别通过嵌入领域特征和不嵌入领域特征得到词向量模型vec0和vec1,采用不含领域特征训练的词向量vec0训练bilstm
att
深度学习模型得到bilstm
att0
,采用含领域特征训练的词向量vec1训练bilstm
att
深度学习模型得到bilstm
att1
,得到的实验结果如下表所示:
[0097]
bilstm
att0
和bilstm
att1
模型效果比较
[0098] accuracyprecisionrecallf1-scorebilstm
att0
72.61%87.37%72.96%79.52%bilstm
att1
81.36%92.14%81.37%86.42%
[0099]
根据上表可知,领域特征在一定程度上可以提升模型预测漏洞能力。
[0100]
h、为了进一步探究领域特征是如何对模型效果产生影响的:
[0101]
使用dataset2真实数据集中的合约对bilstm
att0
和bilstm
att1
进行测试比较,分析领域特征对于各种类型的漏洞检测能力其影响程度进行分析,以f1-score作为模型效果的评价指标,实验结果如下表所示:
[0102]
bilstm
att0
和bilstm
att1
模型效果比较
[0103]
score指标值上表现得优于传统漏洞检测工具,但是在precision指标上表现低于其它几款工具(oyente、mythril和slither),这是因为1、安全合约是由这六款工具联合标注而来;2、这几款工具非常偏向预测合约为安全,除非有很大把握的才会预测为漏洞;这导致有些具备漏洞的合约被认为是安全的,fn偏高,由于recall=tp/(tp+fn),所以在recall上表现的值不好,而precision=tp/(tp+fp),他们非常有把握才预测漏洞,失败的情况很少,fp很低,导致precision便高;因为智能合约一旦被部署就不可修改,我们应该尽可能找出所有潜在漏洞,但一旦有漏洞没找到,将可能直接导致经济损失,符合智能合约漏洞检测模型的要求应该是:模型牺牲一定的precision以换取更高的recall值,并且本发明方法最终的f1-score优于其它六款工具,说明综合能力更强。
[0111]
在这里示出和描述的所有示例中,任何具体值应被解释为仅仅是示例性的,而不是作为限制,因此,示例性实施例的其他示例可以具有不同的值。
[0112]
应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
[0113]
另外,在本发明实施例的描述中,除非另有明确的规定和限定,术语“安装”、“相连”、“连接”、“设置”、“设有”等应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或一体地连接;可以是机械连接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连,可以是两个元件内部的连通,对于本领域的普通技术人员而言,可以具体情况理解上述术语在本发明中的具体含义。
[0114]
最后应说明的是:以上所述仅为本发明的优选实施例而已,并不用于限制本发明,尽管参照前述实施例对本发明进行了详细的说明,对于本领域的技术人员来说,其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1