CN117828618B - 许可链智能合约漏洞的检测方法、装置、设备及存储介质 - Google Patents
许可链智能合约漏洞的检测方法、装置、设备及存储介质 Download PDFInfo
- Publication number
- CN117828618B CN117828618B CN202410251367.4A CN202410251367A CN117828618B CN 117828618 B CN117828618 B CN 117828618B CN 202410251367 A CN202410251367 A CN 202410251367A CN 117828618 B CN117828618 B CN 117828618B
- Authority
- CN
- China
- Prior art keywords
- slice
- class
- objective function
- focuses
- function
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 61
- 238000003860 storage Methods 0.000 title claims description 10
- 238000012545 processing Methods 0.000 claims abstract description 17
- 230000006870 function Effects 0.000 claims description 219
- 230000014509 gene expression Effects 0.000 claims description 57
- 230000008569 process Effects 0.000 claims description 22
- 230000001419 dependent effect Effects 0.000 claims description 19
- 238000004590 computer program Methods 0.000 claims description 13
- 230000004048 modification Effects 0.000 claims description 13
- 238000012986 modification Methods 0.000 claims description 13
- 238000004088 simulation Methods 0.000 claims description 12
- 238000003825 pressing Methods 0.000 claims description 3
- 238000001514 detection method Methods 0.000 abstract description 29
- 238000005516 engineering process Methods 0.000 abstract description 12
- 238000004458 analytical method Methods 0.000 abstract description 9
- 238000004880 explosion Methods 0.000 abstract description 8
- 230000015572 biosynthetic process Effects 0.000 abstract description 4
- 238000010586 diagram Methods 0.000 description 9
- 230000008901 benefit Effects 0.000 description 4
- 101150006301 SECA2 gene Proteins 0.000 description 3
- 230000000694 effects Effects 0.000 description 3
- 101150085476 secA1 gene Proteins 0.000 description 3
- 238000012360 testing method Methods 0.000 description 3
- 230000004075 alteration Effects 0.000 description 2
- 230000008859 change Effects 0.000 description 2
- 238000005206 flow analysis Methods 0.000 description 2
- 101150117931 secB1 gene Proteins 0.000 description 2
- 230000007704 transition Effects 0.000 description 2
- 230000006399 behavior Effects 0.000 description 1
- 238000004891 communication Methods 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 230000007246 mechanism Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 238000012216 screening Methods 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明涉及智能合约技术领域,尤其涉及一种许可链智能合约漏洞的检测方法,该方法包括:获取许可链智能合约的源代码,并根据所述源代码构建程序依赖图;对所述程序依赖图进行切片处理,得到切片集;对所述切片集进行符号执行处理,得到所述许可链智能合约的漏洞信息。该方法通过程序切片技术可以将复杂的许可链智能合约简化为多个切片,同时维持切片的可执行性,以删除不必要分析的分支和语句。再使用符号执行技术对每个切片进行漏洞探测,缓解由于传统符号执行技术考虑所有可能执行路径,导致分析规模过度膨胀、形成路径爆炸和内存过度消耗的问题,进而提高许可链智能合约漏洞的检测效率。
Description
技术领域
本发明涉及智能合约技术领域,尤其涉及一种许可链智能合约漏洞的检测方法、装置、设备及存储介质。
背景技术
为满足企业级区块链应用对通信私密性和数据私密性的需求,许可链被提出并广泛应用,这也标志着区块链 3.0时代的到来。许可链智能合约是一种特殊类型的智能合约,它在区块链网络中使用,并受到预先设定的权限和许可机制的约束,具有高度可控制性、可扩展性、隐私保护和定制化等特性。许可链智能合约与公共区块链上的智能合约不同,许可链智能合约在权限控制方面更加严格,只允许特定的参与者执行、查看或修改合约。
目前智能合约的漏洞检测主流方法之一是符号执行技术,通过将符号化变量作为程序的输入,探索程序执行路径并收集路径约束,最后利用约束求解器得到新的测试输入,以测试符号值是否能产生漏洞。符号执行技术能根据程序代码的路径条件为每条可行的路径生成相应的测试用例。因此这种方法面临着复杂路径求解困难、状态爆炸的问题,缺乏针对许可链智能合约的高效专用检测手段。
发明内容
本申请实施例通过提供一种许可链智能合约漏洞的检测方法、装置、设备及存储介质,解决了现有技术中检测许可链智能合约漏洞的方法存在复杂路径求解困难、状态爆炸的技术问题,实现了提高许可链智能合约漏洞的检测效率,有效缓解路径爆炸问题等技术效果。
第一方面,本发明实施例提供一种许可链智能合约漏洞的检测方法,包括:
获取许可链智能合约的源代码,并根据所述源代码构建程序依赖图;
对所述程序依赖图进行切片处理,得到切片集;
对所述切片集进行符号执行处理,得到所述许可链智能合约的漏洞信息。
优选的,所述对所述程序依赖图进行切片处理,得到切片集,包括:
定义所述程序依赖图的多个关注点,其中,所述多个关注点包括多个第一类关注点、多个第二类关注点和多个第三类关注点,所述多个第一类关注点包括状态变量修改类关注点和指针使用类关注点,所述多个第二类关注点包括事件触发类关注点、资产管理类关注点和函数调用类关注点,所述多个第三类关注点包括权限控制类关注点、核心业务逻辑类关注点和异常处理类关注点;
根据每个关注点,对所述程序依赖图建立切点,形成多个切片,进而得到所述切片集,其中,每个切片为仅包含与关注点相关的代码。
优选的,所述根据每个关注点,对所述程序依赖图建立切点,形成多个切片,进而得到所述切片集,包括:
针对每个第一类关注点,搜索到多个第一目标函数,其中,每个第一目标函数均为出现第一类关注点的语句的函数;
在所述每个第一目标函数中,在所述第一目标函数里的第一类关注点首次出现位置建立入口切点,将预先构造的断点函数插入在所述第一目标函数的末尾及所述第一目标函数的return语句之前,得到所述第一目标函数对应的一个第一类切片,进而得到所述每个第一目标函数对应的第一类切片,其中,每个第一类切片为将对应的第一目标函数的中的第一类关注点首次出现位置作为入口,所述对应的第一目标函数的断点函数作为出口的切片;
对所述每个第一类关注点进行插入所述断点函数的操作,得到多个第一类切片;
针对每个第二类关注点,搜索到第二类关注点的使用位置和所述第二类关注点的语句所在的每个第二目标函数;
在所述每个第二目标函数中,将所述第二目标函数的函数头作为入口,所述第二目标函数的return语句为出口,生成一个第二类切片,进而得到所述每个第二目标函数对应的第二类切片;
对所述每个第二类关注点进行搜索所述每个第二类关注点的使用位置并切片的操作,得到多个第二类切片;
针对每个第三类关注点,搜索到第三类关注点的使用位置和所述第三类关注点的语句所在的每个第三目标函数;
在所述每个第三目标函数中,将所述第三目标函数的函数头作为入口,所述第三目标函数的return语句为出口,生成一个第三类切片,进而得到所述每个第三目标函数对应的第三类切片;
对所述每个第三类关注点进行搜索所述每个第三类关注点的使用位置并切片的操作,得到多个第三类切片;
对每个第一类切片、每个第二类切片和每个第三类切片添加引用函数和模拟函数,得到多个完整可执行切片,进而得到所述切片集。
优选的,所述对所述切片集进行符号执行处理,得到所述许可链智能合约的漏洞信息,包括:
初始化一个空栈R;
将每个切片的根节点压入栈R中;
对所述每个切片进行路径探索,得到所述每个切片的探索结果;
将所述每个切片的探索结果中的切片路径约束表达式与预设的漏洞路径约束表达式进行对比分析,得到所述每个切片的漏洞信息,进而得到所述许可链智能合约的漏洞信息。
优选的,所述对所述每个切片进行路径探索,直到所述栈R的指针为空,得到所述每个切片的探索结果,包括:
在每个切片中,通过执行R.pop()函数,得到切片的第一个语句,并开始求解所述切片;
在求解所述切片的过程中,在每次遇到所述切片的一个分支点时,通过约束求解器对该分支点的每条分支路径进行探索,得到该分支点对应的两个切片路径约束表达式;
如果所述切片的每条分支路径的执行结果为完全执行结果,则输出所述切片中的每个分支点的两个切片路径约束表达式,并将所述切片的每个分支点的两个切片路径约束表达式作为所述切片的探索结果;
如果所述切片的某条分支路径的执行结果为执行失败结果,则保存除该路径之外的路径的切片路径约束表达式,并将所述切片中除该路径之外的路径的切片路径约束表达式作为所述切片的探索结果。
优选的,合约编译模块201,用于所述根据所述源代码构建程序依赖图,包括:
将所述源代码编译为抽象语法树AST=(V,E),其中,V为所述抽象语法树的所有节点的集合,E为所述抽象语法树的所有边的集合;
将所述抽象语法树转换为线索语法树AST`=(V`,E`,E0`),V`为所述线索语法树的所有节点的集合,E`为所述线索语法树的所有边的集合,E0`为所述线索语法树根据设定的规则生成的线索边集合;
根据所述线索语法树生成所述程序依赖图PDG(Vp,Ep),Vp为所述程序依赖图的所有节点的集合,Ep为所述程序依赖图的所有边的集合。
优选的,所述根据所述线索语法树生成所述程序依赖图PDG(Vp,Ep),包括:
在获取所述Vp中的每个语句节点N后,针对所述Vp中的每个语句节点N,如果N为控制节点且N为循环节点,则将N的循环体中的所有语句节点设置为DES_NODES;否则,N不是控制节点和循环节点,将N的k-1个子树{T2,...,Tk}中的所有语句节点设置为DES_NODES;
对所述每个语句节点N执行控制节点和循环节点的识别操作后,得到DES_NODES总集合;
针对所述DES_NODES总集合中的每个节点M,若M为控制节点,将M移出所述DES_NODES总集合;
对所述每个节点M执行控制节点的识别操作后,得到筛选后的DES_NODES总集合;
针对所述筛选后的DES_NODES总集合中的每个节点M`,添加M`的控制依赖边到Ep1;
对所述每个节点M`执行添加控制依赖边的操作,得到集合Ep1;
在所述线索语法树的E0`中,如果存在线索边N→*,则将N的语句赋值的变量加入修改变量集合modify_variableN,将N的语句使用的变量加入使用变量集合USED_VARN,其中,*为数据依赖于N的线索边的任一节点;
在所述线索语法树中,针对满足存在由线索边构成的以N开始M结束的线索链L条件的每个目标节点M``,目标节点M``为L中的M,如果modify_variableN∈USED_VARM,并且L中除了N和M之外不存在任何节点H满足modify_variableH= modify_variableN,添加数据依赖边N→M到Ep2;
对所述每个目标节点M``执行添加数据依赖边的操作,得到集合Ep2;
根据所述Ep1和所述Ep2得到所述Ep,并输出所述程序依赖图PDG(Vp,Ep)。
基于同一发明构思,第二方面,本发明还提供一种许可链智能合约漏洞的检测装置,包括:
合约编译模块,用于获取许可链智能合约的源代码,并根据所述源代码构建程序依赖图;
合约切片模块,用于对所述程序依赖图进行切片处理,得到切片集;
符号执行模块,用于对所述切片集进行符号执行处理,得到所述许可链智能合约的漏洞信息。
基于同一发明构思,第三方面,本发明提供一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现许可链智能合约漏洞的检测方法的步骤。
基于同一发明构思,第四方面,本发明提供一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,该程序被处理器执行时实现许可链智能合约漏洞的检测方法的步骤。
本发明实施例中的一个或多个技术方案,至少具有如下技术效果或优点:
在本发明实施例中,先将许可链智能合约的源代码编译生成程序依赖图,再对许可链智能合约中的关键API和关键变量建立切点,生成可执行切片,即切片集。最后通过符号执行技术,对每个切片进行高效分析。通过程序切片技术可以将复杂的许可链智能合约简化为多个切片,同时维持切片的可执行性,以删除不必要分析的分支和语句。再使用符号执行技术对每个切片进行漏洞探测,缓解由于传统符号执行技术考虑所有可能执行路径,导致分析规模过度膨胀、形成路径爆炸和内存过度消耗的问题。因此,通过本发明实施例的检测方法能显著提高许可链智能合约的漏洞检测分析效率。
附图说明
通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考图形表示相同的部件。在附图中:
图1示出了本发明实施例中的许可链智能合约漏洞的检测方法的步骤流程示意图;
图2示出了本发明实施例中的得到切片集的流程示意图;
图3示出了本发明实施例中的某个切片的分支路径的结构示意图;
图4示出了本发明实施例中的许可链智能合约漏洞的检测装置的模块示意图。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
实施例一:本发明第一实施例提供了一种许可链智能合约漏洞的检测方法,如图1所示,包括:
S101,获取许可链智能合约的源代码,并根据源代码构建程序依赖图;
S102,对程序依赖图进行切片处理,得到切片集;
S103,对切片集进行符号执行处理,得到许可链智能合约的漏洞信息。
需要说明的是,切片处理为静态程序切片技术的处理过程,符号执行处理为符号执行技术的处理过程。
在本实施例中,先将许可链智能合约的源代码编译生成程序依赖图,再对许可链智能合约中的关键API(Application Programming Interface,应用程序接口)和关键变量建立切点,生成可执行切片,即切片集。最后通过符号执行技术,对每个切片进行高效分析。通过程序切片技术可以将复杂的许可链智能合约简化为多个切片,同时维持切片的可执行性,以删除不必要分析的分支和语句。再使用符号执行技术对每个切片进行漏洞探测,缓解由于传统符号执行技术考虑所有可能执行路径,导致分析规模过度膨胀、形成路径爆炸和内存过度消耗的问题。因此,通过本实施例的检测方法能显著提高许可链智能合约的漏洞检测分析效率。
下面,结合图1来详细介绍本实施例提供的许可链智能合约漏洞的检测方法的具体实施步骤:
首先,执行步骤S101,获取许可链智能合约的源代码,并根据源代码构建程序依赖图。
具体来讲,先将源代码编译为抽象语法树AST=(V,E),其中,V为抽象语法树的所有节点的集合,E为抽象语法树的所有边的集合。再将抽象语法树AST=(V,E)转换为线索语法树AST`=(V`,E`,E0`),V`为线索语法树的所有节点的集合,E`为线索语法树的所有边的集合,E0`为线索语法树根据设定的规则生成的线索边集合。然后,根据线索语法树AST`=(V`,E`,E0`)生成程序依赖图PDG(Vp,Ep),Vp为程序依赖图的所有节点的集合,Ep为程序依赖图的所有边的集合。
将抽象语法树AST=(V,E)转换为线索语法树AST`=(V`,E`,E0`)的具体过程如下:
步骤A1:将抽象语法树的所有节点和所有边直接形成线索语法树的所有节点和所有边。即抽象语法树的所有节点直接转为线索语语法数的所有节点,V`←V。抽象语法树的所有边直接转为线索语语法数的所有边,E`←E。将线索语法数的线索边集合初始化为空,E0`=Ф。
步骤A2:针对抽象语法树的每个节点N0∈V`,如果N0代表依次执行的语句块结构,如function_body节点,则添加线索边Ti→Ti+1到E0`。其中,Ti为N0的第i棵子树,i∈1,...,k。
如果N0代表语句节点,则将N0添加到程序依赖图PDG的Vp中。
如果N0为分支节点,如if、switch等,则添加线索边N0→Ti{T2,...,Tk}到E0`,
如果N0为循环节点,如while、for等,则添加线索边N0→T2和T2→N0到E0`。
抽象语法数的每个节点N0执行上述判断过程后,得到线索边集合E0`。其中,设定的规则为步骤A2中的对抽象语法树的每个节点N0进行判断的规则。设定的规则还可根据实际需求而设置。
步骤A3:输出线索语法树(V`,E`,E0`)。
根据线索语法树AST`=(V`,E`,E0`)生成程序依赖图PDG(Vp,Ep)的具体过程如下:
步骤B1:根据步骤A2获取到Vp的每个语句节点N,针对Vp中的每个语句节点N,如果N为控制节点且N为循环节点,表示N代表for循环语句,在抽象语法树中,N的T1代表循环条件的初始化,T2代表循环判断条件,T3代表条件自增,T4代表循环体,则将N的循环体中的所有语句节点设置为DES_NODES,即将T4中的所有语句节点设置为DES_NODES。否则,N不是控制节点和循环节点,将N的k-1个子树{T2,...,Tk}中的所有语句节点设置为DES_NODES。
对每个语句节点N执行控制节点和循环节点的识别操作后,得到DES_NODES总集合。
步骤B2:针对DES_NODES总集合中的每个节点M,若M为控制节点,将M移出DES_NODES总集合。对每个节点M执行控制节点的识别操作后,得到筛选后的DES_NODES总集合。
步骤B3:针对筛选后的DES_NODES总集合中的每个节点M`,添加M`的控制依赖边N→M`到Ep1。对每个节点M`执行添加控制依赖边的操作,得到集合Ep1。
步骤B4:在线索语法树的E0`中,如果存在线索边N→*,表示N→*∈E0`,则将N的语句赋值的变量加入修改变量集合modify_variableN,将N的语句使用的变量加入使用变量集合USED_VARN。其中,*为数据依赖于N的线索边的任一节点。
步骤B5:在线索语法树中,针对满足存在由线索边构成的以N开始M结束的线索链L条件的每个目标节点M``,目标节点M``为L中的M,如果modify_variableN∈USED_VARM,且L中除N和M之外不存在任何节点H满足modify_variableH= modify_variableN,添加数据依赖边N→M到Ep2。其中,USED_VARM是L中的M的使用变量集合,即M的语句使用的变量所加入的集合。modify_variableH是H的修改变量集合,即H的语句赋值的变量所加入的集合。对每个目标节点M``执行添加数据依赖边的操作,得到集合Ep2。需要说明的是,每个目标节点M``为一个线索链L的节点M,且该线索链为由线索边构成的以N开始M结束的线索链。这里L中的M∈DES_NODES总集合。
步骤B6:根据Ep1和Ep2得到Ep,并输出程序依赖图PDG(Vp,Ep)。具体地,根据线索语法树生成的程序依赖图以DOT文件形式存储,为步骤S102提成基础,使程序依赖图方便被处理。
将许可链智能合约解析成抽象语法树,通过控制流分析和数据流分析构建程序依赖图PDG。程序依赖图PDG包括许可链智能合约程序中的函数调用关系和变量依赖关系,通过预设规则标记出程序依赖图中的关键函数和变量,即标记程序依赖图中的关键节点和边。
接着,执行步骤S102,对程序依赖图进行切片处理,得到切片集。
具体来讲,第一步,定义程序依赖图的多个关注点。其中,多个关注点包括多个第一类关注点、多个第二类关注点和多个第三类关注点。多个第一类关注点包括状态变量修改类关注点和指针使用类关注点。这里,状态变量修改类关注点指的是对状态变量进行修改的语句,状态变量修改类关注点包括状态变量的赋值、递增、递减等操作。指针使用类关注点指的是源代码中申请指针空间并指向特定变量的语句。一个程序中使用指针后,代表该指针对其指向的地址具有操作权限,能够读取或修改对应地址的值。所以在代码检测中必须关注指针使用语句,类似污点检测的功能。多个第二类关注点包括事件触发类关注点、资产管理类关注点和函数调用类关注点。这里,事件触发类关注点指的是合约中触发事件的位置。事件通常用于记录重要的状态变化或行为,例如资产转移、合约状态更新等,这些事件可能与特定功能或状态变化有关,对于理解合约的行为和执行路径至关重要。资产管理类关注点在合约切片中指的是与资产管理相关的操作。合约代码可能包含与资产管理相关的函数或代码段,例如存款、提取等操作。函数调用类关注点指在源代码程序执行的过程中发生函数调用的语句,这代表着程序执行顺序的改变和下一个执行语句地址的跳转,即程序控制权的转变。任何函数调用点都需要关注,因为程序中可能出现连续的调用,在深层的调用中就可能出现漏洞。第三类关注点包括权限控制类关注点、核心业务逻辑类关注点和异常处理类关注点。这里,权限控制类关注点指的是合约代码涉及权限控制的部分。权限控制类关注点可能包括权限检查、身份验证、访问控制等操作,用于确保只有合法用户能够执行特定操作或访问特定资源。核心业务逻辑类关注点指的是合约的主要功能实现部分。核心业务逻辑类关注点包括与合约的主要功能相关的代码段或函数。异常处理类关注点指的是合约代码中处理执行过程中可能发生的异常情况的部分。这些部分可能包括错误处理、边界情况处理等。
具体地,定义第一类关注点、第二类关注点和第三类关注点,在本质上是定义关注点为状态变量修改类语句和指针使用类语句的第一类关注点,关注点为事件触发类语句、资产管理类语句和函数调用类语句的第二类关注点,关注点为权限控制类语句、核心业务逻辑类语句和异常处理类语句的第三类关注点。这三类关注点是针对许可链智能合约的特点提取出来的,第一类关注点本质是基础变量和指针相关的关注点,第二类关注点是敏感函数相关的关注点,第三类关注点是合约功能相关的关注点。建立切片规则<c,Vc>,c为切片的唯一序号,Vc为每个切片涉及的变量集合。第二步,根据每个关注点,对程序依赖图建立切点,形成多个切片,进而得到切片集,其中,每个切片为仅包含与关注点相关的代码。
根据每个关注点,对程序依赖图建立切点,形成多个切片,进而得到切片集的具体过程如下:
第一种具体实施方式,如图2所示,在输入程序依赖图PDG(Vp,Ep)之后,针对每个第一类关注点,搜索到多个第一目标函数,其中,每个第一目标函数均为出现第一类关注点的语句的函数。在每个第一目标函数中,在第一目标函数里的第一类关注点首次出现位置建立入口切点,将预先构造的断点函数插入在第一目标函数的末尾及第一目标函数的return语句之前,得到第一目标函数对应的一个第一类切片,进而得到每个第一目标函数对应的第一类切片,其中,每个第一类切片为将对应的第一目标函数中的第一类关注点首次出现位置作为入口,对应的第一目标函数的断点函数作为出口的切片。对每个第一类关注点进行插入断点函数的操作,得到多个第一类切片。
具体地,针对每个第一类关注点,先搜索到每个第一目标函数。针对每个第一目标函数,在第一目标函数里的第一类关注点首次出现位置建立入口切点,并将预先构造的断点函数assert()插入在第一目标函数末尾以及return语句的前面,保留其间所有与第一类关注点相关的语句,表示保留入口切点至断点函数之间所有与第一类关注点相关的语句,生成一个第一目标函数对应的切片,即一个第一目标函数对应的第一类切片。每个第一目标函数均执行插入入口切点和断点函数的操作后,得到每个第一目标函数对应的一个切片/第一类切片。再对每个第一类关注点进行插入断点函数的操作后,得到多个第一类切片。
需要说明的是,每个第一类切片的入口为在第一目标函数中首次出现的第一类关注点的语句。每个第一类切片的出口为断点函数。
针对每个第二类关注点,搜索到第二类关注点的使用位置和第二类关注点的语句所在的每个第二目标函数;在每个第二目标函数中,将第二目标函数的函数头作为入口,第二目标函数的return语句为出口,生成一个第二类切片,进而得到每个第二目标函数对应的第二类切片;对每个第二类关注点进行搜索每个第二类关注点的使用位置并切片的操作,得到多个第二类切片。
具体地,对于第二类关注点,出现的形式可能为“callFunc()”、“sender.transfer()”或“payable func()”等。针对每个第二类关注点,获取第二类关注点的使用位置和第二类关注点的语句所在的每个第二目标函数。在每个第二目标函数中,指定第二目标函数的函数头为入口,第二目标函数的return语句为出口,生成一个第二目标函数对应的切片,即一个第二目标函数对应的第二类切片。每个第二目标函数均执行第二类关注点的切片操作,得到每个第二目标函数对应的一个切片/第二类切片。再对每个第二类关注点进行搜索每个第二类关注点的使用位置并切片的操作,得到多个第二类切片。
针对每个第三类关注点,搜索到第三类关注点的使用位置和第三类关注点的语句所在的每个第三目标函数;在每个第三目标函数中,将第三目标函数的函数头作为入口,第三目标函数的return语句为出口,生成一个第三类切片,进而得到每个第三目标函数对应的第三类切片;对每个第三类关注点进行搜索每个第三类关注点的使用位置并切片的操作,得到多个第三类切片。需要说明的是,针对每个第三类关注点实施的切片原理过程与针对每个第二类关注点实施的切片原理过程一致,在这里不再赘述,请参考针对每个第二类关注点实施的切片原理过程。
对每个第一类切片、每个第二类切片和每个第三类切片添加引用函数和模拟函数,得到多个完整可执行切片,进而得到切片集<S1,S2,S3,...,Sn>。具体地,对一个第一类切片添加引用函数和模拟函数,得到一个完整可执行切片,对一个第二类切片添加引用函数和模拟函数,得到一个完整可执行切片,对一个第三类切片添加引用函数和模拟函数,得到一个完整可执行切片,进而得到多个切片,形成切片集。其中,无论第一类切片、第二类切片还是第三类切片均可称为不完整的切片,由于每个不完整的切片是一个不完整的程序,因此要执行不完整的切片,必须对每个不完整的切片进行补全。那么,引用函数为解决每个不完整的切片中依赖包问题的函数,即通过引用函数补全每个不完整的切片执行过程中所需的系统依赖包。模拟函数为模拟每个不完整的切片执行过程上下文的函数,模拟函数为每个不完整的切片提供所需的输入,并接收每个不完整的切片的输出。因此,添加引用函数和模拟函数的作用是解决不完整的切片中未包含的依赖关系,保持每个切片的可执行性。
第二种具体实施方式,在第一种具体实施方式上增加每个切片的复杂性维度挑选出满足条件的多个目标切片,再对每个目标切片添加引用函数和模拟函数,得到多个完整可执行切片,进而得到切片集。
具体过程是,按照第一具体实施方式,得到多个第一类切片、多个第二类切片和多个第三类切片后,先获取每个切片和每个切片的调用深度,每个切片的调用深度为每个切片执行函数调用的次数,表示一个切片执行一次函数调用,该切片的调用深度+1。例如,某个第一类切片secA1调用某个第二类切片secB1,该第二类切片调用某个第三类切片secC1,则secA1的调用次数为2,secA1的调用深度为2,以此类推,secB1的调用次数为1,secB1的调用深度为1。
再从多个切片中筛选出多个目标切片,其中,每个目标切片为调用深度大于调用深度阈值的切片。调用深度阈值可根据实际需求而设置,例如调用深度阈值为4。例如,某个第一类切片secA2的调用深度为5,secA2的调用深度>调用深度阈值4,则将secA2作为一个目标切片。
在得到每个目标切片后,对每个目标切片添加引用函数和模拟函数,得到多个完整可执行切片,进而形成切片集。
在本实施例中,许可链智能合约的程序以程序依赖图形式输入,在对许可链智能合约的程序进行切片时需要选择感兴趣的切点,许可链智能合约的漏洞攻击多发生于状态变量修改类、指针使用类相关变量等关键变量和敏感函数、函数调用、合约功能等关键操作,指针使用也可能传递数据污点。将涉及关键变量和关键操作的语句规定为切点,建立切片规则,尽可能多地去掉与漏洞无关的代码,以切片集<S1,S2,S3,...,Sn>的形式输出。因此,通过步骤S102,对于许可链智能合约漏洞攻击高频发生的变量和函数调用做出定义并作为漏洞检测的关键,排除了不重要的分支和变量,仅包含与关键函数和关键变量直接或间接相关的代码,程序可达路径数量级降低,即降低,提高许可链智能合约的检测效率。
然后,执行步骤S103,对切片集进行符号执行处理,得到许可链智能合约的漏洞信息。
具体来讲,步骤C1:初始化一个空栈R。
步骤C2:将每个切片的根节点压入栈R中。其中,每个切片的根节点为每个切片中的初始语句。
步骤C3:对每个切片进行路径探索,得到每个切片的探索结果。
步骤C4:将每个切片的探索结果中的切片路径约束表达式与预设的漏洞路径约束表达式进行对比分析,得到每个切片的漏洞信息,进而得到许可链智能合约的漏洞信息。
对每个切片进行路径探索,得到每个切片的探索结果的具体过程如下:
在每个切片中,通过执行R.pop()函数,得到切片的第一个语句,并开始求解切片。在求解切片的过程中,在每次遇到切片的一个分支点时,通过约束求解器对该分支点的每条分支路径进行探索,得到该分支点对应的两个切片路径约束表达式。
如果切片的每条分支路径的执行结果为完全执行结果,则输出切片中的每个分支点的两个切片路径约束表达式,并将切片的每个分支点的两个切片路径约束表达式作为切片的探索结果。其中,完整执行结果为某条分支路径能生成一个切片路径约束表达式的结果。
如果切片的某条分支路径的执行结果为执行失败结果,则保存除该路径之外的路径的切片路径约束表达式,并将切片中除该路径之外的路径的切片路径约束表达式作为切片的探索结果。其中,执行失败结果为某条分支路径不能生成一个切片路径约束表达式的结果。需要说明的是,在生成切片路径约束表达式的过程中可能遇到某个函数中存在循环或递归,导致这条路径不能停止执行,或者存在符号路径不可解或者不能高效求解,则符号执行失败的情况。这种情况应该在符号执行停止的地方收集路径约束,对停止前的代码进行约束求解。
举例说明,如图3所示,图3表示某个切片,图3中圆圈代表该切片的仅有的一个分支点,该分支点左右两条线代表两条分支路径。如果该切片的该分支点的每条分支路径的执行结果均为完全执行,则左条分支路径会生成一个切片路径约束表达式,右条分支路径会生成一个切片路径约束表达式,得到该分支点的两个切片路径约束表达式。并将这两个切片路径约束表达式作为该切片的探索结果。如果该切片的该分支点的右条分支路径的执行结果为执行失败结果,左条分支路径的执行结果为完全执行结果,则保存左条分支路径的切片路径约束表达式。并将左条分支路径的切片路径约束表达式作为该切片的探索结果。
将每个切片的探索结果中的切片路径约束表达式与预设的漏洞路径约束表达式进行对比分析,得到每个切片的漏洞信息具体过程如下:
针对每个切片的每个切片路径约束表达式,将切片路径约束表达式与漏洞路径约束表达式通过约束求解器共同求解,得到求解结果。如果求解结果能同时满足切片路径约束表达式和漏洞路径约束表达式,表示切片路径约束表达式存在漏洞路径约束表达式对应的漏洞,则生成切片路径约束表达式对应的漏洞类型信息,并将切片路径约束表达式对应的漏洞类型信息添加至切片路径约束表达式对应的切片的漏洞信息中。其中,预设的漏洞路径约束表达式可选取CVE漏洞库中披露的许可链智能合约常见漏洞所构建的安全属性约束式,也可根据实际需求而设置。
如果求解结果未能同时满足切片路径约束表达式和漏洞路径约束表达式,表示切片路径约束表达式未存在漏洞路径约束表达式对应的漏洞,则生成切片路径约束表达式对应的无漏洞信息,并将切片路径约束表达式对应的无漏洞信息添加至切片路径约束表达式对应的切片的漏洞信息中。
每个切片的每个切片路径约束表达式均执行上述对比分析操作后,得到每个切片的漏洞信息。每个切片的漏洞信息汇合形成许可链智能合约的漏洞信息。
在本实施例中,由于切片集中的切片是经过简化的源程序,去除了不必要的分支和变量,降低了求解路径的数量和复杂度。通过符号执行技术,对许可链智能合约的每个切片<S1,S2,S3,...,Sn>进行检测,对每个切片的检测速度更快,变量关联度降低,误报率降低,提高许可链智能合约漏洞的检测效率。
通过本实施例的检测方法,根据经验判断和条件预设确定关键函数和关键变量,对复杂的许可链智能合约建立切点生成切片,对切片进行符号建模和约束求解。目前使用较普遍的符号执行许可链智能合约安全漏洞检测工具结合控制流程图、污点分析等技术,针对常见漏洞进行了有效的检测分析,但仍然存在准确率低,性能低以及匹配规则复杂等问题。通过执行所有可能的函数调用序列达到最大调用深度,以达到较高的路径覆盖率,然而这往往会导致路径组合爆炸,从而降低检测效率。通过本实施例的检测方法,通过引入关键函数和关键变量,对程序依赖图进行简化,提取关键代码,并进行遍历生成切片,通过对简化后的切片进行约束生成和求解,能够提高符号执行工具的执行效率并降低误报率,以此在很大程度上提高符号执行工具的检测性能
本发明实施例中的一个或多个技术方案,至少具有如下技术效果或优点:
在本发明实施例中,先将许可链智能合约的源代码编译生成程序依赖图,再对许可链智能合约中的关键API和关键变量建立切点,生成可执行切片,即切片集。最后通过符号执行技术,对每个切片进行高效分析。通过程序切片技术可以将复杂的许可链智能合约简化为多个切片,同时维持切片的可执行性,以删除不必要分析的分支和语句。再使用符号执行技术对每个切片进行漏洞探测,缓解由于传统符号执行技术考虑所有可能执行路径,导致分析规模过度膨胀、形成路径爆炸和内存过度消耗的问题。因此,通过本实施例的检测方法能显著提高许可链智能合约的漏洞检测分析效率。
实施例二:基于相同的发明构思,本发明第二实施例还提供了一种许可链智能合约漏洞的检测装置,如图4所示,包括:
合约编译模块201,用于获取许可链智能合约的源代码,并根据所述源代码构建程序依赖图;
合约切片模块202,用于对所述程序依赖图进行切片处理,得到切片集;
符号执行模块203,用于对所述切片集进行符号执行处理,得到所述许可链智能合约的漏洞信息。
作为一种可选的实施例,合约切片模块202,用于所述对所述程序依赖图进行切片处理,得到切片集,包括:
定义所述程序依赖图的多个关注点,其中,所述多个关注点包括多个第一类关注点、多个第二类关注点和多个第三类关注点,所述多个第一类关注点包括状态变量修改类关注点和指针使用类关注点,所述多个第二类关注点包括事件触发类关注点、资产管理类关注点和函数调用类关注点,所述多个第三类关注点包括权限控制类关注点、核心业务逻辑类关注点和异常处理类关注点;
根据每个关注点,对所述程序依赖图建立切点,形成多个切片,进而得到所述切片集,其中,每个切片为仅包含与关注点相关的代码。
作为一种可选的实施例,所述根据每个关注点,对所述程序依赖图建立切点,形成多个切片,进而得到所述切片集,包括:
针对每个第一类关注点,搜索到多个第一目标函数,其中,每个第一目标函数均为出现第一类关注点的语句的函数;
在所述每个第一目标函数中,在所述第一目标函数里的第一类关注点首次出现位置建立入口切点,将预先构造的断点函数插入在所述第一目标函数的末尾及所述第一目标函数的return语句之前,得到所述第一目标函数对应的一个第一类切片,进而得到所述每个第一目标函数对应的第一类切片,其中,每个第一类切片为将对应的第一目标函数中的第一类关注点首次出现位置作为入口,所述对应的第一目标函数的断点函数作为出口的切片;
对所述每个第一类关注点进行插入所述断点函数的操作,得到多个第一类切片;
针对每个第二类关注点,搜索到第二类关注点的使用位置和所述第二类关注点的语句所在的每个第二目标函数;
在所述每个第二目标函数中,将所述第二目标函数的函数头作为入口,所述第二目标函数的return语句为出口,生成一个第二类切片,进而得到所述每个第二目标函数对应的第二类切片;
对所述每个第二类关注点进行搜索所述每个第二类关注点的使用位置并切片的操作,得到多个第二类切片;
针对每个第三类关注点,搜索到第三类关注点的使用位置和所述第三类关注点的语句所在的每个第三目标函数;
在所述每个第三目标函数中,将所述第三目标函数的函数头作为入口,所述第三目标函数的return语句为出口,生成一个第三类切片,进而得到所述每个第三目标函数对应的第三类切片;
对所述每个第三类关注点进行搜索所述每个第三类关注点的使用位置并切片的操作,得到多个第三类切片;
对每个第一类切片、每个第二类切片和每个第三类切片添加引用函数和模拟函数,得到多个完整可执行切片,进而得到所述切片集。
作为一种可选的实施例,符号执行模块203,用于所述对所述切片集进行符号执行处理,得到所述许可链智能合约的漏洞信息,包括:
初始化一个空栈R;
将每个切片的根节点压入栈R中;
对所述每个切片进行路径探索,得到所述每个切片的探索结果;
将所述每个切片的探索结果中的切片路径约束表达式与预设的漏洞路径约束表达式进行对比分析,得到所述每个切片的漏洞信息,进而得到所述许可链智能合约的漏洞信息。
作为一种可选的实施例,所述对所述每个切片进行路径探索,直到所述栈R的指针为空,得到所述每个切片的探索结果,包括:
在每个切片中,通过执行R.pop()函数,得到切片的第一个语句,并开始求解所述切片;
在求解所述切片的过程中,在每次遇到所述切片的一个分支点时,通过约束求解器对该分支点的每条分支路径进行探索,得到该分支点对应的两个切片路径约束表达式;
如果所述切片的每条分支路径的执行结果为完全执行结果,则输出所述切片中的每个分支点的两个切片路径约束表达式,并将所述切片的每个分支点的两个切片路径约束表达式作为所述切片的探索结果;
如果所述切片的某条分支路径的执行结果为执行失败结果,则保存除该路径之外的路径的切片路径约束表达式,并将所述切片中除该路径之外的路径的切片路径约束表达式作为所述切片的探索结果。
作为一种可选的实施例,合约编译模块201,用于所述根据所述源代码构建程序依赖图,包括:
将所述源代码编译为抽象语法树AST=(V,E),其中,V为所述抽象语法树的所有节点的集合,E为所述抽象语法树的所有边的集合;
将所述抽象语法树转换为线索语法树AST`=(V`,E`,E0`),V`为所述线索语法树的所有节点的集合,E`为所述线索语法树的所有边的集合,E0`为所述线索语法树根据设定的规则生成的线索边集合;
根据所述线索语法树生成所述程序依赖图PDG(Vp,Ep),Vp为所述程序依赖图的所有节点的集合,Ep为所述程序依赖图的所有边的集合。
作为一种可选的实施例,所述根据所述线索语法树生成所述程序依赖图PDG(Vp,Ep),包括:
在获取所述Vp中的每个语句节点N后,针对所述Vp中的每个语句节点N,如果N为控制节点且N为循环节点,则将N的循环体中的所有语句节点设置为DES_NODES;否则,N不是控制节点和循环节点,将N的k-1个子树{T2,...,Tk}中的所有语句节点设置为DES_NODES;
对所述每个语句节点N执行控制节点和循环节点的识别操作后,得到DES_NODES总集合;
针对所述DES_NODES总集合中的每个节点M,若M为控制节点,将M移出所述DES_NODES总集合;
对所述每个节点M执行控制节点的识别操作后,得到筛选后的DES_NODES总集合;
针对所述筛选后的DES_NODES总集合中的每个节点M`,添加M`的控制依赖边到Ep1;
对所述每个节点M`执行添加控制依赖边的操作,得到集合Ep1;
在所述线索语法树的E0`中,如果存在线索边N→*,则将N的语句赋值的变量加入修改变量集合modify_variableN,将N的语句使用的变量加入使用变量集合USED_VARN,其中,*为数据依赖于N的线索边的任一节点;
在所述线索语法树中,针对满足存在由线索边构成的以N开始M结束的线索链L条件的每个目标节点M``,目标节点M``为L中的M,如果modify_variableN∈USED_VARM,并且L中除了N和M之外不存在任何节点H满足modify_variableH= modify_variableN,添加数据依赖边N→M到Ep2;
对所述每个目标节点M``执行添加数据依赖边的操作,得到集合Ep2;
根据所述Ep1和所述Ep2得到所述Ep,并输出所述程序依赖图PDG(Vp,Ep)。
由于本实施例所介绍的许可链智能合约漏洞的检测装置为实施本申请实施例一中许可链智能合约漏洞的检测方法所采用的装置,故而基于本申请实施例一中所介绍的许可链智能合约漏洞的检测方法,本领域所属技术人员能够了解本实施例的许可链智能合约漏洞的检测装置的具体实施方式以及其各种变化形式,所以在此对于该许可链智能合约漏洞的检测装置如何实现本申请实施例一中的方法不再详细介绍。只要本领域所属技术人员实施本申请实施例一中许可链智能合约漏洞的检测方法所采用的装置,都属于本申请所欲保护的范围。
实施例三:基于相同的发明构思,本发明第三实施例还提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上述许可链智能合约漏洞的检测方法中的任一方法的步骤。
实施例四:基于相同的发明构思,本发明第四实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现前文实施例一所述许可链智能合约漏洞的检测方法的任一方法的步骤。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
Claims (8)
1.一种许可链智能合约漏洞的检测方法,其特征在于,包括:
获取许可链智能合约的源代码,并根据所述源代码构建程序依赖图;
对所述程序依赖图进行切片处理,得到切片集,包括:
定义所述程序依赖图的多个关注点,其中,所述多个关注点包括多个第一类关注点、多个第二类关注点和多个第三类关注点,所述多个第一类关注点包括状态变量修改类关注点和指针使用类关注点,所述多个第二类关注点包括事件触发类关注点、资产管理类关注点和函数调用类关注点,所述多个第三类关注点包括权限控制类关注点、核心业务逻辑类关注点和异常处理类关注点;
根据每个关注点,对所述程序依赖图建立切点,形成多个切片,进而得到所述切片集,其中,每个切片为仅包含与关注点相关的代码;
其中,所述根据每个关注点,对所述程序依赖图建立切点,形成多个切片,进而得到所述切片集,包括:
针对每个第一类关注点,搜索到多个第一目标函数,其中,每个第一目标函数均为出现第一类关注点的语句的函数;
在所述每个第一目标函数中,在所述第一目标函数里的第一类关注点首次出现位置建立入口切点,将预先构造的断点函数插入在所述第一目标函数的末尾及所述第一目标函数的return语句之前,得到所述第一目标函数对应的一个第一类切片,进而得到所述每个第一目标函数对应的第一类切片,其中,每个第一类切片为将对应的第一目标函数中的第一类关注点首次出现位置作为入口,所述对应的第一目标函数的断点函数作为出口的切片;
对所述每个第一类关注点进行插入所述断点函数的操作,得到多个第一类切片;
针对每个第二类关注点,搜索到第二类关注点的使用位置和所述第二类关注点的语句所在的每个第二目标函数;
在所述每个第二目标函数中,将所述第二目标函数的函数头作为入口,所述第二目标函数的return语句为出口,生成一个第二类切片,进而得到所述每个第二目标函数对应的第二类切片;
对所述每个第二类关注点进行搜索所述每个第二类关注点的使用位置并切片的操作,得到多个第二类切片;
针对每个第三类关注点,搜索到第三类关注点的使用位置和所述第三类关注点的语句所在的每个第三目标函数;
在所述每个第三目标函数中,将所述第三目标函数的函数头作为入口,所述第三目标函数的return语句为出口,生成一个第三类切片,进而得到所述每个第三目标函数对应的第三类切片;
对所述每个第三类关注点进行搜索所述每个第三类关注点的使用位置并切片的操作,得到多个第三类切片;
对每个第一类切片、每个第二类切片和每个第三类切片添加引用函数和模拟函数,得到多个完整可执行切片,进而得到所述切片集;
对所述切片集进行符号执行处理,得到所述许可链智能合约的漏洞信息。
2.如权利要求1所述的方法,其特征在于,所述对所述切片集进行符号执行处理,得到所述许可链智能合约的漏洞信息,包括:
初始化一个空栈R;
将每个切片的根节点压入栈R中;
对所述每个切片进行路径探索,得到所述每个切片的探索结果;
将所述每个切片的探索结果中的切片路径约束表达式与预设的漏洞路径约束表达式进行对比分析,得到所述每个切片的漏洞信息,进而得到所述许可链智能合约的漏洞信息。
3.如权利要求2所述的方法,其特征在于,所述对所述每个切片进行路径探索,得到所述每个切片的探索结果,包括:
在每个切片中,通过执行R.pop()函数,得到切片的第一个语句,并开始求解所述切片;
在求解所述切片的过程中,在每次遇到所述切片的一个分支点时,通过约束求解器对该分支点的每条分支路径进行探索,得到该分支点对应的两个切片路径约束表达式;
如果所述切片的每条分支路径的执行结果为完全执行结果,则输出所述切片中的每个分支点的两个切片路径约束表达式,并将所述切片的每个分支点的两个切片路径约束表达式作为所述切片的探索结果;
如果所述切片的某条分支路径的执行结果为执行失败结果,则保存除该路径之外的路径的切片路径约束表达式,并将所述切片中除该路径之外的路径的切片路径约束表达式作为所述切片的探索结果。
4.如权利要求1所述的方法,其特征在于,所述根据所述源代码构建程序依赖图,包括:
将所述源代码编译为抽象语法树AST=(V,E),其中,V为所述抽象语法树的所有节点的集合,E为所述抽象语法树的所有边的集合;
将所述抽象语法树转换为线索语法树AST`=(V`,E`,E0`),V`为所述线索语法树的所有节点的集合,E`为所述线索语法树的所有边的集合,E0`为所述线索语法树根据设定的规则生成的线索边集合;
根据所述线索语法树生成所述程序依赖图PDG(Vp,Ep),Vp为所述程序依赖图的所有节点的集合,Ep为所述程序依赖图的所有边的集合。
5.如权利要求4所述的方法,其特征在于,所述根据所述线索语法树生成所述程序依赖图PDG(Vp,Ep),包括:
在获取所述Vp中的每个语句节点N后,针对所述Vp中的每个语句节点N,如果N为控制节点且N为循环节点,则将N的循环体中的所有语句节点设置为DES_NODES;否则,N不是控制节点和循环节点,将N的k-1个子树{T2,...,Tk}中的所有语句节点设置为DES_NODES;
对所述每个语句节点N执行控制节点和循环节点的识别操作后,得到DES_NODES总集合;
针对所述DES_NODES总集合中的每个节点M,若M为控制节点,将M移出所述DES_NODES总集合;
对所述每个节点M执行控制节点的识别操作后,得到筛选后的DES_NODES总集合;
针对所述筛选后的DES_NODES总集合中的每个节点M`,添加M`的控制依赖边到Ep1;
对所述每个节点M`执行添加控制依赖边的操作,得到集合Ep1;
在所述线索语法树的E0`中,如果存在线索边N→,则将N的语句赋值的变量加入修改变量集合modify_variableN,将N的语句使用的变量加入使用变量集合USED_VARN,其中,/>为数据依赖于N的线索边的任一节点;
在所述线索语法树中,针对满足存在由线索边构成的以N开始M结束的线索链L条件的每个目标节点M``,目标节点M``为L中的M,如果modify_variableN∈USED_VARM,且L中除N和M之外不存在任何节点H满足modify_variableH= modify_variableN,添加数据依赖边N→M到Ep2;
对所述每个目标节点M``执行添加数据依赖边的操作,得到集合Ep2;
根据所述Ep1和所述Ep2得到所述Ep,并输出所述程序依赖图PDG(Vp,Ep)。
6.一种许可链智能合约漏洞的检测装置,其特征在于,包括:
合约编译模块,用于获取许可链智能合约的源代码,并根据所述源代码构建程序依赖图;
合约切片模块,用于对所述程序依赖图进行切片处理,得到切片集,包括:
定义所述程序依赖图的多个关注点,其中,所述多个关注点包括多个第一类关注点、多个第二类关注点和多个第三类关注点,所述多个第一类关注点包括状态变量修改类关注点和指针使用类关注点,所述多个第二类关注点包括事件触发类关注点、资产管理类关注点和函数调用类关注点,所述多个第三类关注点包括权限控制类关注点、核心业务逻辑类关注点和异常处理类关注点;
根据每个关注点,对所述程序依赖图建立切点,形成多个切片,进而得到所述切片集,其中,每个切片为仅包含与关注点相关的代码;
其中,所述根据每个关注点,对所述程序依赖图建立切点,形成多个切片,进而得到所述切片集,包括:
针对每个第一类关注点,搜索到多个第一目标函数,其中,每个第一目标函数均为出现第一类关注点的语句的函数;
在所述每个第一目标函数中,在所述第一目标函数里的第一类关注点首次出现位置建立入口切点,将预先构造的断点函数插入在所述第一目标函数的末尾及所述第一目标函数的return语句之前,得到所述第一目标函数对应的一个第一类切片,进而得到所述每个第一目标函数对应的第一类切片,其中,每个第一类切片为将对应的第一目标函数中的第一类关注点首次出现位置作为入口,所述对应的第一目标函数的断点函数作为出口的切片;
对所述每个第一类关注点进行插入所述断点函数的操作,得到多个第一类切片;
针对每个第二类关注点,搜索到第二类关注点的使用位置和所述第二类关注点的语句所在的每个第二目标函数;
在所述每个第二目标函数中,将所述第二目标函数的函数头作为入口,所述第二目标函数的return语句为出口,生成一个第二类切片,进而得到所述每个第二目标函数对应的第二类切片;
对所述每个第二类关注点进行搜索所述每个第二类关注点的使用位置并切片的操作,得到多个第二类切片;
针对每个第三类关注点,搜索到第三类关注点的使用位置和所述第三类关注点的语句所在的每个第三目标函数;
在所述每个第三目标函数中,将所述第三目标函数的函数头作为入口,所述第三目标函数的return语句为出口,生成一个第三类切片,进而得到所述每个第三目标函数对应的第三类切片;
对所述每个第三类关注点进行搜索所述每个第三类关注点的使用位置并切片的操作,得到多个第三类切片;
对每个第一类切片、每个第二类切片和每个第三类切片添加引用函数和模拟函数,得到多个完整可执行切片,进而得到所述切片集;
符号执行模块,用于对所述切片集进行符号执行处理,得到所述许可链智能合约的漏洞信息。
7.一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现如权利要求1-5中任一权利要求所述的许可链智能合约漏洞的检测方法步骤。
8.一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,其特征在于,该程序被处理器执行时实现如权利要求1-5中任一权利要求所述的许可链智能合约漏洞的检测方法步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202410251367.4A CN117828618B (zh) | 2024-03-06 | 2024-03-06 | 许可链智能合约漏洞的检测方法、装置、设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202410251367.4A CN117828618B (zh) | 2024-03-06 | 2024-03-06 | 许可链智能合约漏洞的检测方法、装置、设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN117828618A CN117828618A (zh) | 2024-04-05 |
CN117828618B true CN117828618B (zh) | 2024-05-03 |
Family
ID=90506135
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202410251367.4A Active CN117828618B (zh) | 2024-03-06 | 2024-03-06 | 许可链智能合约漏洞的检测方法、装置、设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117828618B (zh) |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114817932A (zh) * | 2022-04-26 | 2022-07-29 | 河海大学 | 基于预训练模型的以太坊智能合约漏洞检测方法及系统 |
CN115906092A (zh) * | 2022-11-01 | 2023-04-04 | 广东启链科技有限公司 | 一种跨合约检测智能合约漏洞的符号执行方法 |
CN116340952A (zh) * | 2023-03-17 | 2023-06-27 | 电子科技大学 | 一种基于操作码程序依赖图的智能合约漏洞检测方法 |
CN116361810A (zh) * | 2023-03-29 | 2023-06-30 | 中国石油大学(华东) | 一种基于符号执行的智能合约漏洞检测方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20110016456A1 (en) * | 2009-07-14 | 2011-01-20 | International Business Machines Corporation | Generating additional user inputs for fault detection and localization in dynamic software applications |
-
2024
- 2024-03-06 CN CN202410251367.4A patent/CN117828618B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114817932A (zh) * | 2022-04-26 | 2022-07-29 | 河海大学 | 基于预训练模型的以太坊智能合约漏洞检测方法及系统 |
CN115906092A (zh) * | 2022-11-01 | 2023-04-04 | 广东启链科技有限公司 | 一种跨合约检测智能合约漏洞的符号执行方法 |
CN116340952A (zh) * | 2023-03-17 | 2023-06-27 | 电子科技大学 | 一种基于操作码程序依赖图的智能合约漏洞检测方法 |
CN116361810A (zh) * | 2023-03-29 | 2023-06-30 | 中国石油大学(华东) | 一种基于符号执行的智能合约漏洞检测方法 |
Non-Patent Citations (1)
Title |
---|
基于抽象语法树的智能化漏洞检测系统;陈肇炫 等;信息安全学报;20200715(第04期);第6-18页 * |
Also Published As
Publication number | Publication date |
---|---|
CN117828618A (zh) | 2024-04-05 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Wideł et al. | Beyond 2014: Formal Methods for Attack Tree--based Security Modeling | |
Jhawar et al. | Attack trees with sequential conjunction | |
CN102054149B (zh) | 一种恶意代码行为特征提取方法 | |
Kordy et al. | On quantitative analysis of attack–defense trees with repeated labels | |
CN113366474A (zh) | 用于通过将计算机程序的控制流表示为数据来混淆计算机程序的系统、方法和存储介质 | |
CN115022026A (zh) | 一种区块链智能合约威胁检测装置及方法 | |
CN114611074A (zh) | Solidity语言源代码混淆方法、系统、设备及存储介质 | |
CN116340952A (zh) | 一种基于操作码程序依赖图的智能合约漏洞检测方法 | |
US20230222223A1 (en) | Computer-implemented method for testing the cybersecurity of a target environment | |
Liu et al. | A smart contract vulnerability detection mechanism based on deep learning and expert rules | |
CN112767155B (zh) | 智能合约安全交易序列生成方法、装置、介质和设备 | |
CN116702157B (zh) | 一种基于神经网络的智能合约漏洞检测方法 | |
Storhaug et al. | Efficient avoidance of vulnerabilities in auto-completed smart contract code using vulnerability-constrained decoding | |
CN117828618B (zh) | 许可链智能合约漏洞的检测方法、装置、设备及存储介质 | |
CN116663018A (zh) | 一种基于代码可执行路径的漏洞检测方法及装置 | |
CN113419960B (zh) | 用于可信操作系统内核模糊测试的种子生成方法及系统 | |
CN115756762A (zh) | 系统调用信息确定方法、装置、电子设备及存储介质 | |
Zhang | Beak: A directed hybrid fuzzer for smart contracts | |
Bang et al. | Verification of ethereum smart contracts: a model checking approach | |
Bernard et al. | An approximation-based approach for the random exploration of large models | |
Backes et al. | Computational soundness for Dalvik bytecode | |
Zhang et al. | BiAn: Smart Contract Source Code Obfuscation | |
Shou et al. | LLM4Fuzz: Guided Fuzzing of Smart Contracts with Large Language Models | |
CN111475152A (zh) | 一种代码处理方法及装置 | |
Saha et al. | Incremental adaptive attack synthesis |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |