一种基于静态分析和深度学习的智能合约安全检测方法与流程

专利2022-05-10  37



1.本发明涉及区块链智能合约安全技术领域,具体涉及一种基于静态分析和深度学习的智能合约安全检测方法。


背景技术:

2.智能合约(smart contract)是部署在区块链的一种特殊协议。buterin确定了分散计算在交易之外的适用性,并设计了以太坊区块链,该区块链支持智能合约的执行。智能合约包含了代码函数,其功能包括交易、决策、以及发送以太币等。智能合约已被证明适用于许多方面,包括证券、通信、银行、医疗等领域。但是智能合约存在透明性的特点,即参与者都可以查看智能合约的源代码。而且智能合约具有一旦部署就不能更改的特性,导致智能合约发现漏洞后不能及时进行软件更新,只能通过暂停交易或分叉等手段减少损失。如不对智能合约进行安全检测,无法及时得到修复,这不仅影响着智能合约功能的正常使用,甚至可能损害智能合约用户的利益引发严重的后果。如dao攻击事件:匿名黑客利用智能合约的可重入漏洞,骗取了360万以太币;奇偶破解事件:蓄意破坏者找到了智能合约代码库中的时间戳漏洞,利用时间戳不一致问题,摧毁了该代码库,造成了1.5亿美元的损失;恶意合同事件:五位黑客恶意发布了34000个存在问题的智能合约,导致以太坊复杂化,产生了异常的链式反应,导致价值440万美元的以太币被盗取。在如此严峻的安全威胁的形势下,当前仍没有较好的通用手段来检测智能合约漏洞,智能合约安全保障依然主要依赖于合约开发者的安全技术水平以及基于专家经验的代码审计。由此,有效的自动化检测智能合约安全性的方案亟待提出。现有的自动化安全检测存在以下问题:1.无法对智能合约代码进行全覆盖分析,2.安全检测的误报率高,3.只关注特定的攻击,不容易扩展到检测其他攻击。


技术实现要素:

