基于深度强化学习与多级覆盖策略的智能合约模糊测试方法及系统

文档序号:30982340发布日期:2022-08-03 00:54阅读:277来源:国知局
基于深度强化学习与多级覆盖策略的智能合约模糊测试方法及系统

1.本发明属于区块链智能合约安全检测技术领域,具体涉及一种基于深度强化学习与多级覆盖策略的智能合约模糊测试方法及系统。


背景技术:

2.以太坊平台上的智能合约允许用户给他人转账或者接受他人的转账,与用户的经济利益直接相关。由于智能合约的技术还不够完善,并且合约开发者也缺乏安全意识,一旦攻击者发现智能合约中的漏洞,就会破坏合约的规则,从中进行获利。智能合约以二进制代码的形式发布在区块链平台上,部署到区块链平台后无法撤销也无法进行修改,因此需要在部署到区块链之前需要对合约进行漏洞检测。因为智能合约的这些特性,关于智能合约的漏洞检测工作也受到越来越多的关注。
3.智能合约的漏洞检测技术主要分为静态和动态检测两种,静态漏洞检测技术分析智能合约的源码或者二进制代码,而目前只有少数的源码是开源的,大部分的智能合约只能找到二进制代码。二进制代码相比于源码也缺少了一些信息,导致静态分析二进制代码时会更难发现漏洞。并且静态检测技术不能处理复杂的程序,对未知漏洞的检测能力较弱。动态检测是动态执行智能合约的过程中发现是否存在漏洞,因此未公开源码对动态检测的影响不是很大,但是动态检测的输入是无限的,只有很少的一部分输入是可以触发漏洞,如果随机生成输入,找到漏洞的效率会很低。从afl方法出现后,基于覆盖率指导和遗传算法的思想被用于动态检测,通过不断的对输入进行变异,逐步提高对智能合约状态空间的探索,也更有可能发现漏洞。现如今针对智能合约动态漏洞检测的方法大多是在此基础上进行改进,但是并没有提供通用的漏洞检测手段,即并不适用于智能合约程序特性,而且也没有深入研究针对智能合约执行特性的有效的输入变异策略。因此,提供一种通用的智能合约漏洞动态检测方法亟待解决。


技术实现要素:

4.本发明的目的是为解决现有智能合约动态漏洞检测方法的效率低,以及不适用于智能合约程序特性的问题,而提出的一种基于深度强化学习与多级覆盖策略的智能合约模糊测试方法。
5.本发明为解决上述技术问题所采取的技术方案是:
6.基于本发明的一个方面,基于深度强化学习与多级覆盖策略的智能合约模糊测试方法,所述方法具体包括以下步骤:
7.步骤一、根据智能合约二进制代码得到智能合约二进制代码对应的abi规范,再根据智能合约二进制代码和得到的abi规范生成初始种子,并根据初始种子构建种子树;
8.步骤二、从种子树中选择一个种子,再对选择出的种子进行变异得到变异种子;
9.步骤三、将变异种子和智能合约二进制代码送入智能合约执行环境,分析智能合
约执行后产生的执行记录,计算出变异种子的函数覆盖率、边覆盖率以及数据覆盖率;
10.根据变异种子的函数覆盖率、边覆盖率以及数据覆盖率判断变异种子是否出现新的覆盖特性(例如,调用了一个新的函数,经过了一条新的边,或者找到了一个新的变量),若变异种子出现新的覆盖特性,则将变异种子加入到种子树中,即对种子树进行更新,否则,不对种子树进行更新;
11.步骤四、将变异种子的函数覆盖率、边覆盖率以及数据覆盖率作为奖励送入深度强化学习ddpg算法,用于下一次变异策略的选择;
12.步骤五、重复步骤二至步骤四的过程,直至到达循环终止条件时停止(循环终止条件可以是达到设置的最大迭代次数),且在每次循环过程中均对种子和智能合约执行过程进行监控,以进行漏洞检测。
13.即,若种子和智能合约执行过程中出现了异常情况,则将当前种子记录下来,放到漏洞种子库中。
14.进一步地,所述初始种子的生成方式为:
15.步骤a1、获取智能合约中函数的个数q,再生成q个初始种子,其中,每个初始种子在调用构造函数后分别调用智能合约中不同的函数;
16.步骤a2、分别为每个初始种子的函数调用生成具体参数;
17.步骤a3、根据生成的具体参数分别对每个初始种子以位向量的形式进行编码,并保留每个初始种子的函数调用列表。
18.进一步地,所述种子树基于多级覆盖策略构建。
19.进一步地,所述种子树的构建方式为:
20.步骤b1、将智能合约表示为控制流图s=(n,i,e),其中,n表示程序中有限的控制块集;i∈n表示初始块,即智能合约开始;e表示带标签的边集,每个边e=(n,c,n

)表示控制块n执行后通过条件或命令c执行控制块n


