基于源代码图表示学习的智能合约多漏洞检测方法及系统

文档序号:26540203发布日期:2021-09-07 21:27阅读:141来源:国知局
基于源代码图表示学习的智能合约多漏洞检测方法及系统

1.本发明属于软件安全领域,涉及一种基于源代码图表示学习的智能合约多漏洞检测方法及系统。


背景技术:

2.智能合约是将传统合约数字化,并运行在区块链平台上一种共识规则。相较于传统合约,智能合约依托区块链平台具有多种优势:第一,智能合约的执行不依赖第三方,而是自动和去中心化的;第二,智能合约本身无法篡改;第三,智能合约存储在区块链平台上,每个区块链节点都保存一份合约备份,并对所有人可见,保证了合约执行的透明性。随着区块链技术的发展,越来越多的开发者注意到智能合约的这些优势,将智能合约技术应用在包括金融、艺术品交易、风险投资等众多领域。
3.但是相比于传统的软件,由于智能合约管理着大量的虚拟资产,一旦其本身存在漏洞并被攻击就会造成巨大的经济损失。2016年发生的the dao安全漏洞导致了6000万美元的损失;2017年7月的parity钱包漏洞导致了1.5亿美元的资金被永远冻结;2021年3月的dodo合约由于存在漏洞导致380万美元资产被盗。所以在安全事故频发的当下,针对智能合约的漏洞检测是十分重要且迫切的需求。
4.现有的智能合约漏洞检测方法大多依赖人工定义的专家规则,通过符号执行、污点分析和形式化验证等技术进行漏洞检测。这些方法都存在执行效率低,代码覆盖率低和检测周期长等问题,并且其检测的准确性完全依赖专家规则的定义。随着智能合约数量呈现爆发式增长,当前基于专家规则和静态分析的漏洞检测方法无法适用于快速变化的智能合约应用和大规模代码的检测。


技术实现要素:

5.发明目的:针对上述现有技术存在的问题,本发明目的在于提供一种检测范围更广、执行效率更高的智能合约多漏洞检测方法及系统。
6.技术方案:为实现上述发明目的,本发明提供的一种基于源代码图表示学习的智能合约多漏洞检测方法,包括以下步骤:
7.(1)构建智能合约源代码数据集,并对数据集中样本是否存在漏洞进行标记;
8.(2)结合智能合约的抽象语法树和语义信息构建智能合约函数粒度代码属性图;代码属性图中的每个节点包含代码语句和节点类型,图中的边类型根据语义信息分为ast边、控制流边、数据流边、控制依赖边和数据依赖边;
9.(3)根据智能合约漏洞的语法特征,定义智能合约切片准则,利用程序切片技术得到智能合约源代码中与漏洞相关的切片语句集合,并从代码属性图中提取与切片语句相关的语义信息组成切片代码属性图;
10.(4)构建门控图神经网络与多层感知机结合的漏洞检测模型并进行训练,所述门控图神经网络用于对切片代码属性图进行特征提取,多层感知机用于根据提取的特征以及
切片代码属性图中各节点的初始状态特征进行智能合约漏洞预测;
11.(5)利用步骤(2)和(3)中的方法生成待测试智能合约的切片代码属性图,输入到训练好的漏洞检测模型中预测是否存在漏洞。
12.进一步地,步骤(1)具体过程包括:
13.(1.1)通过google bigquery数据库获得部署在以太坊上的智能合约地址集合,利用合约地址在etherscan平台得到对应的智能合约源代码;
14.(1.2)通过智能合约漏洞检测工具检测收集到的智能合约源码,并根据检测结果对样本进行标记,检测工具结果显示存在漏洞的合约标记为"1",否则标记为"0";之后对标记为漏洞的合约样本进行人工审计,以确保样本标记的准确性。
15.进一步地,步骤(2)具体过程包括:
16.(2.1)利用solidity编译器编译智能合约源代码,生成对应的抽象语法树,搜索智能合约抽象语法树中所有节点类型为functiondefinition的节点集合v
func
,提取以这些节点为根节点的子树,得到函数粒度的抽象语法树集合;
17.(2.2)在函数粒度抽象语法树中寻找节点类型为modifierinvocation的节点,此节点代表当前函数使用的函数修饰器,根据此节点内容寻找对应的函数修饰器具体实现,并将其添加在当前函数内部;
18.(2.3)在函数粒度的抽象语法树基础上,利用静态分析方法分析函数的语义信息,包括数据流、控制流、控制流依赖和数据依赖;将这些语义信息与抽象语法树结合,组成函数粒度代码属性图;图中各节点仍使用抽象语法树节点,而图中边类型根据其包含的语义信息分为以下几类:ast边、控制流边、数据流边、控制依赖边和数据依赖边;
19.(2.4)利用深度优先遍历算法将抽象语法树展开成序列表示,并在序列表示的基础上利用word2vec技术将抽象语法树节点映射到低维向量空间。
20.进一步地,步骤(3)具体过程包括:
21.(3.1)根据智能合约漏洞库swc和cwe中已知的不同类型漏洞的语法特征定义切片准则;
22.(3.2)利用静态切片技术中的图可达性方法,根据定义的切片准则进行代码切片;在代码属性图中利用字符串匹配方法,搜索节点内容包含预定义切片准则的节点集合v
sc
={v
sc
},从这些节点出发,沿数据依赖边和控制依赖边对代码属性图进行前向和后向遍历,寻找与节点v
sc
存在数据依赖或者控制依赖关系的相关节点集合v
s
;切片准则节点集合v
sc
和切片依赖相关节点集合v
s
共同组成代码切片语句节点集合v=v
sc
∪v
s