3.针对上述现有技术存在的不足,本发明提供一种基于静态分析和深度学习的智能合约安全检测方法,旨在解决智能合约安全检测问题。
4.本发明的技术方案为:
5.1.一种基于静态分析和深度学习的智能合约安全检测方法,其特征在于,包括下述步骤:
6.步骤1:对智能合约solidity源程序进行静态分析得到智能合约solidity源程序的图结构;所述静态分析包括词法分析和语法分析;所述图结构包括抽象语法树ast和控制流图cfg;
7.步骤2:从步骤1得到的solidity源程序的图结构中提取出抽象事实;
8.步骤3:根据步骤2得到的solidity源程序的抽象事实,搭建用于对solidity源程序进行漏洞分类的深度学习模型,该深度学习模型包括:输入模块,注意力模块,残差连接模块和输出模块;
9.步骤4:构建所述深度学习模型的训练数据集;
10.步骤5:利用所述训练数据集对所述深度学习模型进行训练;
11.步骤6:利用训练好的深度学习模型对输入的智能合约进行漏洞检测,输出智能合约solidity源程序的安全检测结果。
12.进一步地,根据所述的基于静态分析和深度学习的智能合约安全检测方法,所述步骤1具体包括如下步骤:
13.步骤1.1:对智能合约solidity源程序进行预处理,删除与solidity源程序安全检测无关的所有内容;
14.步骤1.2:对预处理后的智能合约solidity源程序导入import语句对应的源代码文件,得到完整的solidity源程序;
15.步骤1.3:针对完整的solidity源程序,使用antlr分析器将solidity源程序转换为抽象语法树;
16.步骤1.4:根据抽象语法树构造solidity源程序的控制流图cfg。
17.进一步地,根据所述的基于静态分析和深度学习的智能合约安全检测方法,所述步骤1.3具体包括如下步骤:
18.步骤1.3.1:使用antlr分析器对完整的solidity源程序进行词法分析,按照预定义的单词属性类别,对solidity源程序中单词的属性进行标注,得到与每个程序语句对应的具有单词属性标注的单词序列;
19.步骤1.3.2:针对词法分析生成的每个程序语句对应的单词序列,使用antlr分析器进行语法分析,按照预定义的语法规则确定每个程序语句的语法结构;所述语法结构包括合约结构、函数结构、变量结构、表达式结构与语句控制流结构;
20.步骤1.3.3:根据每个程序语句的语法结构,使用antlr分析器将solidity源程序转换为抽象语法树。
21.进一步地,根据所述的基于静态分析和深度学习的智能合约安全检测方法,所述单词属性类别,包括关键字<keyword>、可见性定义符<qualifier>、变量数据类型<variabletype>、标识符<identifier>、运算符<operator>以及常量<constant>。
22.进一步地,根据所述的基于静态分析和深度学习的智能合约安全检测方法,所述预定义的语法规则如下:
23.a)contract::=”contract”<identifier>”{”[contractblock]”}”;
[0024]
b)contractblock::=[function]|[variable];
[0025]
c)function::=”function”<identifier>”(”[variable]”)”<qualifier>[keyword][return][”;”|block];
[0026]
d)variable::=<variabletype><qualifier><identifier>[”=”expression]”;”;
[0027]
e)expression::=functioncall|<identifier>|expression<operator>|expression<operator>expres sion|<identifier><operator><constant>;
[0028]
f)functioncall::=expression”(”variable”)”;
[0029]
g)block::=”{”statement”}”;
[0030]
h)statement::=ifstatement|whilestatment|forstatement|variable|
expression|block|”break”|”continue”|return;
[0031]
i)ifstatement::=”if
””
(”expression”)”block[”else”block];
[0032]
j)whilestatment::=”while
””
(”expression”)”block;
[0033]
k)forstatement::=”for
””
(”[variable]”;”[expression]”;”[expression]”)”block;
[0034]
l)return::=”return”[expression]。
[0035]
进一步地,根据所述的基于静态分析和深度学习的智能合约安全检测方法,所述步骤1.4具体包括如下步骤:
[0036]
步骤1.4.1:利用属于语句控制流结构的程序语句按照抽象语法树ast中的block节点构造不同的基本块block,记录每个基本块中每条语句的语句编号stmtid,以及记录每一个基本块的入边和出边;
[0037]
步骤1.4.2:连接不同的基本块,当一个基本块的出边与另一个基本块的入边相等时,便可将两个基本块进行连接,当一个基本块的出边数量大于1时,记录此基本块的跳转条件;
[0038]
步骤1.4.3:使用静态单赋值形式记录程序语句中的变量的编号varid以及赋值操作assign,即一个变量只执行一次赋值操作,对于进行二次赋值的变量修改其变量名称。
[0039]
进一步地,根据所述的基于静态分析和深度学习的智能合约安全检测方法,所述抽象事实包含着智能合约的所有控制流信息、数据信息和函数信息,使用datalog语言编写,所述抽象事实的结构形式如下:
[0040][0041]
其中,predicate是根据solidity源程序结构定义的对应谓词名称,包括数据类型、函数类型、表达式结构以及控制流结构;arg1,...,argn是与具体solidity程序语句内容相关的其他参数。
[0042]
进一步地,根据所述的基于静态分析和深度学习的智能合约安全检测方法,所述从步骤1得到的solidity源程序的图结构中提取出抽象事实的方法为:遍历solidity源程序的图结构,根据关键词匹配提取solidity源程序的抽象事实。
[0043]
进一步地,根据所述的基于静态分析和深度学习的智能合约安全检测方法,所述步骤3具体包括如下步骤:
[0044]
步骤3.1:搭建输入模块:将步骤2得到的抽象事实使用0

1编码矩阵x表示,对由0