21.对于任意的一个初始种子t,初始种子t的执行遍历控制流图s中的一条路径,初始种子t执行后,由初始种子t生成一个序列对《(σ0,n0),(σ1,n1),》,其中,(n0,n1,

)表示节点被访问的顺序,σi表示访问节点ni时的配置;
22.根据节点被访问的顺序(n0,n1,

)计算初始种子t的边覆盖率m2,根据初始种子t执行过程中的函数调用序列计算函数覆盖率m1,将初始种子t执行过程中所涉及变量的数量和种类作为数据覆盖率m3;
23.步骤b2、基于多级覆盖策略构建种子树
24.构建一个虚拟根节点后,种子树的第二层保存的是各初始种子的函数覆盖率,第三层保存的是各初始种子的边覆盖率,第四层保存的是各初始种子的数据覆盖率,且各初始种子也保存在第四层。
25.进一步地,所述函数覆盖率m1的计算方式为:
[0026][0027]
其中,q0是初始种子t执行过程中调用的函数个数。
[0028]
进一步地,所述边覆盖率m2的计算方式为:
[0029][0030]
其中,l0是初始种子t执行过程中经过的边的数量,l是智能合约中边的总数量。
[0031]
进一步地,所述步骤二中,从种子树中选择种子的具体过程为:
[0032]
基于构建的种子树,以α的概率从种子树中选择覆盖率最高的种子,以1-α的概率从种子树中随机选择一个种子。
[0033]
由于构建种子树的过程中是按照覆盖率对种子进行的保存,所以基于构建的种子树,可以直接获取到当前种子树中覆盖率最高的种子。
[0034]
更进一步地,所述步骤四中,变异策略包括函数变异和交易序列变异。
[0035]
基于本发明的另一个发面,基于深度强化学习与多级覆盖策略的智能合约模糊测试系统,所述系统用于执行基于深度强化学习与多级覆盖策略的智能合约模糊测试方法。
[0036]
本发明的有益效果是:
[0037]
本发明提出了多级覆盖策略,多级覆盖策略可以从多个方面对智能合约执行记录进行分析,使用多个粒度不同的覆盖指标可以发现不同类型的漏洞,覆盖指标的定义粒度不同也丰富了种子池中种子的多样性,进而提高检测漏洞的效率。同时,为了能高效地找到漏洞对应的交易序列,本发明也使用了深度强化学习,用深度强化学习网络指导变异策略,在不断进行变异种子的过程中,学习针对当前种子如何选择变异策略可以更快的找到发现漏洞的交易序列。本发明提出的智能合约漏洞检测方法有助于高效的检测智能合约中可能存在的漏洞,避免出现经济损失。而且,本发明方法适用于智能合约程序特性,是一种具有通用性的漏洞检测手段。
附图说明
[0038]
图1为基于深度强化学习与多级覆盖指标的智能合约动态检测方法的流程图;
[0039]
图2为智能合约模糊测试问题定义图;
[0040]
图3为多级覆盖策略工作流程图;
[0041]
图4为深度强化学习工作流程图。
具体实施方式
[0042]
下面结合附图与具体实施方式对本发明作进一步详细描述,在给定智能合约二进制代码的情况下生成能触发漏洞的交易序列(即种子),如图1所示,本发明的基于深度强化学习与多级覆盖策略的智能合约动态检测方法主要分为三个部分,分别是:智能合约动态检测漏洞问题定义模块,多级覆盖策略模块,以及深度强化学习模块。
[0043]
智能合约动态检测问题定义模块,对智能合约动态检测时的输入进行建模,对动态检测过程的种子选择以及种子变异策略提出一种实现方案,用来确定深度强化学习模型的输入以及生成更高效的高覆盖率变异种子。
[0044]
多级覆盖策略模块,选择不同的覆盖指标以及覆盖指标的相互配合能快速找到高效的变异种子。
[0045]
深度强化学习网络模块,通过对智能合约种子变异过程,种子执行过程以及种子评分一系列行为进行建模,使其满足马尔可夫性质,并利用深度强化学习ddpg算法解决种
子变异问题。
[0046]
智能合约动态检测问题定义模块
[0047]
本发明的研究目标是在智能合约二进制代码上使用模糊测试技术检测漏洞信息,然而智能合约的执行过程相较于传统的高级语言程序有一些不同:合约部署到区块链上后,会产生一些影响合约执行的网络建立信息,并且后续其他合约调用该合约也有可能改变这些信息。基于此,本发明使用模糊测试技术分析智能合约时,定义了适合智能合约执行过程的种子、种子生成策略以及种子选择策略。
[0048]
种子定义
[0049]
在本发明中,将合约s的输入定义为(σ0,∑),其中σ0表示区块链网络的配置,∑表示一个事务序列(即函数调用)。配置σ0包含了所有与智能合约执行相关的网络建立信息,包括块号、块时间戳、合约地址集以及相应初始余额等,而代表被测智能合约的公共函数调用序列,每个公共函数调用都有具体输入参数其中m0必须是构造函数的调用。如图2所示,将智能合约的输入格式定义为方便进行模糊测试的输入。
[0050]
种子生成的具体步骤如下:
[0051]
步骤1:获取当前合约中的函数个数n,并生成n个种子,其中每个种子在调用构造函数后调用一次不同的函数。
[0052]
步骤2:为每个函数调用生成具体参数,有过参数类型有固定长度可以直接生成具体参数,如果没有固定长度,可以先随机生成长度的值然后再生成对应数量的数据。
[0053]
步骤3:对种子以位向量的形式进行编码。位向量的大小等于对配置进行编码的位数加上对函数调用进行编码的位置。对于每个种子,保留函数调用列表,对参数值进行编码。
[0054]
种子选择的具体步骤如下:
[0055]
步骤1:根据多级覆盖策略,计算每个种子执行后得到的《m1,m2,m3》值。
[0056]
步骤2:构建初始的基于多级覆盖的种子树。从种子树中以α的概率选择当前树中覆盖率最高的种子,以1-α的概率随机选择一个种子。
[0057]
步骤3:在进行种子变异后,根据当前变异种子的效果判断选择与当前变异种子相近的种子还是按照步骤2的方法选择新的种子进行变异。
[0058]
多级覆盖策略模块
[0059]
在二进制层面可以将智能合约表示为控制流图s=(n,i,e),其中,n表示程序中有限的控制块集;i∈n表示初始块,即合约开始;e表示带标签的边集,每个边e=(n,c,n

)表示控制块n执行后通过条件或命令c执行控制块n