23.(3.3)根据步骤(3.2)得到的切片语句集合v,从代码属性图中提取切片代码属性图g
s
=(v,e,h),其中e是图中边的集合,h∈r
v*d
表示所有节点的初始状态其值为各节点利用word2vec映射的特征向量,d表示节点特征向量的维度;
24.(3.4)考虑到智能合约存在fallback机制,在步骤(3.3)得到的切片代码属性图的基础上添加fallback边。
25.进一步地,步骤(4)中利用图神经网络提取切片代码属性图的特征具体过程包括:
26.(4.1)将步骤(3)生成的切片代码属性图g
s
作为门控图神经网络的输入;
27.(4.2)为了使代码属性图中各节点在消息传播阶段能同时够接收到前驱和后继节点传来的消息,定义图的邻接矩阵时同时考虑图的出方向和入方向邻接矩阵a=[a
(in)
,a
(out)
],其中入方向边邻接矩阵a
(in)
表示消息的前向传递,出方向邻接矩阵a
(out)
则代表消息的反向传递;
[0028]
(4.3)图神经网络中节点v在t时刻的状态依赖与其相邻节点在t

1时刻的状态的消息传递,表示为:
[0029][0030]
其中a
v
是节点v对应的带权重的邻接矩阵,表示节点i在t

1时刻的状态,i∈[1,|v|],|v|是切片代码属性图中节点数量,b是偏置项;
[0031]
(4.4)计算门控单元的权重,根据节点v在t时刻的状态更新和t

1时刻的状态计算t时刻节点v对应的重置门和更新门
[0032][0033][0034]
其中σ(
·
)代表激活函数,w
z
和u
z
代表重置门参数,w
r
和u
r
代表更新门参数;
[0035]
(4.5)利用门控单元的输出更新节点v的状态,首先根据更新门计算t