1编码矩阵x表示的抽象事实分别进行词嵌入处理和位置嵌入处理,并将词嵌入处理后得到的矩阵与位置嵌入处理后得到的矩阵进行拼接得到的e矩阵作为注意力模块的输入;
[0045]
步骤3.2:搭建注意力模块,具体包括如下步骤:
[0046]
步骤3.2.1:由e矩阵分别经过三个线性变化得到抽象事实的q矩阵、k矩阵和v矩阵,并根据公式(4)得到抽象事实的注意力系数矩阵a;
[0047]
a=qk
t
ꢀꢀ
(4)
[0048]
其中,q矩阵为抽象事实的query矩阵,由每条抽象事实的每个单词所对应的query向量组成;k矩阵为抽象事实的key矩阵,由每条抽象事实的每个单词所对应的key向量组成;v矩阵为抽象事实的value矩阵,由每个抽象事实的每个单词所对应的value向量组成;
[0049]
步骤3.2.2:根据抽象事实的注意力系数矩阵a,按照公式(5)更新v矩阵中的元素
值,得到更新后的v矩阵v


[0050][0051]
其中,dk表示k矩阵的算数平方和;softmax函数为激活函数;
[0052]
步骤3.2.3:在注意力模块的矩阵v

中加入层归一化机制,使矩阵v

中的元素更加规范,以加速收敛并保证特征分布的稳定性;
[0053]
步骤3.3:搭建残差连接模块,残差连接模块的矩阵计算公式如下:
[0054]
z=h(e)=e f(e)=e v
″ꢀꢀ
(9)
[0055]
其中,矩阵e为注意力模块的输入;v

为注意力模块的输出;z为残差连接模块的输出;f是残差函数,在注意力模块中,经过反向传播会得到一个映射h(e)

z,若没有残差连接模块,则f(e)

0;
[0056]
步骤3.4:搭建输出模块,以输出抽象事实可能存在的漏洞概率,搭建输出模块的具体步骤如下:
[0057]
步骤3.4.1:定义公式(10)所示的漏洞类别输出公式,用于输出智能合约的抽象事实漏洞类别结果;
[0058]
p
k
=softmax(linear(z))
ꢀꢀ
(10)
[0059]
其中,linear代表线性函数,对矩阵z进行一次线性变换;p
k
为不同漏洞类型的概率值;
[0060]
步骤3.4.2:构建深度学习模型的损失函数,使模型具有漏洞分类能力。
[0061]
进一步地,根据所述的基于静态分析和深度学习的智能合约安全检测方法,所述损失函数为式(11)所示的多类别交叉熵损失函数:
[0062]
loss1=


k y
k
log(p
k
)
ꢀꢀꢀꢀ
(11)
[0063]
其中,y
k
代表抽象事实对应的one

hot编码的标签,k表示抽象事实对应的漏洞类别。
[0064]
与现有技术相比,本发明具有如下有益效果:
[0065]
1.能够较为全面地分析智能合约solidity源程序的行为。对智能合约进行安全检测首先要全面分析其代码行为。在本发明方法中,首先分析智能合约solidity源程序的抽象语法树和控制流图,然后将图结构抽象为事实表示,抽象事实可以较为全面地覆盖代码行为,并有效地表示程序中的语义特征,为之后的深度学习模型机器提供了支撑。
[0066]
2.增强了智能合约solidity源程序安全检测的可扩展性。传统的安全检测方法主要基于预先定义的规则,只关注已知的安全漏洞。而本发明方法使用的深度学习模型不限定于特定的安全漏洞,可以通过对训练集的补充对模型进行训练,以达到对多种安全漏洞的检测,容易进行扩展。另外在未知漏洞的安全检测上,本发明仅需再次训练模型,即可具有对该漏洞的检测能力,相对传统的安全检测方法,本发明对安全漏洞的检测具有良好的可扩展性。
[0067]
3.提高了智能合约solidity源程序安全检测的准确率。在本发明方法中,结合使用静态分析与深度学习两种方法对智能合约进行安全检测,并对现有的深度学习模型进行改进,加入了注意力模块,学习抽象事实中的关键信息,在提高抽象事实向量化表征的基础上有效地提高了安全检测分类的准确率,也有效地降低了安全漏洞的漏报率。
附图说明
[0068]
图1为本发明基于静态分析和深度学习的智能合约安全检测方法的流程示意图;
[0069]
图2为本发明实施例中的示例代码的抽象语法树图;
[0070]
图3为本发明实施例中深度学习模型架构图;
[0071]
图4为本发明实施例中注意力模块示意图。
具体实施方式
[0072]
下面将结合附图和具体实施方式,对本发明的具体实施方式作进一步详细描述。以下实施例仅用于说明本发明,但限制本发明的范围。
[0073]
图1是本发明基于静态分析和深度学习的智能合约安全检测方法的流程示意图,所述基于静态分析和深度学习的智能合约安全检测方法包括如下步骤:
[0074]
步骤1:对智能合约solidity源程序进行静态分析得到智能合约solidity源程序的图结构;所述静态分析包括词法分析和语法分析;所述图结构包括抽象语法树(abstract syntax tree,ast)和控制流图(control flow graph,cfg)。
[0075]
步骤1.1:对智能合约solidity源程序进行预处理,删除与solidity源程序安全检测无关的所有内容;
[0076]
在优选实施例中,对智能合约solidity源程序进行的预处理包括删除单行注释”//”、多行注释”/*

*/”,空格
””
、回车符”\n”以及与solidity源程序安全检测无关的所有内容。
[0077]
步骤1.2:对预处理后的智能合约solidity源程序导入import语句对应的源代码文件,得到完整的solidity源程序。
[0078]
步骤1.3:针对完整的solidity源程序,使用antlr分析器将solidity源程序转换为抽象语法树。
[0079]
步骤1.3.1:使用antlr分析器对完整的solidity源程序进行词法分析,按照预定义的单词属性类别,对solidity源程序中单词的属性进行标注,得到与每个程序语句对应的具有单词属性标注的单词序列;
[0080]
所述单词属性类别,包括关键字<keyword>、可见性定义符<qualifier>、变量数据类型<variabletype>、标识符<identifier>、运算符<operator>以及常量<constant>。
[0081]
步骤1.3.2:针对词法分析生成的每个程序语句对应的单词序列,使用antlr分析器进行语法分析,按照预定义的语法规则确定每个程序语句的语法结构;所述语法结构包括合约结构、函数结构、变量结构、表达式结构与语句控制流结构;
[0082]
在优选实施例中,根据solidity语言特性,使用bnf(backus

naur form,巴科斯范式)预定义的语法规则如下:
[0083]
m)contract::=”contract”<identifier>”{”[contractblock]”}”;
[0084]
n)contractblock::=[function]|[variable];
[0085]
o)function::=”function”<identifier>”(”[variable]”)”<qualifier>[keyword][return][”;”|block];
[0086]
p)variable::=<variabletype><qualifier><identifier>[”=”expression]”;”;
[0087]
q)expression::=functioncall|<identifier>|expression<operator>|expression<operator>expression|<identifier><operator><constant>;
[0088]
r)functioncall::=expression”(”variable”)”;
[0089]
s)block::=”{”statement”}”;
[0090]
t)statement::=ifstatement|whilestatment|forstatement|variable|expression|block|”break”|”continue”|return;
[0091]
u)ifstatement::=”if
””
(”expression”)”block[”else”block];
[0092]
v)whilestatment::=”while
””
(”expression”)”block;
[0093]
w)forstatement::=”for
””
(”[variable]”;”[expression]”;”[expression]”)”block;
[0094]
x)return::=”return”[expression]。
[0095]
步骤1.3.3:根据每个程序语句的语法结构,使用antlr分析器将solidity源程序转换为抽象语法树;
[0096]
例如,对于如下所示的代码,使用antlr分析器将其转换为如图2所示的抽象语法树。
[0097][0098]
步骤1.4:根据抽象语法树构造solidity源程序的控制流图cfg,具体步骤如下:
[0099]
步骤1.4.1:利用属于语句控制流结构的程序语句按照抽象语法树ast中的block节点构造不同的基本块block,记录每个基本块中每条语句的语句编号stmtid,以及记录每一个基本块的入边和出边;
[0100]
步骤1.4.2:连接不同的基本块,当一个基本块的出边与另一个基本块的入边相等时,便可将两个基本块进行连接,当一个基本块的出边数量大于1时,记录此基本块的跳转条件;
[0101]
步骤1.4.3:使用静态单赋值形式(ssa form)记录程序语句中的变量的编号varid以及赋值操作assign,即一个变量只执行一次赋值操作,对于进行二次赋值的变量修改其变量名称。
[0102]
例如,对于赋值操作”x=1;y=x 1;x=y;”其静态单赋值形式为”x1=1;y=x1 1;x2=y;”使用静态单赋值形式记录变量的赋值操作有利于后续抽象事实的分析。
[0103]
步骤2:从步骤1得到的solidity源程序的图结构中提取出抽象事实,具体是,遍历solidity源程序的图结构,根据关键词匹配提取solidity源程序的抽象事实。
[0104]
所述抽象事实,使用datalog语言编写,它包含着智能合约的所有控制流信息、数
据信息和函数信息,这些信息是与安全漏洞有关的关键特征;
[0105]
在优选实施例中,所述抽象事实的结构形式如下:
[0106][0107]
其中,predicate是根据solidity结构定义的对应谓词名称,arg1,...,argn是与具体solidity程序语句内容相关的其他参数。
[0108]
在优选实施例中,有四种谓词名称,分别是数据类型、函数类型、表达式结构以及控制流结构。其中,具体谓词名称定义和参数定义如下:
[0109]
遍历solidity源程序的ast的所有节点,对于数据类型的操作节点variable,定义其谓词名称为vardecl,对于函数类型的操作节点function,定义其谓词名称为fundecl,对于表达式结构中的函数调用节点functioncall,定义其谓词名称为funcall,其中,对于特殊函数的调用,包括地址相关函数call、callcode、delegatecall、send、transfer以及错误处理函数revert、assert、require,定义其谓词名称为其原名称;参数为涉及到的语句编号,变量编号以及节点对应的所有叶子节点的参数。
[0110]
遍历solidity源程序的控制流图,对于变量之间的赋值操作assign,定义其谓词名称为varass,参数为对应的语句编号stmtid和相关的变量编号varid,位于同一基本块中的语句,定义其谓词名称为block,参数为基本块编号blockid和语句编号stmtid,基本块之间存在路径时,定义其谓词名称为blockpath,参数为对应的基本块编号blockid。
[0111]
例如,通过遍历步骤1.3.2中的示例代码生成的图结构提取的抽象事实如下所示:
[0112]
vardecl(stmtid='s00',varid='v00',variabletype='uint',identifier='storeddata')
[0113]
block(blockid='b00',stmtid='s00')
[0114]
fundecl(identifier='set',varid='v01',qualifier='public')
[0115]
vardecl(varid=

v01

,variabletype=

uint

,identifier=

x

)
[0116]
block(blockid=

b01

,stmtid=

s01

)
[0117]
varass(stmtid=

s01

,varid=

v00

,varid=

v01

)
[0118]
步骤3:根据步骤2得到的solidity源程序的抽象事实,搭建用于对solidity源程序进行漏洞分类的深度学习模型;
[0119]
在优选实施例中,基于transformer模型的结构设计深度学习模型,如图3所示,包括四个模块:输入模块,注意力模块,残差连接模块和输出模块。所述深度学习模型的搭建过程包括如下步骤:
[0120]
步骤3.1:搭建输入模块:将步骤2得到的抽象事实进行向量化的预处理,将输入的抽象事实使用0