。在实际执行时,种子t的执行遍历控制流图s中的一条路径,该路径访问一组节点和边。由种子t生成的是一个序列对《(σ0,n0),(σ1,n1),》,其中(n0,n1,

)表示节点被访问的顺序,σi表示访问节点ni时的配置。直接检测某个种子是否触发了智能合约中的某个漏洞的效率极低,因此引入覆盖率概念,覆盖率越高,对智能合约的功能越了解,越有可能发现漏洞。不同的覆盖指标针对的漏洞也不一样,覆盖指标的粒度也会影响发现漏洞效率。本发明综合了对不同覆盖指标以及覆盖指标粒度的考量,提出一种更为直观的方法来判断当前变异种子是否有效——使用多个粒度不同的覆盖指标同时测量变异种子的效果。同时,使用这种方法对种子池中的种子进行多级聚类;顶层提供更多的抽象性,低层提供更高的保真性。涉及多级覆盖策略的具体工作步骤如下:
[0060]
步骤1:选择函数覆盖率c1,边覆盖率c2,数据覆盖率c3这三个覆盖指标同时作为评估一个种子对合约的状态空间的覆盖情况。函数覆盖率根据种子的函数调用序列计算,边覆盖率根据种子实际执行情况的节点访问顺序计算,数据覆盖率通过对执行过程的变量的变化进行记录。使用多级覆盖策略《c1,c2,c3》计算得到的值为《m1,m2,m3》。
[0061]
步骤2:定义基于多级覆盖的种子树,构建一个虚拟根节点,第二层保存的是根据函数覆盖率计算得到的值,第三层保存的是根据边覆盖率计算得到的值,第四层保存的是根据数据覆盖率计算得到的值,并且种子也保存在第四层。
[0062]
步骤3:执行变异前的种子和变异后的种子,根据多级覆盖策略计算变异后的种子是否在出现了新的覆盖特性。
[0063]
步骤4:一旦出现了新的覆盖特性,就将该变异种子加入到种子树中。
[0064]
如图3所示,本发明的多级覆盖策略的工作流程图。多级覆盖策略目的在于探索智能合约的深层状态空间。首先,这种层级结构依靠低级的覆盖测量来保留种子之间的微小差异,以便种子树中的种子更丰富。这有助于减小查找错误触发测试案例的搜索空间,同时允许调度员使用上级的测量方法来检测不同种子之间的主要差异。
[0065]
深度强化学习模块
[0066]
本发明将模糊测试技术建模为马尔可夫决策过程,即将程序样本输入作为环境状态,将变异策略作为动作策略,将多级覆盖策略作为反馈奖励。然后选择综合值函数和策略函数的ddpg深度强化学习算法来求解该过程,从中学习得到最优的动作选择策略,实现根据当前的输入样本数据智能地选择变异动作。
[0067]
本发明采用将输入样本作为环境状态,维护一个有效样本队列qs和已有样本执行过的所有多级覆盖信息的集合p。如果在时间步t时样本状态为s
t
,变异后的样本状态为s