1时刻状态对t时刻的影响:
[0036][0037]
其中w和u代表门控神经单元的候选隐藏状态权重参数,
·
代表按元素乘法;利用重置门计算节点v在t时刻的最终状态为:
[0038][0039]
经过t时刻的更新,得到图中各节点的最终状态为
[0040]
进一步地,步骤(5)中利用多层感知机进行智能合约漏洞预测具体过程包括:
[0041]
(5.1)利用步骤(4)得到的切片代码属性图中各节点的在t时刻的特征结合各节点的初始状态特征经过读出操作生成图级别特征向量
[0042][0043]
其中conv代表一维卷积操作,|v|是切片代码属性图中节点数量,σ(
·
)代表激活函数;
[0044]
(5.2)将图级别向量表示h
g
作为多层感知机的输入,得到最终的预测结果。
[0045]
基于相同的发明构思,本发明提供的一种基于源代码图表示学习的智能合约多漏洞检测系统,包括:数据集构建模块,用于构建智能合约源代码数据集,并对数据集中样本是否存在漏洞进行标记;代码图表示模块,用于结合智能合约的抽象语法树和语义信息构建智能合约函数粒度代码属性图;代码属性图中的每个节点包含代码语句和节点类型,图中的边类型根据语义信息分为ast边、控制流边、数据流边、控制依赖边和数据依赖边;以及根据智能合约漏洞的语法特征,定义智能合约切片准则,利用程序切片技术得到智能合约源代码中与漏洞相关的切片语句集合,并从代码属性图中提取与切片语句相关的语义信息组成切片代码属性图;代码特征提取模块,用于构建门控图神经网络与多层感知机结合的
漏洞检测模型并进行训练,所述门控图神经网络用于对切片代码属性图进行特征提取,多层感知机用于根据提取的特征以及切片代码属性图中各节点的初始状态特征进行智能合约漏洞预测;以及漏洞检测模块,用于将待测试智能合约的切片代码属性图输入到训练好的漏洞检测模型中预测是否存在漏洞。
[0046]
基于相同的发明构思,本发明提供的一种基于源代码图表示学习的智能合约多漏洞检测系统,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述计算机程序被加载至处理器时实现所述的基于源代码图表示学习的智能合约多漏洞检测方法。
[0047]
有益效果:本发明与现有技术相比,其显著优点为:
[0048]
1)本发明在进行智能合约源代码表示时通过结合抽象语法树、控制流图和程序依赖图组成智能合约复合图表示。结合不同的代码表示形式能最大程度表征智能合约的语法、语义信息,同时利用图结构可以保留智能合约代码语句之间的上下文结构信息,从而避免传统的代码序列表征带来的代码结构特征损失。
[0049]
2)本发明根据智能合约已知的多种漏洞语法特征,提出不同类型漏洞相关切片准则,并基于这些切片准则对智能合约的图表示进行切片操作。在保留图结构中与漏洞有关的关键节点和边的基础上,删除图中与漏洞无关的噪声节点,在保留智能合约代码语法、语义信息的同时降低与漏洞无关的噪声代码对检测效果的影响,从而提升漏洞检测的准确率。
[0050]
3)本发明使用包含多种漏洞的智能合约源代码集作为训练集,将切片后的复合图输入图神经网络自动学习语法、语义特征。并在学习过程中,通过构建图的入方向邻接矩阵学习节点的前向特征,通过构建图的出方向邻接矩阵学习节点的后向特征,结合各节点的前向和后向特征可以得到代码的上下文特征。结合代码上下文特征和语法、语义特征可以更全面表示不同类型漏洞的特征,提高了漏洞检测方法适用范围,并降低召回率。
附图说明
[0051]
图1为实施例中基于源代码图表示学习的智能合约多漏洞检测方法的流程图。
具体实施方式
[0052]
为了使本技术的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本技术进行进一步详细说明。应当理解,此处描述的具体实施例仅用以解释本技术,并不用于限定本技术。
[0053]
在一个实施例中,结合图1,本发明提出一种基于源代码图表示学习的智能合约多漏洞检测方法,包括以下步骤:
[0054]
(1)构建智能合约源代码数据集,并对数据集中样本是否存在漏洞进行标记;
[0055]
(2)结合智能合约的抽象语法树和语义信息构建智能合约函数粒度代码属性图;代码属性图中的每个节点包含代码语句和节点类型,图中的边类型根据语义信息分为ast边、控制流边、数据流边、控制依赖边和数据依赖边;
[0056]
(3)根据智能合约漏洞的语法特征,定义智能合约切片准则,利用程序切片技术得到智能合约源代码中与漏洞相关的切片语句集合,并从代码属性图中提取与切片语句相关
的语义信息组成切片代码属性图;
[0057]
(4)构建门控图神经网络与多层感知机结合的漏洞检测模型并进行训练,所述门控图神经网络用于对切片代码属性图进行特征提取,多层感知机用于根据提取的特征以及切片代码属性图中各节点的初始状态特征进行智能合约漏洞预测;
[0058]
(5)利用步骤(2)和(3)中的方法生成待测试智能合约的切片代码属性图,输入到训练好的漏洞检测模型中预测是否存在漏洞。
[0059]
进一步地,在其中一个实施例中,步骤(1)所述的智能合约源代码数据集构建,具体过程包括:
[0060]
(1.1)通过google bigquery数据库获得当前部署在以太坊上的智能合约地址集合,利用合约地址在etherscan平台得到对应的智能合约源代码。
[0061]
(1.2)通过已有智能合约漏洞检测工具检测收集到的智能合约源码,并根据检测结果对样本进行标记,检测工具结果显示存在漏洞的合约标记为"1",否则标记为"0"。之后对标记为漏洞的合约样本进行人工审计,以确保样本标记的准确性。
[0062]
进一步地,在其中一个实施例中,步骤(2)针对智能合约源代码构造代码属性图,具体过程包括:
[0063]
(2.1)利用solidity编译器solc编译智能合约源代码,生成该智能合约对应的抽象语法树,节点信息由代码语句和节点类型两部分组成。搜索智能合约抽象语法树中所有节点类型为functiondefinition的节点集合v
func
,提取以这些节点为根节点的子树,得到函数粒度的抽象语法树集合。
[0064]
(2.2)在函数粒度抽象语法树中寻找节点类型为modifierinvocation的节点,此节点代表当前函数使用的函数修饰器,根据此节点内容寻找对应的函数修饰器具体实现,并将其添加在当前函数内部。
[0065]
(2.3)在函数粒度的抽象语法树基础上,利用静态分析方法分析函数的数据流、控制流、控制流依赖和数据依赖等语义信息。将这些语义信息与抽象语法树结合,组成函数粒度代码属性图。图中各节点仍使用抽象语法树节点,每个节点包含代码语句和节点类型两部分信息,而图中边类型根据其包含的语义信息可以分为以下几类:ast边、控制流边、数据流边、控制依赖边和数据依赖边。
[0066]
ast边代表函数的语法结构特征,从ast的父节点指向其子节点,可以从抽象语法树中直接获取。数据流边代表变量在函数内部使用的语义信息,一条数据流边沿着函数执行方向连接两个包含相同的变量的节点。控制流代表函数内部控制逻辑相关的语义信息,一条控制流边从包含条件判断语句的节点指向所有受其控制的分支语句节点。
[0067]
(2.4)利用深度优先遍历算法将抽象语法树展开成序列表示,并在序列表示的基础上利用word2vec技术将抽象语法树节点映射到低维向量空间,作为节点v的初始特征向量其中d代表节点特征向量的维度。
[0068]
进一步地,在其中一个实施例中,在步骤(3)中根据智能合约已知漏洞的语法特征,定义智能合约切片准则。利用程序切片技术得到智能合约源代码中与漏洞相关的切片语句集合,并从代码属性图中提取与切片语句相关的语义信息组成切片代码属性图。具体过程包括:
[0069]
(3.1)智能合约不同的类型漏洞对应不同的切片准则,具体准则可以从漏洞库
swc、cwe中提取,部分示例如表1所示:
[0070]
表1切片准则列表
[0071][0072][0073]
(3.2)利用静态切片技术中的图可达性方法,根据表1定义的切片准则进行代码切片。在代码属性图中利用字符串匹配方法,搜索节点内容包含预定义切片准则的节点集合v
sc
={v
sc
},从这些节点出发,沿数据依赖边和控制依赖边对代码属性图进行前向和后向遍历,寻找与节点v
sc
存在数据依赖或者控制依赖关系的相关节点集合v
s
。切片准则节点集合v
sc
和切片依赖相关节点集合v
s
共同组成代码切片语句集合v=v
sc
∪v
s

