一种基于符号执行的智能合约漏洞检测方法技术

技术编号:38093544 阅读:8 留言:0更新日期:2023-07-06 09:06
本发明专利技术公开了一种基于符号执行的智能合约漏洞检测方法,该方法包含:对原始数据集进行分类,使用编译器编译Solidity源码文件,获取runtime字节码,获得统一的字节码类型的数据集;反编译字节码,获取其对应的EVM指令集;利用后向切片法构建控制流图,定义关键指令并获取关键路径,符号执行关键路径并收集路径约束;使用约束求解器对关键路径的路径约束进行求解,求解出导致关键路径执行的漏洞输入交易列表;最后搭建私链对求解出的交易进行验证,并输出验证结果。本发明专利技术的方法能够实现对现实以太坊网络中的智能合约进行可重入漏洞检测,可以生成导致合约漏洞的交易实例,并对其进行验证,显著提高了漏洞检测的准确率和效率。显著提高了漏洞检测的准确率和效率。

【技术实现步骤摘要】
一种基于符号执行的智能合约漏洞检测方法


[0001]本专利技术属于网络安全
,涉及一种基于符号执行的智能合约漏洞检测方法。

技术介绍

[0002][0003]然而,智能合约同样带来了严重的安全问题,原因可分为以下三点:一、以太坊智能合约由图灵完备的高级语言Solidity编写,图灵完备虽然意味着更高的智能性,但安全性方面的表现远远不及图灵不完备语言。Solidity语言自身设计的缺陷,以及开发人员在开发过程中引入的错误,都使得智能合约的安全性受到威胁;二、智能合约功能强大,在区块链上不仅仅是一段可自动触发执行的计算机程序,还可以接收和回应消息、收发数字货币,一个合约的执行往往会导致状态变量和账户余额的变化。智能合约包含巨大的经济价值,成为攻击者长期觊觎的目标;三、由于区块链不可更改的特性,智能合约一旦被部署上链,即使由开发人员发现了合约中的漏洞,也无法对其进行更改或升级。
[0004]历史上曾发生过多起智能合约相关安全事件,造成了巨额的经济损失,也损害了人们对区块链的信任,智能合约的安全问题成为研究者和开发者共同关注的焦点。
[0005]现有的智能合约漏洞检测方法大致包括形式化验证、符号执行、模糊测试、程序静态分析和机器学习五大类,其中基于符号执行的智能合约漏洞检测方法准确率较高、检测效果较优,成为该领域内最受欢迎的研究技术之一。但是现有的符号执行技术仍存在一些缺陷,在遍历控制流图进行路径探索时,这些技术大多盲目且随机的选择一条路径进行探索,在有限的探索时间内往往无法实现较高的代码覆盖率。尤其当程序代码量较大或者程序中包含多层循环时,很容易发生路径爆炸的问题。
[0006]本专利技术为了克服上述缺陷,提出了一种基于符号执行的智能合约漏洞检测方法,本专利技术具体步骤如下:
[0007]S1,对数据集进行分类,根据输入智能合约的文件类型分为Solidity源代码和EVM字节码两种类型;
[0008]S2,根据字节码和汇编指令的对应关系,将字节码反汇编为EVM指令序列;
[0009]S3,将EVM指令序列划分为若干基本块,根据基本块之间的跳转关系构建边,构建控制流图;
[0010]S4,定义漏洞的关键指令和相应的检测规则,在控制流图中定位关键指令,根据关键指令在控制流图中提取出关键路径,符号执行搜集到的关键路径,在执行过程中记录关键路径的路径约束;
[0011]S5,使用约束求解器对关键路径的路径约束进行求解,将约束求解产生的交易实例输出,报告漏洞;
[0012]S6,在本地网络搭建以太坊私链,创建必要的账户并进行转账,将待验证的合约部署到私链,向合约发送约束求解器产生的交易实例,观察交易结束后合约的账户余额变化,
并输出验证结果。
[0013]本专利技术的技术方案特征和改进为:
[0014]对于步骤S1,本专利技术需要对对输入的智能合约进行分类。以太坊网络中所有的智能合约都是公开的,但是绝大多数智能合约公开的是其字节码,因此对已经部署上链的智能合约进行检测大多是检测其字节码文件。尚未部署上链的以太坊智能合约使用Solidity语言编写,因此对未部署上链的智能合约进行检测大多是检测其Solidity源码文件。本专利技术对两种文件类型的智能合约进行检测,如果输入的智能合约是Solidity源码文件,使用编译器对其进行编译,获取并保留编译之后的runtime字节码,如果输入的智能合约是EVM字节码文件,则转入下一步进行反汇编处理。
[0015]对于步骤S2,本专利技术需要将EVM字节码反汇编为EVM汇编指令。以太坊字节码由144个操作码组成,每个操作码被编码为一个字节,以十六进制格式表示,并且每个操作码都有固定的参数长度,设计一个字节码和操作码指令的对应表,加上每个操作码指令与其参数长度的对应表,实现由EVM字节码到EVM指令序列的汇编指令生成过程。
[0016]对于步骤S3,本专利技术需要构建控制流图。首先将EVM指令序列划分为基本块,每个基本块以非跳转指令或JUMPDEST指令作为起点,以跳转指令或STOP、RETURN、SELFDESTRUCT指令作为结束。完成基本块的划分之后,根据指令间的跳转关系初步构建边。EVM只提供间接跳转的控制流指令,无条件跳转指令JUMP和有条件跳转指令JUMPI都读取栈顶元素以确定跳转地目标地址。有些情况下,跳转目标可以简单访问获取,但在其他情况下,跳转指令的跳转目标在函数调用前就被写入栈中,因此不可直接访问。对此,本专利技术采用后向切片法迭代重建控制流图。最初,控制流图只包含简单的边,连接这些边的JUMP指令和JUMPI指令被标记为已访问,其他的JUMP指令和JUMPI指令被标记为未访问。接下来,选择一个未被访问的JUMP指令或JUMPI指令,计算其跳转目标的后向切片集,如果能够找到一个完整的后向切片,就执行该切片上的指令集,计算出跳转目标。此时,一条新的边会被加入到控制流图中,对应的JUMP指令或JUMPI指令被标记为已访问。由于引入新的跳转关系可能会导致构建的控制流图子图中出现新的跳转指令,因此该控制流图子图中的所有的跳转指令再次标记为未访问,重复上述过程,直到所有的跳转指令都被标记为已访问。
[0017]对于步骤S4,本专利技术主要针对可重入漏洞进行分析,每一种漏洞都有特征以及与其特征相关的EVM指令,定义这些指令为关键指令,并提出相应的检测规则。在以太坊交易中,有三种主要方式实现转账,分别是transfer()、send()和call(),在EVM中,这三每个函数都会被编译成CALL指令,其中,使用call方法转账会传递所有可用的gas进行交易。此外,只有fallback函数标记为payable的智能合约才有接收以太币的功能,如果合约没有fallback函数,则不能接收外界发送的以太币。可重入漏洞的特点是,当智能合约的转账功能是通过call()函数来实现时,所有的可用gas都会被用来执行这次交易,这使得攻击者有足够的gas利用fallback函数多次回调被攻击合约。因此,针对可重入漏洞,本专利技术定义的关键指令为CALL指令和算数运算指令。对可重入漏洞的检测规则定义为,对于函数A,检查其EVM底层的CALL指令调用链,然后检查CALL指令的第一个堆栈参数gas和第三个堆栈参数value。
[0018]定义好关键指令和漏洞的检测规则后,要在控制流图中提取出关键路径。首先扫描控制流图,在其中定位关键指令,获取关键指令集。在探索路径时,本专利技术采用A*算法,该
算法将路径的代价定义为路径在控制流图中经过的分支数。探索路径时,在关键指令集中选择一个关键指令,使用A*算法探索路径,每操作一步,检查关键指令集中是否存在当前路径可达的其他关键指令,若不存在,则放弃该条路径的探索。
[0019]生成关键路径集合后,通过符号执行这些路径收集路径约束。将程序的输入以符号量代替,并将与程序相关的符号变量和输出以符号表达式的方式表示。程序中存在众多分支指令,当遇到分支指令时,符号执行会探索每条分支路径,同时保存分支的约束条件。在探本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于符号执行的智能合约漏洞检测方法,其特征及具体步骤如下:S1,对数据集进行分类,根据输入智能合约的文件类型分为Solidity源代码和EVM字节码两种类型;S2,根据字节码和汇编指令的对应关系,将字节码反汇编为EVM指令序列;S3,将EVM指令序列划分为若干基本块,根据基本块之间的跳转关系构建边,构建控制流图;S4,定义关键指令,在控制流图中定位关键指令,根据关键指令在控制流图中提取出关键路径,符号执行搜集到的关键路径,在执行过程中记录关键路径的路径约束;S5,使用约束求解器对关键路径的路径约束进行求解,将约束求解产生的交易实例输出,报告漏洞;S6,在本地网络搭建以太坊私链,创建必要的账户并进行转账,将待验证的合约部署到私链,向合约发送约束求解器产生的交易实例,观察交易结束后合约的账户余额变化,并输出验证结果。2.根据权利要求1所述的一种基于符号执行的智能合约漏洞检测方法,其特征在于,对于步骤S1,本发明需要对输入的智能合约进行分类,如果输入的智能合约是Solidity源码文件,使用编译器对其进行编译,获取并保留编译之后的runtime字节码,如果输入的智能合约是EVM字节码文件,则转入下一步进行反汇编处理。3.根据权利要求1所述的一种基于符号执行的智能合约漏洞检测方法,其特征在于,对于步骤S2,本发明需要将EVM字节码反汇编为EVM汇编指令,以太坊字节码由144个操作码组成,每个操作码被编码为一个字节,以十六进制格式表示,并且每个指令都有固定的参数长度,设计一个字节码和操作码指令的对应表,加上每个指令与其参数长度的对应表,设计一个智能合约字节码反汇编算法,实现由EVM字节码到EVM指令序列的汇编指令生成过程。4.根据权利要求1所述的一种基于符号执行的智能合约漏洞检测方法,其特征在于,对于步骤S3,本发明需要构建控制流图,首先将EVM指令序列划分为基本块,每个基本块以非跳转指令或JUMPDEST指令作为起点,以跳转指令或STOP、RETURN、SELFDESTRUCT指令作为结束,完成基本块的划分之后,根据指令间的跳转关系初步构建边,EVM只提供间接跳转的控制流指令,无条件跳转指令JUMP和有条件跳转指令JUMPI都读取栈顶元素以确定跳转地目标地址,有些情况下,跳转目标可以简单访问获取,但在其他情况下,跳转指令的跳转目标在函数调用前就被写入栈中,因此不可直接访问,对此,本发明采用后向切片法迭代重建控制流图,最初,控制流图只包含简单的边,连接这些边的JUMP指令和JUMPI指令被标记为已访问,其他的JUMP指令和JUMPI指令被标记为未访问,接下来,选择一个未被访问的JUMP指令或JUMPI指令,计算其跳转目标的后向切片集,如果能够找到一个完整的后向切片,就执行该切片上的指令集,计算出跳转目标,此时,一条新的边会被加入到控制流图中,对应的JUMP指令或JUMPI指令被标记为已访问,由于引入新的跳转关系可能会导致构建的控制流图子图中出现新的跳转指令,因此该控制流图子图中的所有的跳转指令再次标记为未访问,重复上述过程,直到所有的跳转指令都被标记为已访问。5.根据权利要...

【专利技术属性】
技术研发人员:肖军弼李范
申请(专利权)人:中国石油大学华东
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1