一种可扩展的智能合约漏洞检测方法与流程

文档序号:19635438发布日期:2020-01-07 11:57阅读:202来源:国知局
一种可扩展的智能合约漏洞检测方法与流程
本发明属于智能合约安全领域,涉及一种可扩展的智能合约漏洞检测方法。
背景技术
:智能合约是区块链2.0的核心代表技术之一,其本质是计算机程序,作为运行在区块链上的计算机程序,极大的丰富了区块链的功能,使得区块链不仅仅是分布式账本数据库,而且能够完成一定程度的业务处理。由于区块链不可篡改的特性,一旦被部署到区块链上,则无法修改。如果智能合约中存在安全漏洞,一旦安全漏洞被利用,极有可能导致灾难性的后果。目前,常见的智能合约安全漏洞检测方法包括基于符号执行与符号抽象的检测方法,基于机器学习或深度学习的检测方法,形式化验证方法,动态模糊检测方法。其中,基于符号执行与符号抽象的方法,是通过构建程序的控制流程图,在控制流程图的基础上,符号执行的方法通过跟踪程序的每一个执行流程来进行检验,而符号抽象的方法,则是通过解耦合约代码的模块,对解耦后的模块进行校验分析,但其存在一定的误报率、且检测时间较长。基于机器学习或深度学习的方法,其理论基础是基于机器学习、深度学习的代码漏洞检测模型,通过对程序代码构建数值型特征作为模型输入,来完成对模型的训练。该方法存在数据集缺失以及模型检测率低等缺陷。基于形式化验证的方法,本质是一个基于数学模型的验证方法,通过数学语言描述合约代码,并证明其满足特定性质。形式化验证方法主要有定理证明、模型检测和等价性验证,它们的侧重点各有不同。定理证明根据公理和形式推演规则来验证设计实现是否满足要求,在对区块链智能合约进行安全检查,由于需要大量的人力干预,效率非常低,并且对验证人技术要求非常高;模型检测可实现机器自动处理智能合约漏洞,但是在处理较复杂的智能合约代码时,常会出现状态爆炸、误报错误、漏报错误等问题;而等价性证明主要验证程序代码的实现与设计原型的功能是否一致,无法检查出程序代码漏洞。模糊测试是一种通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法,即将随机的畸形数据插入程序,观察程序是否能容忍杂乱输入从而发现漏洞,该方法非预期输入不易构造,扩展性差,不能保证系统中已经没有漏洞。技术实现要素:有鉴于此,本发明的目的在于针对现有的智能合约漏洞检测方案所存在的检测时间长,扩展性差,成本高等缺点,提供一种可扩展的智能合约漏洞检测方法,旨在检测不同区块链平台和其上各种编程语言的智能合约的常见漏洞,提高检测效率,增强扩展性,降低误报率和漏报率。为达到上述目的,本发明提供如下技术方案:一种可扩展的智能合约漏洞检测方法,包括以下步骤:s1:获取智能合约源代码,对智能合约源代码进行预处理,生成智能合约源代码的中间表示;s2:获取自定义的智能合约安全漏洞规则库;s3:通过遍历s2步骤中的规则,对s1步骤生成的中间表示进行匹配检测;s4:获取s3步骤匹配检测的结果,形成漏洞分析报告。进一步,步骤s1中所述的预处理包括以下步骤:s11:根据智能合约的语法规范,自定义一个能识别智能合约语言的antlr语法文件,antlr根据所述语法文件生成词法分析器和语法分析器;s12:通过所述词法分析器和语法分析器对智能合约源代码进行词法分析和语法分析,生成抽象语法树;s13:通过antlr的监听器模式遍历所述抽象语法树,将其转化为对应的xml中间表示。进一步,步骤s2中所述自定义的智能合约安全漏洞规则库包括以下步骤:s21:根据智能合约常见的安全漏洞,总结出常见智能合约安全漏洞的特征,并根据此特征得出相应的特征代码;s22:将所述特征代码转换成抽象语法树;s23:根据所述抽象语法树抽象化地定义相应的xpath模式,并作为一个规则存储于xml文件中,构成智能合约安全漏洞规则库;一个xml文件对应一种智能合约语言,每一类安全漏洞对应xml文件中的一个规则节点,每一个规则节点对应一种或多种xpath模式,一种xpath模式对应一种漏洞检测模式;xpath模式中的节点与抽象语法树中的中间节点名称对应,抽象地表示特征代码。进一步,步骤s3中所述的匹配检测包括以下步骤:s31:提取每一个规则中xpath模式中的表达式;s32:使用步骤s31中提取的xpath表达式进行查询和定位xml中间表示中匹配的节点;s33:若查询到匹配的节点时,则认为智能合约中存在该条规则定义的漏洞类型,通过重定向机制定位该安全漏洞在源代码中的行号,并将该条规则的相关信息存储在临时存储区中。进一步,步骤s4中所述的获取匹配检测结果包括以下步骤:s41:遍历临时存储区;s42:若不为空,获取s41步骤中相关安全漏洞在源代码的行号以及漏洞信息。本发明的有益效果在于:(1)本发明提出的可扩展的智能合约漏洞检测方法,当用户检测智能合约源代码时,通过词法分析和语法分析将源代码转化为抽象语法树,然后为了更方便的进行代码分析,将抽象语法树转化为xml中间表示。接着提取规则库文件中xpath表达式进行查询和定位xml中间表示中匹配的节点。最后重定位于源代码中的行号,形成漏洞分析报告,可方便智能合约开发者快速、准确的定位缺陷代码。(2)本发明提出的可扩展的智能合约漏洞检测方法,通过antlr语法规则生成的词法和语法分析器将智能合约的漏洞特征代码转换为抽象语法树,并根据抽象语法树抽象化地自定义xpath模式,构成规则库。通过构建自定义合约漏洞规则库,检测方便,速度快,准确率高,且扩展性好。本发明的其他优点、目标和特征在某种程度上将在随后的说明书中进行阐述,并且在某种程度上,基于对下文的考察研究对本领域技术人员而言将是显而易见的,或者可以从本发明的实践中得到教导。本发明的目标和其他优点可以通过下面的说明书来实现和获得。附图说明为了使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作优选的详细描述,其中:图1本发明所述的可扩展的智能合约漏洞检测方法的流程示意图。具体实施方式以下通过特定的具体实例说明本发明的实施方式,本领域技术人员可由本说明书所揭露的内容轻易地了解本发明的其他优点与功效。本发明还可以通过另外不同的具体实施方式加以实施或应用,本说明书中的各项细节也可以基于不同观点与应用,在没有背离本发明的精神下进行各种修饰或改变。需要说明的是,以下实施例中所提供的图示仅以示意方式说明本发明的基本构想,在不冲突的情况下,以下实施例及实施例中的特征可以相互组合。其中,附图仅用于示例性说明,表示的仅是示意图,而非实物图,不能理解为对本发明的限制;为了更好地说明本发明的实施例,附图某些部件会有省略、放大或缩小,并不代表实际产品的尺寸;对本领域技术人员来说,附图中某些公知结构及其说明可能省略是可以理解的。本发明实施例的附图中相同或相似的标号对应相同或相似的部件;在本发明的描述中,需要理解的是,若有术语“上”、“下”、“左”、“右”、“前”、“后”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此附图中描述位置关系的用语仅用于示例性说明,不能理解为对本发明的限制,对于本领域的普通技术人员而言,可以根据具体情况理解上述术语的具体含义。如图1所示,本发明提供了一种可扩展的智能合约漏洞检测方法,其基本思想是:通过antlr语法规则生成的词法和语法分析器将智能合约的漏洞特征代码转换为抽象语法树,并根据抽象语法树抽象化地定义xpath模式,形成规则库。当用户检测智能合约源代码时,通过词法分析和语法分析将源代码转化为抽象语法树,再转化为xml中间表示。接着提取规则库文件中xpath表达式进行查询和定位xml中间表示中匹配的节点。最后重定位于源代码中的行数,形成漏洞分析报告。为了能够更容易让本领域技术人员理解,以下将用以太坊区块链solidity语言智能合约的源代码为例进行说明。参见图1,本发明的一种可扩展的智能合约漏洞检测方法,该方法包括如下步骤:s1:获取以太坊智能合约源代码,对以太坊智能合约源代码进行预处理,生成以太坊智能合约源代码的中间表示。本步骤中,使用solidity语言编写的以太坊智能合约源代码,以.sol的格式结尾。首先获取.sol的格式结尾的源代码文件,然后对以太坊智能合约源代码进行预处理,其步骤包括如下:s101:首先,根据以太坊智能合约solidity的语法规范,自定义一个能识别solidity智能合约语言的antlr语法文件,以.g4的格式结尾。antlr将会根据该.g4语法文件生成相应的词法分析器和语法分析器。s102:然后通过使用s101步骤生成的词法分析器和语法分析器对获取的以太坊智能合约源代码进行词法分析和语法分析,生成对应的抽象语法树。在计算机科学中,抽象语法树(abstractsyntaxtree,简称ast),是源程序代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源程序代码中的一种结构。ast能够包含整个编译单元的完整表示,比较直观的表示出源程序代码的语法结构。s103:为了方便后续的代码分析检查,接着通过antlr自带的监听器模式遍历s102步骤生成的抽象语法树,将其转化为对应的基于xml格式的中间表示。s2:获取自定义的以太坊智能合约安全漏洞规则库。在本步骤中,首先要定义以太坊智能合约安全漏洞规则库,然后当用户检测以太坊智能合约的漏洞时,才能获取规则库,从而获取其中的规则来实现漏洞检测。本发明将根据如下步骤定义以太坊智能合约安全漏洞规则库:s201:根据以太坊智能合约(solidity语言)常见的安全漏洞,如表1所示,总结出常见的以太坊智能合约安全漏洞特征,并根据此特征得出相应的特征代码。s202:然后将s201步骤的特征代码转换成抽象语法树。s203:接着根据s202步骤的抽象语法树,抽象地定义相应的xpath模式。为了方便后续的匹配检测,将智能合约安全漏洞规则库设计为基于xml格式的文件,并将xpath模式存储于xml文件中,构成智能合约安全漏洞规则库。一个xml文件对应一种智能合约语言,每一类安全漏洞对应xml文件中的一个规则节点,每一个规则节点对应一种或多种xpath模式,一种xpath模式对应一种漏洞检测模式。xpath模式中的节点与抽象语法树中的中间节点名称对应,抽象地表示特征代码。表1以太坊智能合约(solidity语言)常见的安全漏洞漏洞类型特征说明重入攻击外部调用时,可利用多余的gas重复进入合约们进行执行额外的操作整数溢出整数运算操作而未检测其范围造成的溢出短地址/参数地址不是160位访问权限控制使用tx.origin进行权限验证随机数误用利用下一个block的hash值或时间戳作为生成随机数的种子拒绝服务gas耗尽或程序出现逻辑错误,比如使用底层函数调用不熟悉调用未知函数默认调用fallback函数private保持隐私private不能保证修饰的变量的隐私语法风格不具备良好的编码规范是代码更容易出现错误s3:通过遍历s2步骤中的规则,对s1步骤生成的xml中间表示进行匹配检测。本步骤中,首先遍历以太坊智能合约(solidity语言)安全漏洞规则库中的每一条规则,然后对s1步骤生成的xml中间表示进行匹配检测,其步骤包括:s301:提取每一个规则中的xpath模式中的表达式。s302:使用s301步骤提取的xpath表达式进行查询和定位xml中间表示中匹配的节点。s303:若s302步骤查询到匹配的节点时,则认为智能合约中存在该条规则定义的漏洞类型,通过重定向机制定位该安全漏洞在源代码中的行号,并将该条规则的相关信息存储在临时存储区中。s4:获取s3步骤匹配检测的结果,形成漏洞分析报告。本步骤中,首先获取s3步骤匹配检测的结果,然后根据此结果形成漏洞分析报告,其具体的步骤如下:s401:遍历s303步骤的临时存储区。s402:若不为空,获取s401步骤中相关安全漏洞在源代码的行号以及漏洞信息,形成漏洞分析报告。至此,本实例中的以太坊智能合约的安全检测流程已经完成,智能合约开发者可以根据漏洞分析报告进一步改进以太坊智能合约的源代码,减少智能合约中潜在的风险。最后说明的是,以上实施例仅用以说明本发明的技术方案而非限制,尽管参照较佳实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,可以对本发明的技术方案进行修改或者等同替换,而不脱离本技术方案的宗旨和范围,其均应涵盖在本发明的权利要求范围当中。当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1