1编码矩阵x表示,由于0

1编码矩阵x过于稀疏,需要进行降维处理,即对由0

1编码矩阵x表示的抽象事实进行词嵌入处理和位置嵌入处理,降维处理后得到的矩阵即为注意力模块所需的输入,具体步骤如下:
[0121]
步骤3.1.1:按照公式(1)对由0

1编码矩阵x表示的抽象事实进行词嵌入处理,得到词矩阵x


[0122]
x
l*d

=tanh(x
l*v w1)
ꢀꢀꢀꢀ
(1)
[0123]
其中,w1是输入模块中待训练的参数矩阵;l为不同的solidity源程序对应的抽象事实中最长抽象事实的行数;v为抽象事实的词表大小;d为降维后的词项维度。
[0124]
步骤3.1.2:对由0

1编码矩阵x表示的抽象事实进行位置嵌入处理;
[0125]
为了保证深度学习模型能更好地获取抽象事实的位置信息,输入模块引入了抽象事实的位置编码机制,即位置嵌入。
[0126]
在优选实施例中,将抽象事实中每条语句出现的位置信息由矩阵p表示,再按照公式(2)将矩阵p经过激活函数得到位置编码矩阵p


[0127]
p
l*d

=tanh(p
l*d
)
ꢀꢀ
(2)
[0128]
其中,矩阵p的在训练前是随机初始化的,经过训练后得到由每个位置对应的位置向量构成的位置编码矩阵p


[0129]
步骤3.1.3:对于一个智能合约的抽象事实,按照公式(3)将位置编码矩阵p

与词矩阵x

拼接后得到e矩阵作为注意力模块的输入。
[0130][0131]
步骤3.2:搭建注意力模块,注意力模块的示意图如图4所示;
[0132]
注意力模块是深度学习模型的核心。通过此模块的注意力机制,可计算抽象事实词语之间的注意力系数,每条抽象事实的每个单词所对应的向量包含了其它单词所对应向量的信息,进而可以更好地获取抽象事实中的关键信息。其中注意力机制的原理为通过矩阵相乘,得出抽象事实中每个单词和其它单词之间的注意力系数。
[0133]
在优选实施例中,搭建注意力模块的具体步骤如下:
[0134]
步骤3.2.1:计算抽象事实单词间的注意力系数,得到抽象事实的注意力系数矩阵;
[0135]
优选实施例中注意力系数的计算方法同bert类似,涉及三个矩阵:q矩阵、k矩阵和v矩阵。其中,q矩阵为抽象事实的query矩阵,由每条抽象事实的每个单词所对应的query向量组成;k矩阵为抽象事实的key矩阵,由每条抽象事实的每个单词所对应的key向量组成,v矩阵为抽象事实的value矩阵,由每个抽象事实的每个单词所对应的value向量组成。这三个矩阵在最初状态时是随机给定的值,分别由e矩阵经过三个线性变化linear得到,经过训练后q,k,v的值具有表征意义。
[0136]
根据公式(4)得到抽象事实的注意力系数矩阵:
[0137]
a=qk
t
ꢀꢀ
(4)
[0138]
步骤3.2.2:根据抽象事实的注意力系数矩阵a,更新v矩阵中的元素值,得到更新后的v矩阵y


[0139]
在优选实施例中,得到注意力系数矩阵a后,按照公式(5)更新v矩阵中的元素值,可以得到更新后的v矩阵v


[0140][0141]
其中,dk表示k矩阵的算数平方和,在公式(5)中将相乘之后扩大了平方倍的量纲缩小到原始的大小,在反向传播的过程中,会减少一定的梯度更新值抖动。softmax为激活函数,它的应用意义在于加入非线性变化增强v

矩阵的表征能力。
[0142]
步骤3.2.3:在注意力模块的矩阵v

中加入层归一化机制,使矩阵v

中的元素更加规范,以加速收敛并保证特征分布的稳定性;
[0143]
层归一化机制考虑矩阵v

所有维度的输入,计算平均输入值和输入方差,然后用
同一个规范化操作来转换各个维度的输入。v

矩阵的所有元素的均值公式如下:
[0144][0145]
v

矩阵的所有元素的方差公式如下:
[0146][0147]
其中,n
(v)
是v

中的元素的个数,μ
(v)
为均值,为方差,σ
(v)
为标准差。矩阵v

中的每个元素v
i
按照公式(8)进行归一化处理:
[0148][0149]
上式中,v
i

为矩阵v

中的每个元素v
i
经过归一化后的值。
[0150]
步骤3.3:搭建残差连接模块;
[0151]
优选实施例中深度学习模型的源输入(抽象事实)的词表过小,注意力模块有可能过度捕获单词之间的相连关系,加入残差连接模块可一定程度上克服这种问题的出现。
[0152]
在优选实施例中,残差连接模块的矩阵计算公式如下:
[0153]
z=h(e)=e f(e)=e v
″ꢀꢀ
(9)
[0154]
其中,矩阵e为注意力模块的输入;v

为注意力模块的输出,将这两个矩阵进行相加的操作得出残差连接模块的输出z。f是残差函数,在注意力模块中,经过反向传播会得到一个映射h(e)

z,若没有残差连接模块,则f(e)

0。
[0155]
步骤3.4:搭建输出模块;
[0156]
输出模块的作用是输出抽象事实可能存在的漏洞概率,并依据损失函数使得深度学习模型的安全漏洞检测能力最大化。
[0157]
在优选实施例中,搭建输出模块的具体步骤如下:
[0158]
步骤3.4.1:定义公式(10)所示的漏洞类别输出公式,用于输出智能合约的抽象事实漏洞类别结果。
[0159]
p
k
=softmax(linear(z))
ꢀꢀ
(10)
[0160]
其中,linear代表线性函数,即对矩阵z进行一次线性变换,softmax函数为激活函数,p
k
为不同漏洞类型的概率值。
[0161]
步骤3.4.2:构建深度学习模型的损失函数,通过损失函数可使模型具有漏洞分类能力,损失函数为式(11)所示的多类别交叉熵损失函数。
[0162]
loss1=


k y
k
log(p
k
)
ꢀꢀꢀꢀ
(11)
[0163]
其中,y
k
代表抽象事实对应的one

hot编码的标签,k表示抽象事实对应的漏洞类别。
[0164]
步骤4:构建深度学习模型的训练数据集;
[0165]
漏洞检测问题可视为机器学习中的多分类问题。因为分类问题属于有监督学习,所以需要数据(solidity程序)以及数据的标签(solidity的漏洞类型)。因此对深度学习模型的训练数据集的构建,包括获取数据和为数据标注标签类型。
[0166]
在优选实施例中,首先收集以太坊真实存在的智能合约共1500个程序文件。然后按照swc registry对智能合约的漏洞的定义,对这1500个程序文件进行人工标记,构建深度学习模型的训练数据集。swc registry是目前主流的智能合约漏洞标注标准库。它由
smart contract security组织中的以太坊安全人员和开发人员构建。该漏洞库提供了以太坊智能合约安全漏洞分类、部分测试用例,以及漏洞带来的后果。训练数据集中各类别漏洞数量以及占比如表2所示。
[0167]
表2漏洞数量以及占比
[0168]
漏洞类别数量占比可重入漏洞101467.6%时间戳依赖漏洞71546.7%死循环漏洞32621.7%无漏洞29319.5%
[0169]
步骤5:利用所述训练数据集对深度学习模型进行训练。
[0170]
在优选实施例中,对深度学习模型的训练分为两个步骤,第一个步骤是预训练(pre

train),目的在于使深度学习模型的损失函数的值快速下降。第二个步骤是微调训练(finetune train),目的在于使深度学习模型的安全检测能力进一步提高。这种预训练和微调训练的组合训练方式使深度学习模型有更好的鲁棒性和可扩展性。
[0171]
在优选实施例中,使用带有gpu资源的jupyter notebook平台进行深度学习模型的预训练和微调训练:预训练时,将batch

size设定为16,epoch设定为80,优化器选择为adam,当损失值变化稳定为1时停止预训练开始微调训练;微调训练时,将batch

size设定为4,epoch设定为20,优化器选择为sgd,当损失值变化稳定为0.1时停止微调训练。经过预训练和微调训练后的深度学习模型对于智能合约具有漏洞分类的能力。
[0172]
步骤6:利用训练好的深度学习模型对输入的智能合约进行漏洞检测,输出智能合约solidity源程序的安全检测结果;
[0173]
利用完成训练后的深度学习模型对智能合约进行漏洞检测,输出的结果为每一种漏洞类型的概率值,若输出的概率值大于等于0.5则认为智能合约存在该漏洞,若输出的概率值小于0.5则不存在漏洞。本方法可有效地自动化检测智能合约安全性。
[0174]
显然,上述实施例仅仅是本发明的一部分实施例,而不是全部的实施例。上述实施例仅用于解释本发明,并不构成对本发明保护范围的限定。基于上述实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,也即凡在本技术的精神和原理之内所作的所有修改、等同替换和改进等,均落在本发明要求的保护范围内。
转载请注明原文地址:https://doc.8miu.com/read-1450124.html

最新回复(0)