[0074]
(3.3)根据步骤(3.2)得到的切片语句集合v,从代码属性图中提取切片代码属性图g
s
=(v,e,h),其中v代表切片语句节点的集合,e是图中边的集合,h∈r
|v|*d
表示所有节点的初始状态,其值为步骤(2.4)中经过word2vec得到的各节点向量表示,d表示节点特征的维度;
[0075]
(3.4)考虑到智能合约存在fallback机制:当合约alice中执行<bob>.call()时,被调用者bob可以再次调用alice,产生了嵌套调用。所以在步骤(3.3)得到的切片代码属性图的基础上添加fallback边。寻找节点内容为<address>.call()的节点v
call
,构造一条边e
fallbackcall
指向函数入口节点v
function
。此时fallback边e
fallbackcall
:v
call

v
function
代表了fallback机制的语义信息。
[0076]
进一步地,在其中一个实施例中,步骤(4)中将切片代码属性图输入图神经网络,
利用双向消息传递进行神经网络模型参数训练和各节点特征的表示学习,具体过程包括:
[0077]
(4.1)将步骤(3)生成的切片代码属性图g
s
作为门控图神经网络的输入。
[0078]
(4.2)代码中某一语句的语义与其所处的上下文密切相关,所以代码属性图中各节点的前驱和后继节点都对当前节点的语义存在影响。而代码属性图各节点之间的边依照程序执行方向,只包含前向关系。所以在图神经网络的消息传递阶段,图中各节点只能获得其前驱节点所传递的消息,而其兄弟节点或者后继节点的消息无法反向传递到当前节点。为了使代码属性图中各节点在消息传播阶段能同时够接收到前驱和后继节点传来的消息,定义图的邻接矩阵时需要同时考虑图的出方向和入方向邻接矩阵a=[a
(in)
,a
(out)
]。其中入方向边邻接矩阵a
(in)
表示消息的前向传递,而出方向邻接矩阵a
(out)
则代表消息的反向传递;
[0079]
(4.3)图神经网络中节点v在t时刻的状态依赖与其相邻节点在t

1时刻的状态的消息传递,表示为:
[0080][0081]
其中a
v
是节点v对应的带权重的邻接矩阵,表示节点i在t

1时刻的状态,b是偏置项。
[0082]
(4.4)计算门控单元的权重,根据节点v在t时刻的状态更新和t

1时刻的状态计算t时刻节点v对应的重置门和更新门
[0083][0084][0085]
其中σ(
·
)代表激活函数,w
z
和u
z
代表重置门参数,w
r
和u
r
代表更新门参数。
[0086]
(4.5)利用门控单元的输出更新节点v的状态,首先根据更新门计算t

1时刻状态对t时刻的影响:
[0087][0088]
其中w和u代表门控神经单元的候选隐藏状态权重参数,
·
代表按元素乘法。利用重置门计算节点v在t时刻的最终状态为:
[0089][0090]
经过t时刻的更新,得到图中各节点的最终状态为
[0091]
进一步地,在其中一个实施例中,利用多层感知机结合图神经网络读出操作进行智能合约漏洞预测,具体方法是:
[0092]
利用切片代码属性图中各节点的在t时刻的特征结合各节点的初始状态特征经过读出操作生成图级别特征向量
[0093][0094]
其中conv代表一维卷积操作;再将图级别向量表示h
g
作为多层感知机的输入,得到最终的预测结果:
[0095][0096]
综上,本发明可以更好地利用漏洞本身的语法特征对智能代码进行切片处理,去除那些与漏洞无关的噪声代码,提升检测的准确性。同时利用图结构表示智能合约代码,能够充分挖掘代码的语法、语义信息和代码语句的上下文结构。在图表示的基础上利用图神经网络自动学习漏洞特征,避免了人工定义漏洞规则。提高漏洞检测的适用范围,降低检测成本。
[0097]
基于相同的发明构思,本发明实施例提供的一种基于源代码图表示学习的智能合约多漏洞检测系统,包括:数据集构建模块,用于构建智能合约源代码数据集,并对数据集中样本是否存在漏洞进行标记;代码图表示模块,用于结合智能合约的抽象语法树和语义信息构建智能合约函数粒度代码属性图;代码属性图中的每个节点包含代码语句和节点类型,图中的边类型根据语义信息分为ast边、控制流边、数据流边、控制依赖边和数据依赖边;以及根据智能合约漏洞的语法特征,定义智能合约切片准则,利用程序切片技术得到智能合约源代码中与漏洞相关的切片语句集合,并从代码属性图中提取与切片语句相关的语义信息组成切片代码属性图;代码特征提取模块,用于构建门控图神经网络与多层感知机结合的漏洞检测模型并进行训练,所述门控图神经网络用于对切片代码属性图进行特征提取,多层感知机用于根据提取的特征以及切片代码属性图中各节点的初始状态特征进行智能合约漏洞预测;以及漏洞检测模块,用于将待测试智能合约的切片代码属性图输入到训练好的漏洞检测模型中预测是否存在漏洞。具体实施细节参见上述方法实施例,此处不再赘述。
[0098]
基于相同的发明构思,本发明实施例提供的一种基于源代码图表示学习的智能合约多漏洞检测系统,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述计算机程序被加载至处理器时实现所述的基于源代码图表示学习的智能合约多漏洞检测方法。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1