当前位置:文档之家› 【CN109800175A】一种基于代码插桩的以太坊智能合约重入漏洞检测方法【专利】

【CN109800175A】一种基于代码插桩的以太坊智能合约重入漏洞检测方法【专利】

【CN109800175A】一种基于代码插桩的以太坊智能合约重入漏洞检测方法【专利】
【CN109800175A】一种基于代码插桩的以太坊智能合约重入漏洞检测方法【专利】

(19)中华人民共和国国家知识产权局

(12)发明专利申请

(10)申请公布号 (43)申请公布日 (21)申请号 201910125985.3

(22)申请日 2019.02.20

(71)申请人 河海大学

地址 210024 江苏省南京市鼓楼区西康路1

(72)发明人 张鹏程 肖锋 于佳男 

(74)专利代理机构 南京苏高专利商标事务所

(普通合伙) 32204

代理人 孟红梅

(51)Int.Cl.

G06F 11/36(2006.01)

G06Q 40/04(2012.01)

(54)发明名称一种基于代码插桩的以太坊智能合约重入漏洞检测方法(57)摘要本发明公开了一种基于代码插桩的以太坊智能合约重入漏洞检测方法,属于信息技术领域。该方法通过分析以太坊智能合约源代码,根据特定转账函数语句的位置并结合函数间的相互调用关系,找到所有可能成为重入攻击靶函数的函数,并向被测合约源代码中插入用以收集被测合约运行时的数据流信息的探针代码;然后根据靶函数的函数可见性,通过向被测合约中添加函数的方式,在添加的函数中调用所有可以被外部调用的靶函数,用以触发靶函数运行,使得插入的探针代码能够获取到被测合约内的数据流信息,最终通过数据流信息判断被测合约是否具有可重入漏洞。与现有检测方法相比,本发明方法具有生成测试合约效率快、重入漏洞识别率高

等优点。权利要求书2页 说明书8页 附图4页CN 109800175 A 2019.05.24

C N 109800175

A

权 利 要 求 书1/2页CN 109800175 A

1.一种基于代码插桩的以太坊智能合约重入漏洞检测方法,其特征在于,包括如下步骤:

(1)判断被测合约内是否存在通过继承相互关联的合约,若存在,则导入继承相关的代码;否则进入下一步;

(2)判断被测合约内有无函数使用指定转账函数方式进行以太币转账,若有,则进入下一步;否则报告被测合约无可重入漏洞,检测结束;

(3)收集所有函数体内调用了指定转账函数的函数名,记为直接调用函数;并基于直接调用函数进行递归查找,获得所有在执行过程中可能执行到指定转账函数语句的函数名,记为间接调用函数;

(4)在直接调用函数的函数声明/定义后的第一条语句的位置处插入A类探针代码,在直接调用函数中的指定转账函数语句的前一句的位置处插入B类探针代码,在在直接调用函数中的指定转账函数语句的后一句的位置处插入C类探针代码;在调用链首的间接调用函数的函数声明/定义后的第一条语句的位置处插入A类探针代码,在被测合约的第一条语句位置插入D类探针代码;其中A类探针代码用于获取转帐流程开始前账户代币数量,B类探针代码用于获取调用转账前账户代币数量以及用于判定被测合约内是否存在重入漏洞,C 类探针代码用于重置变量值;D类探针代码用于声明变量;探针代码中的账本名和地址名分别根据合约内声明的用于发挥账本作用的映射型变量的变量名及接收指定转账函数的地址名设定;

(5)向被测合约内插入模拟重入攻击的测试函数,所述测试函数执行语句包括:接收外部的以太币转账并且在账本中增加相应记录;调用直接调用函数和间接调用函数中的所有外部可见的函数作为重入攻击靶函数;

(6)生成被测合约的部署文件,编译、部署被测合约于私有链上;

(7)运行被测合约中的模拟重入攻击的测试函数,插入的探针代码获取到程序运行时的数据流信息,通过分析数据流信息,给出被测合约是否具有重入漏洞的检测结果。

2.根据权利要求1所述的基于代码插桩的以太坊智能合约重入漏洞检测方法,其特征在于,所述步骤(1)中判断被测合约内是否存在通过继承相互关联的合约的方法是:按行读取被测合约,若任一行中出现合约声明的标志性字符“contract”或者是库声明的标志性字符“library”或者是接口声明的标志性字符“interface”中的一种,并且该行内同时包含了标明继承关系的关键字,则判定合约内存在继承情况。

3.根据权利要求1所述的基于代码插桩的以太坊智能合约重入漏洞检测方法,其特征在于,所述步骤(1)中对合约的继承处理方法包括:

收集合约文件中所有的合约/库/接口的声明/定义语句,从中剥离出合约/库/接口名并保存,同时识别语句中是否包含标明继承关系的关键字,若存在,则将该合约/库/接口所直接继承的合约/库/接口名从语句中分离并保存;

根据用户指定的合约名,首先在合约中找到指定合约的所有直接继承的父合约/父接口/父库的声明/定义语句,再根据直接父合约/父库/父接口的声明/定义语句查找所有的指定合约的间接继承父合约/父库/父接口名,如此递归查找,直到指定合约的所有直接/间接继承的父合约/父库/父接口都被找到;

将指定合约的所有直接/间接继承的父合约/父库/父接口代码都拷贝至指定合约中,

2

相关主题
文本预览
相关文档 最新文档