t
,且在执行过程中产生了新的多级覆盖特性p
t
,则将其追加到队列qs并更新集合p,且将s

t
作为下一时间步的状态输入;否则根据度量距离选择下一时间步的状态输入。深度强化学习具体步骤如下:
[0068]
步骤1:动作a
t
根据当前状态s
t
从变异动作空间中依照策略π来筛选得到变异动作a
t
。如式(1)所示。策略π是基于afl的变异策略和专门针对智能合约的策略。
[0069]at
=π(s
t
)
ꢀꢀ
(1)
[0070]
步骤2:选择动作后,执行动作得到覆盖率更高的样本对应状态s

t
。如式(2)所示。
[0071]s′
t
=mutate(s
t
,a
t
)
ꢀꢀ
(2)
[0072]
步骤3:在输入变异样本状态s

t
并执行结束后会记录本次的多级覆盖信息到共享内存中,记作《m1,m2,m3》。如式(3)所示。
[0073]
《m1,m2,m3》=execute(s

t
)
ꢀꢀ
(3)
[0074]
步骤4:记录多级覆盖指标对应的变化,变异后的种子的覆盖指标记作《m1,

,mn》

,则反馈奖励r
t
计算如下:
[0075][0076]
步骤5:智能体每一时间步的动作a
t
通过确定性动作策略μ确定,即a
t
=μ(s
t
),同时使用神经网络对其进行近似,称为策略网络a=μ(s;θ
μ
)。价值网络q
μ
仍采用贝尔曼方程来定义,同时使用神经网络对其进行近似,称为价值网络q(s,a;θq)。智能体探索的目的在于寻
找潜在的更优策略,因此引入ornstein-uhlenbeck随机过程作为噪声,该策略称为行为策略β,其产生的状态集的分布函数为ρ
β

[0077]
ddpg算法的目标函数为折扣累计奖励的期望,如式(5)所示。则最优确定性行为策略μ
*
=argmax
μjβ
(μ),即找到最大化目标函数的行为策略。
[0078]jβ
(μ)=e
μ
[r1+yr2+γ2r3+

γ
n-1rn
]
ꢀꢀ
(5)
[0079]
ddpg算法证明了目标函数j
β
(μ)关于策略网络参数θ
μ
的梯度等价于值函数q(s,a;θq)关于θ
μ
的期望梯度,如式(6)所示。
[0080][0081]
针对评论家网络的价值网络q(s,a;θq),ddpg采用dqn的时间差分的梯度下降的方法来更新其参数,其梯度表达式如式(7)所示。
[0082][0083]
时间差分目标q
t
如式(8)所示,其中,θq′
为目标价值函数q

的参数,θ
μ

为目标策略函数μ

的参数。
[0084][0085]
综上所述,ddpg算法训练的目标包含两部分,即是目标函数j
β
(μ)最大化的同时最小化价值函数q的损失函数。如图4所示,深度强化学习模块的工作流程图。
[0086]
变异策略
[0087]
使用深度强化学习的目的是为了更准确的选择合适的变异策略。同时,变异动作的选择也会影响发现漏洞的种类和数量。本发明针对智能合约的执行特性,定义了一些变异动作。智能合约的输入序列可以分为两类变异方法,一类是针对某个函数调用,具体的参数设置,另一类是针对整个输入的交易序列,函数的调用顺序。综合考虑了传统高级语言的变异策略以及智能合约的特性之后,将交易序列的变异策略定义如表1所示:
[0088]
表1变异策略
[0089][0090]
本发明对种子的变异分为两个阶段:函数变异和交易序列变异,在第一轮变异中对所有种子做函数变异,在随后的变异中结合交易序列变异,对样本进行持续性变异处理。其中interesting_8,interesting_16和interesting_32分别是执行函数过程中得到的一些常量,后面的数字代表常量的存储位数,extras为智能合约全局变量中的值。针对函数变异,除了表1中给的变异方法,还定义了一些随机方法随机组合形成方法栈,对样本做多轮变异,其方法包括随机比特反转,随机赋值,随机计算,随机数据插入等。针对交易序列变异,也有随机变异策略,将当前样本和种子树中的样本随机拼接,生成新的交易序列。针对交易序列变异,需要计算交易序列种每个函数调用对全局变量影响的重要程度。
[0091]
本发明方法在检测智能合约漏洞时,不只是针对某一个漏洞进行检测,而会将智能合约的所有可能存在的漏洞都找到,并且会给出对应的交易序列,方便对漏洞出现过程进行分析,并且也可以找到一些未知漏洞。
[0092]
本发明的上述算例仅为详细地说明本发明的计算模型和计算流程,而并非是对本发明的实施方式的限定。对于所属领域的普通技术人员来说,在上述说明的基础上还可以做出其它不同形式的变化或变动,这里无法对所有的实施方式予以穷举,凡是属于本发明的技术方案所引伸出的显而易见的变化或变动仍处于本发明的保护范围之列。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1