[发明专利]一种基于抽象语法树的智能合约重入漏洞检测方法有效
申请号: | 201910390316.9 | 申请日: | 2019-05-10 |
公开(公告)号: | CN110162474B | 公开(公告)日: | 2020-09-15 |
发明(设计)人: | 马锐;菅泽峰;陈光媛;田东海;薛静锋 | 申请(专利权)人: | 北京理工大学 |
主分类号: | G06F11/36 | 分类号: | G06F11/36 |
代理公司: | 北京理工大学专利中心 11120 | 代理人: | 温子云 |
地址: | 100081 *** | 国省代码: | 北京;11 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 基于 抽象 语法 智能 合约 漏洞 检测 方法 | ||
1.一种基于抽象语法树的智能合约重入漏洞检测方法,其特征在于,包括:
步骤一、利用编译器solc生成源程序代码的抽象语法树;
步骤二、对抽象语法树进行逐步遍历分析,针对每个合约检测在执行address.call.value()()转账函数之后是否还存在合约账户余额的变化,以及合约内是否存在互斥锁;
所述是否还存在合约账户余额的变化的判断方式为:
设立如下参数:
reentrancyCode:类型为字符串,表示危险转账函数的保存字段;
isReentrancy:类型为整型,是危险转账函数的标志,isReentrancy=1表示危险转账函数已经出现;
isChange:类型为整型,isChange = 1表示在转账函数发生之后有合约账户余额的变化;
在对抽象语法树顺序遍历的过程中,当遇到当前节点的nodeType属性为MemberAccess时,同时该节点的typeDescriptions节点中typeString属性包含“payable”字段,则将当前节点的memberName对应的值添加到reentrancyCode后面,完成与原有reentrancyCode值的拼接;当字符串reentrancyCode的值以“valuecall”开头时,则令isReentrancy为1,同时重置reentrancyCode为NULL;
在对抽象语法树顺序遍历的过程中,当遇到当前节点的nodeType属性为Assignment时,且此时isReentrancy为1,则对当前节点的下一级leftHandSide节点进行检测,若返回true,则令isChange为1;
当对抽象语法树顺序遍历结束后,若isReentrancy = 1且isChange = 1,则判定在执行address.call.value()()转账函数之后出现了合约账户余额的变化;
所述互斥锁是否存在的判断方式为:
设立如下参数:
variableMutex:类型为字符串数组,每个数组项的索引为状态变量名,对应的值表示一个互斥锁变量;
ifList:类型为字符串数组,表示if判定列表,用于互斥锁的判定;ifList是一个数组,索引为自增的序号,每一个数组项的值为if判定的判定条件;利用variableMutex的全部互斥锁变量依次对ifList中的条件进行判定,若任意一次判定不满足,则评定结果为不通过,即互斥锁成立;
isMutex:类型为整型,表示互斥锁是否存在的标志,初始isMutex=0,表示互斥锁不存在;
在对抽象语法树顺序遍历的过程中,当遇到当前节点的nodeType属性为VariableDeclaration时,则检测该节点的typeString属性,若该属性的值为bool或以uint和int开头,则将该节点的name属性的值和value属性的值记录到variableMutex中,name为索引,value为值;同时在对抽象语法树顺序遍历的过程中,当遇到当前节点的nodeType属性为Assignment且此时isReentrancy为0,则对该节点的下一级leftHandSide节点进行检测,若得到的返回值已经存在于variableMutex中,则对该节点的下一级rightHandSide节点的value属性进行检测,将value属性的值赋值给variableMutex中对应的变量;
在isReentrancy为0的前提下,当遇到当前节点的nodeType属性为BinaryOperation时,则进入该节点的下一级leftExpression和rightExpression节点进行检测,当遇到当前节点的nodeType属性为UnaryOperation时,则进入该节点的下一级subExpression节点进行检测,将返回的结果与当前节点的operator操作符记录在ifList中,作为其中一个数据项的值,数据项的索引为自增序号;
当对抽象语法树顺序遍历的过程结束后,将variableMutex用于ifList对其中每一项的值进行判定;在判定的过程中,若存在某个variableMutex的值令ifList中的条件判定不通过,则互斥锁成立,令isMutex为1;
在抽象语法树顺序遍历结束后,isMutex仍为0,判定互斥锁不存在;
步骤三、对于某个合约,如果执行address.call.value()()转账函数之后还存在合约账户余额的变化,且互斥锁不存在,则判定该合约存在重入漏洞的危险。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于北京理工大学,未经北京理工大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201910390316.9/1.html,转载请声明来源钻瓜专利网。
- 上一篇:一种软件测试方法
- 下一篇:一种基于深度迁移的软件缺陷预测方法