CN117911030A - 一种以太坊智能合约历史交易的漏洞检测方法 - Google Patents
一种以太坊智能合约历史交易的漏洞检测方法 Download PDFInfo
- Publication number
- CN117911030A CN117911030A CN202311795616.8A CN202311795616A CN117911030A CN 117911030 A CN117911030 A CN 117911030A CN 202311795616 A CN202311795616 A CN 202311795616A CN 117911030 A CN117911030 A CN 117911030A
- Authority
- CN
- China
- Prior art keywords
- execution
- operation code
- transaction
- basic block
- call
- 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.)
- Pending
Links
- 238000001514 detection method Methods 0.000 title claims abstract description 74
- 238000000034 method Methods 0.000 claims abstract description 42
- 238000004458 analytical method Methods 0.000 claims abstract description 20
- 238000012545 processing Methods 0.000 claims abstract description 12
- 238000010586 diagram Methods 0.000 claims description 78
- 238000010276 construction Methods 0.000 claims description 8
- 230000001960 triggered effect Effects 0.000 claims description 6
- 238000012795 verification Methods 0.000 claims description 3
- 230000001419 dependent effect Effects 0.000 claims description 2
- 238000007781 pre-processing Methods 0.000 claims description 2
- 238000012038 vulnerability analysis Methods 0.000 claims description 2
- 238000004364 calculation method Methods 0.000 description 5
- 230000006399 behavior Effects 0.000 description 3
- 230000006978 adaptation Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000006243 chemical reaction Methods 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 239000000284 extract Substances 0.000 description 1
- 230000002349 favourable effect Effects 0.000 description 1
- 238000011160 research Methods 0.000 description 1
- 238000000638 solvent extraction Methods 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
Landscapes
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开了一种以太坊智能合约历史交易的漏洞检测方法。本发明主要包括以下阶段:1.交易序列处理阶段,此阶段包括交易序列读取,将操作码序列初始化为操作码对象序列,操作码对象的调用次数、调用深度计算,控制流图及执行流图的构建等步骤。2.交易执行阶段,该阶段包括控制流图执行栈的选择,控制流图的执行等步骤。3.交易执行结果分析阶段,此阶段包括获取调用路径,分析各类交易漏洞等步骤。本发明适用于六类以太坊智能合约交易漏洞,根据漏洞检测结果总结出交易漏洞的表现形式。智能合约编写者能够通过交易漏洞攻击形式的反馈,降低智能合约漏洞编写的几率,提高了智能合约的安全性。本发明具有检测效率高,准确率高,可扩展性强等优点。
Description
技术领域
本发明涉及智能合约安全领域。具体地,涉及到一种以太坊智能合约历史交易漏洞检测方法。
背景技术
智能合约是在区块链网络之上的分布式,自我执行程序。智能合约一旦部署上链就是不可变,不可修改的,因此在智能合约部署上链前需确保智能合约没有漏洞是极其重要的。当前的智能合约安全研究大多都聚焦于智能合约源代码的漏洞检测,鲜少有研究人员关注智能合约间的交易安全。以太坊智能合约的漏洞也是在智能合约部署上链后在交易过程中被触发。分析以太坊交易中智能合约受到漏洞攻击细节,了解恶意合约的攻击行为有利于帮助检测更多以太坊历史交易中的攻击实例,最终能为以太坊智能合约编写者提供智能合约攻击实例参考,提高了以太坊智能合约代码的编写质量,避免写出不规范易受攻击的以太坊智能合约代码。进而降低了以太坊智能合约部署上链后的漏洞发生率。
以太坊智能合约历史交易漏洞检测相关工作:TXSPECTOR通过将智能合约交易的操作码序列间的依赖关系转换为IR(一种特殊的中间表达形式),根据TR导出各操作码的操作信息,针对各类漏洞编写检测规则,使用souffle(静态代码求解器)分析导出的操作码操作信息进行漏洞特征分析匹配。
但是,TxSpector在遇到涉及复杂算术操作的历史交易序列时,无法有效的将交易序列转换为IR形式,便无法分析对应的交易序列。TxSpector检测漏洞的方法可以抽象为对导出的操作码信息进行全局依赖关系分析方式。此方法会分析不属于同一以太坊智能合约操作的操作码,浪费了计算资源。并且遇到复杂度高的交易序列,需计算大量的操作码间的依赖关系,会导致计算超时,导致无法分析交易中的漏洞攻击。
针对上述问题,本发明提出重现以太坊智能合约历史交易(重新执行历史交易),根据重现历史交易过程中的执行信息来判断此历史交易是否受到对应漏洞攻击。通过在EVM(以太坊虚拟机)中模拟历史交易的执行,并保留交易序列在执行过程中的中间状态。定义各类漏洞的检测规则,分析交易的中间状态中是否存在对应的漏洞特征,根据检出的漏洞特征判断以太坊智能合约交易是否收到恶意攻击。此方法无需将交易序列转换为IR形式,且只分析处于同一交易行为中的操作码关系,无需分析全局的操作码,提高了检测效率以及检测准确率。
发明内容
本发明的目的是针对现有技术,提出一种以太坊智能合约历史交易的漏洞检测方法,主要包括三个阶段:交易序列处理阶段、交易执行阶段、交易执行结果分析阶段。检测方法处理流程如图1所示:(1)将智能合约交易序列文件作为交易序列预处理阶段的输入,该阶段主要由两个部分组成。其一,根据从合约交易序列文件中读取的交易序列,将交易操作码序列初始化为操作码对象序列。其二,根据第一部分的操作码对象序列构建执行流图,并为执行流图的各个基本块构建对应的控制流图。(2)在该阶段生成的执行流图及对应的控制流图用于交易执行阶段复现合约历史交易,以及用于交易执行结果分析阶段的调用路径获取。在交易执行阶段,根据上一阶段所构建的执行流图和控制流图。首先为执行流图的各基本块选择对应的执行栈,以对应的执行栈作为执行环境,在EVM中执行执行流图基本块对应的控制流图。在控制流图执行的过程中保留执行栈中执行的中间状态,执行的中间状态用于交易执行结果分析阶段对交易的漏洞分析。(3)在交易执行结果分析阶段,首先根据交易序列处理阶段生成的执行流图及控制流图获取交易序列中合约间的调用路径;然后结合调用路径、交易执行阶段生成的执行中间状态以及预定义的漏洞检测规则检测交易潜在的漏洞,最后根据检测结果输出交易漏洞检测报告。
进一步的,本发明具体包含以下步骤:
1.交易序列处理阶段,该阶段具体流程图如图2。
1-1.获取交易序列
从待测试交易序列文件中读取交易的操作码序列OC={oc1,…,oci,…,ocn},表示操作码序列0C有n个操作码;其中,操作码oci表示为三元组形式:(pci;opcodei;valuei),三个元素分别代表操作码的pc值、操作码本身以及操作码的运行参数;在读取过程中将操作码oci初始化为操作码对象opObjecti:[1inei,(pci,opcodei,valuei,call_depthi,call_numi)],其中linei代表操作码oci在操作码序列OC中的行号,call_depthi、call_numi分别代表操作码对应的调用深度及调用次数,将所有操作码oci都初始化为操作码对象后,将操作码对象序列作为输入,进入步骤1-2计算操作码对象对应的调用深度及调用次数。
1-2.计算操作码调用深度及调用次数
操作码的调用深度和调用次数是区分交易中智能合约间调用关系的辅助数据。调用深度和调用次数初始值均为0,调用次数是一个递增的值。操作码对象的调用次数和调用深度用于交易执行阶段。
遍历步骤1-1中获取的操作码序列OC,遍历过程中操作码的下标定义为i,初始调用次数为0,当遇到操作码对象opObjecti的pc值为0但当前遍历下标i不为0,调用次数加1。这说明当前交易执行流到了一个新的智能合约。并将对应的调用次数赋值给对应操作码对象opObjecti的call_numi属性。
遍历过程中每当遇到操作码对象opObjecti的pc值为0但当前遍历下标i不为0,调用深度加1。当遍历到与调用相关或者与创建相关的操作码本身opcodei时进行判断,若当前操作码对象opObjecti与上一操作码对象opObjecti-1的call_numi属性相等且上一操作码本身opcodei不为终止类型操作码时。说明当前被调用智能合约还未执行结束因此call_depthi不变,否则代表当前智能合约执行已结束并返回上一级智能合约则call_depthi减1。并将对应的调用深度赋值给对应操作码对象opObjecti的call_depthi属性。
进一步的,与调用相关操作码包括CALL、DELEGATECALL、CALLCODE、STATICCALL等,与创建相关操作码包括CREATE、CREATE2等,与终止相关的相关操作码包括THROWI、RETURN、REVERT等,操作码属性根据需检测的交易漏洞涉及的操作码和属性定义或修改,如表1。
表1操作码属性
1-3.执行流图的构建
执行流图代表交易中智能合约间的调用执行顺序,执行流图的结构为EFGblock={efgblock1,…,efgblocks,…,efgblocks},执行流图基本块的结构为efgblocks:(startBlockPCs,endBlockPCs,instrLists,CFGBlockMaps,StackEventss,allCallPaths),结构中对应的属性在表2中给出。
遍历步骤1-1中获取的操作码序列0C,在遍历过程中定义一个布尔值变量start,初始值为true,初始化第一个执行流图基本块后将start置为false。
当遇到与调用相关或者与终止相关的操作码本身opcodei时,若当前操作码对象opObject1的与上一操作码对象opObjecti-1的call_num属性不相等且上一操作码对象opObjecti-l为终止类型操作码时,说明智能合约执行已结束,需生成新的执行流图基本块,将start置为true并初始化一个新的执行流图基本块。初始化一个新的执行流图基本块后将start置为false。
遍历到与调用相关或者与终止相关之外的其他类型操作码时,将操作码对象opObject1加入当前执行流图基本块的instrLists属性中,执行流图基本块开始和结束位置的操作码对象opObjecti的pc值赋值给执行流图基本块的startBlockPCs和endBlockPCs属性作为执行流图基本块的开始和结束位置。
表2执行流图属性
属性名 | 描述 |
startBlockPC | 基本块的开始pc值 |
endBlockPC | 基本块的结束pc值 |
instrList | 基本块中的操作码 |
CFGBlockMap | 当前基本块分解的控制流图 |
StackEvents | opcode_log集合 |
allCallPath | 调用路径 |
1-4.控制流图的构建
控制流图的构建思想为遍历到与无条件跳转(JUMP)、条件跳转(JUMPI)、终止相关的操作码会生成新的基本块,根据上述操作码将控制流图分为四个类型的块,分别为无条件跳转块、条件跳转块、终止块和普通块。
根据步骤1-3构建的执行流图,一个执行流图基本块能够构建一个对应的控制流图。
控制流图的结构为CFGblock={cfgblock1,…,cfgblockj,…,cfgblockJ},控制流图基本块的结构为cfgblockj:(startBlockPCj,endBlockPcj,instrListj,conditionJumpPosj,conditionJumpExpressionj,unconditionJumpPosj,unconditionJumpExpressionj,jumpTypej,stackj),控制流图结构中对应的属性在表3中给出;
按块遍历步骤1-3中获取的执行流图的基本块序列EFGblock,进一步遍历各执行流图基本块的instrList,在遍历过程中定义一个布尔值变量start,初始值为true,初始化第一个控制流图基本块后将start置为false。
当遍历到JUMPI操作码时需生成新的控制流图基本块并将start置为true,并将控制流图基本块cfgblockj的jumpType置为1(条件跳转块)。
遍历到JUMP操作码时需生成新的控制流图基本块并将start置为true,并将控制流图基本块cfgblockij的jumpType置为2(无条件跳转块)。
当遍历到与终止相关操作码时需生成新的控制流图基本块并将start置为true,将控制流图基本块cfgblockij的jumpType置为4(终止块)。
其余控制流图基本块的jumpType置为3(普通块)。当遍历到JUMPDEST操作码时说明到了基本块结束位置,将start置为false。
遍历到其他类型操作码时将操作码对象加入当前控制流图基本块的instrList属性中。
基本块开始和结束位置的操作码对象的pc值赋值给控制流图基本块的startBlockPCj和endBlockPCj属性。
且生成的控制流图需存储至执行流图基本块的CFGBlockMap属性,CFGBlockMap:(blockStartPoss,cfgblocks),CFGBlockMap的键为控制流图基本块的startBlockPC,值为控制流图基本块。
直至所有执行流图基本块都构建了对应的控制流图,此步骤结束。
表3控制流图属性
属性名 | 描述 |
startBlockPC | 基本块的开始pc值 |
endBlockPC | 基本块的结束pc值 |
instrList | 基本块中的操作码 |
conditionJumpPos | JUMPI跳转位置 |
conditionJumpExpression | 条件跳转表达式 |
unconditionJumpPos | JUMP跳转位置 |
unconditionJumpExpression | 无条件跳转表达式 |
jumpType | 基本块类型 |
stack | 执行栈 |
步骤2交易执行阶段,如图3所示。
2-1.控制流图执行栈选择
图6中给出了控制流图执行栈选择的图例。首先初始化一个执行栈列表Stack={stack1,…,stacks,…,stacks},用于保存智能合约执行结束的执行栈。执行栈对象的结构为stack:(stack,preSrtack.call_depth),属性值分别为当前执行栈与上一执行栈的调用深度。执行栈的调用深度由控制流图基本块中的第一个操作码对象的调用深度赋值。
初始执行栈为一个空栈stack1。遍历执行流图基本块序列,若执行流图基本块的第一个操作码对象的pc值为0的话,意味着执行流到了一个新的被调用智能合约,因此要生成一个新执行栈stacks作为该基本块的执行环境。
继续遍历,若执行流图基本块第一个操作码对象为调用类或创建类操作码。说明上一调用已结束,返回上一个调用结束的执行栈stacks-1,判断stacks-1与当前执行流图基本块第一个操作码的call_depths是否相等,若相等则使用stacks-1作为当前基本块的执行栈。若不等则返回stacks-2作为当前被调用智能合约的执行栈。
选取执行栈后,进行步骤2-2控制流图执行,执行完毕后进行判断,若执行流图基本块的第一个操作码对象的pc值为0且最后一个操作码对象类型不为终止类型,将执行栈加入至执行栈列表Stack中,此情况对应了当前被调用的新智能合约还未执行结束。
若执行流图基本块的第一个操作码对象为创建类型且最后一个操作码对象类型不为终止类型,将执行栈加入至执行栈列表Stack中,此情况对应了早先被调用智能合约还未执行结束,因此执行栈都还需保留。
2-2.控制流图执行
在这一步中执行步骤1-4中由执行流图基本块构建的控制流图,步骤2-1中获取的执行栈作为当前控制流图的执行栈。
控制流图的执行顺序由基本块类型决定,其中条件跳转块的下一个执行基本块由该基本块的conditionJumpPos决定,下一个执行基本块为执行流图的CFGBlockMap中键为conditionJumpPos的基本块。无条件跳转块及终止块的执行顺序与条件跳转块同理,普通块则顺序执行下一控制流图基本块。
遍历执行流图,执行每个执行流图基本块在步骤1-4时构建的控制流图。主要执行部分为控制流图基本块中的instrList属性,instrList中包含了多个操作码对象,根据操作码本身的执行逻辑,在EVM中执行,根据操作码在执行栈的操作生成opcode_log,opcode_log代表了该操作码在执行栈内操作的执行状态。opcode_log的表达形式为(pc:opcode→pc→value_pc),pc为操作码pc值、opcode表示操作码本身、value_pc表示操作码操作值,图7为opcode_log生成过程中操作码对象与opcode_log生成对照图,图8为opcode_log的生成细节图。
所有opcode_log被保存至执行流图的StackEvents属性中作为交易执行分析阶段的漏洞检测依据,其中JUMPI操作码以及JUMP操作码相关的opcode_log分别作为conditionJumpExpression和unconditionJumpExpression,并赋值给控制流图基本块中的对应属性。conditionJumpExpression和unconditionJumpExpression中包含的操作码代表该操作码与JUMP/JUMPI操作码有依赖关系。
在此执行阶段还会判断此交易序列是否存在整数溢出漏洞,在具体实施方式3-2-6会进一步的阐述。
步骤3交易执行结果分析阶段,如图4所示。
3-1获取调用路径
根据步骤1-3和1-4构建的执行流图与控制流图,获取调用路径。调用路径指包含CALL操作码的控制流图基本块执行路径,交易中有部分漏洞由CALL操作码触发,如重入漏洞,若检测全局执行路径,其中的部分执行路径可能不包含CALL操作码,若执行路径中不包含CALL操作码则不可能含有重入漏洞,若执行这些路径则会导致浪费部分计算资源,因此针对部分漏洞直接检测调用路径能够极大提高检测的效率。
在步骤1-4中构建的控制流图,控制流图的基本块拥有基本块类型属性,基本块类型决定了块之间的执行顺序(在2-2中已阐述),按照基本块的执行顺序遍历控制流图,若执行路径中的基本块的instrList属性中包含CALL操作码那么则将该条执行路径定义为调用路径,并将此调用路径赋值给对应执行流图基本块的allCallPath属性,作为3-2中的漏洞检测路径。
3.2交易漏洞检测
交易漏洞检测的检测部分为2-2控制流图执行后生成的StackEvents以及3-1中获得的调用路径,然后通过编写检测规则检测合约执行的调用路径中依赖关系,检测发现漏洞。
本发明的有益效果:
本发明无需将合约交易序列转换为IR形式,而是直接分析合约交易执行过程,提高了检测交易漏洞的效率;(2)使用动态分析的手段检测交易漏洞,通过重新执行历史交易,并根据保存的执行状态结合预定义的漏洞规则,保证了漏洞检出的正确性;(3)本发明能够很好地扩展到交易的其他漏洞检测。通过分析本发明的漏洞检测结果,可以分析智能合约受攻击的细节,进一步提高了智能合约开发的安全性。
本发明适用于六类以太坊智能合约交易漏洞,根据漏洞检测结果总结出交易漏洞的表现形式。智能合约编写者能够通过交易漏洞攻击形式的反馈,降低智能合约漏洞编写的几率,提高了智能合约的安全性。本发明具有检测效率高,准确率高,可扩展性强等优点。
附图说明
图1为整体处理流程图;
图2为交易序列处理阶段流程图;
图3为交易执行阶段流程图;
图4为交易执行结果分析阶段流程图;
图5为执行流图转换为控制流图流程图;
图6为控制流图执行栈选择图;
图7为opcode_log生成对照图;
图8为opcode_log生成细节图。
具体实施方式
下面将结合本发明的附图,对以太坊智能合约历史交易漏洞检测方法的技术方案进行完整描述。
参考图1所示的整体处理流程图,针对以太坊的智能合约历史交易,本发明检测方法由三个阶段组成,分别是交易序列处理阶段、交易执行阶段、交易执行结果分析阶段。接下来会对这三个实现阶段的实现方法进行具体说明:
1交易序列处理阶段包括以下步骤,该阶段具体流程图如图2:
1-1.获取交易序列
从待测试交易序列文件中读取交易的操作码序列OC={oc1,…,oci,…,ocn},表示操作码序列OC有n个操作码;其中,操作码oci表示为三元组形式:(pci;opcodei;valuei),三个元素分别代表操作码的pc值、操作码本身以及操作码的运行参数;在读取过程中将操作码oci初始化为操作码对象opObjecti:[1inei,(pci,opcodei,valuei,call_depthi,call_numi)],其中linei代表操作码oci在操作码序列0c中的行号,call_depthi、call_numi分别代表操作码对应的调用深度及调用次数,将所有操作码oci都初始化为操作码对象后,将操作码对象序列作为输入,进入步骤1-2计算操作码对象对应的调用深度及调用次数。
1-2.操作码调用深度及调用次数的计算
操作码的调用深度和调用次数是区分交易中智能合约间调用关系的辅助数据。调用深度和调用次数初始值均为0,调用次数是一个递增的值。操作码对象的调用次数和调用深度用于交易执行阶段。
遍历步骤1-1中获取的操作码序列OC,遍历过程中操作码的下标定义为i,初始调用次数为0,当遇到操作码对象opObjecti的pc值为0但当前遍历下标i不为0,调用次数加1。这说明当前交易执行流到了一个新的智能合约。并将对应的调用次数赋值给对应操作码对象opObjecti的call_numi属性。
遍历过程中每当遇到操作码对象opObjecti的pc值为0但当前遍历下标i不为0,调用深度加1。当遍历到与调用相关或者与创建相关的操作码本身opcodei时进行判断,若当前操作码对象opObjecti与上一操作码对象opObjecti-1的call_numi属性相等且上一操作码本身opcodei不为终止类型操作码时。说明当前被调用智能合约还未执行结束因此call_depthi不变,否则代表当前智能合约执行已结束并返回上一级智能合约则call_depthi减l。并将对应的调用深度赋值给对应操作码对象opObjecti的call_depthi属性。
进一步的,与调用相关操作码包括CALL、DELEGATECALL、CALLCODE、STATICCALL等,与创建相关操作码包括CREATE、CREATE2等,与终止相关的相关操作码包括THROWI、RETURN、REVERT等,操作码属性根据需检测的交易漏洞涉及的操作码和属性定义或修改。
1-3.执行流图的构建
执行流图代表交易中智能合约间的调用执行顺序,执行流图的结构为EFGblock={efgblock1,…,efgblocks,…,efgblocks},执行流图基本块的结构为efgblocks:(startBlockPCs,endBlockPCs,instrLists,CFGBlockMaps,StackEventss,allCallPaths),结构中对应的属性在表2中给出。
遍历步骤1-1中获取的操作码序列OC,在遍历过程中定义一个布尔值变量start,初始值为true,初始化第一个执行流图基本块后将start置为false。
当遇到与调用相关或者与终止相关的操作码本身opcodei时,若当前操作码对象opObjecti的与上一操作码对象opObjecti-1的call_num属性不相等且上一操作码对象opObjecti-1为终止类型操作码时,说明智能合约执行已结束,需生成新的执行流图基本块,将start置为true并初始化一个新的执行流图基本块。初始化一个新的执行流图基本块后将start置为false。
遍历到与调用相关或者与终止相关之外的其他类型操作码时,将操作码对象opObjecti加入当前执行流图基本块的instrLists属性中,执行流图基本块开始和结束位置的操作码对象opObjecti的pc值赋值给执行流图基本块的startBlockPCs和endBlockPCs属性作为执行流图基本块的开始和结束位置。
遍历过程中,将执行流图基本块依次加入至efgBlockList中,遍历结束返回efgBlockList,efgBlockList即为构建的执行流图。
构建执行流图的算法1如下:
1-4控制流图的构建
图5展示了由执行流图的一个基本块转换为控制流图的过程。控制流图表示智能合约行为的执行顺序,控制流图由1-3生成的执行流图转换而来,一个执行流图基本块能够转换出若干个控制流图基本块。
控制流图的结构为CFGblock={cfgblock1,…,cfgblockj,…,cfgblockj},控制流图基本块的结构为cfgblockj:(startBlockPCj,endBlockPcj,instrListj,conditionJumpPosj,conditionJumpExpressionj,unconditionJumpPosj,unconditionJumpExpressionj,jumpTypej,stackj),控制流图结构中对应的属性在表3中给出;
控制流图的构建思想为遍历到与无条件跳转(JUMP)、条件跳转(JUMPI)、终止相关的操作码会生成新的基本块,根据上述操作码将控制流图分为四个类型的块,分别为无条件跳转块、条件跳转块、终止块和普通块。
控制流图的构建由与跳转相关或与终止相关的关键操作码决定,与跳转相关的操作码(包括JUMP/JUMPI等),与终止相关的操作码(包括STOP/REVERT/RETURN等)。当遍历到与上述操作码相关的操作码时会生成一个新的基本块,根据关键操作码给基本块的jumpType赋值(1,2,3,4对应条件跳转块,非条件跳转块,终止块,普通块),在两关键操作码间的操作码则都加入至基本块作为基本块的内容。
按块遍历步骤1-3中获取的执行流图的基本块序列EFGblock,进一步遍历各执行流图基本块的instrList,在遍历过程中定义一个布尔值变量start,初始值为true,初始化第一个控制流图基本块后将start置为false。当遍历到JUMPI操作码时需生成新的控制流图基本块并将start置为true,并将控制流图基本块cfgblockj的jumpType置为1(条件跳转块)。
遍历到JUMP操作码时需生成新的控制流图基本块并将start置为true,并将控制流图基本块cfgblockij的jumpType置为2(无条件跳转块)。
当遍历到与终止相关操作码时需生成新的控制流图基本块并将start置为true,将控制流图基本块cfgblockij的jumpType置为4(终止块)。
其余控制流图基本块的jumpType置为3(普通块)。当遍历到JUMPDEST操作码时说明到了基本块结束位置,将start置为false。
遍历到其他类型操作码时将操作码对象加入当前控制流图基本块的instrList属性中。
基本块开始和结束位置的操作码对象的pc值赋值给控制流图基本块的startBlockPCj和endBlockPCj属性。
且生成的控制流图需存储至执行流图基本块的CFGBlockMap属性,CFGBlockMap:(blockStartPoss,cfgblocks),CFGBlockMap的键为控制流图基本块的startBlockPC,值为控制流图基本块。
直至所有执行流图基本块都构建了对应的控制流图,此步骤结束。
控制流图的构建算法与执行流图构建算法类似,划分的关键操作码不同,因此不再给出伪代码。
2交易执行阶段,如图3所示。
2-1控制流图执行栈选择
图6中给出了控制流图执行栈选择的图例。首先初始化一个执行栈列表Stack={stack1,…,stacks,…,stacks},用于保存智能合约执行结束的执行栈。执行栈对象的结构为stack:(stack,preSrtack.call_depth),属性值分别为当前执行栈与上一执行栈的调用深度。执行栈的调用深度由控制流图基本块中的第一个操作码对象的调用深度赋值。
初始执行栈为一个空栈stack1。遍历执行流图基本块序列,若执行流图基本块的第一个操作码对象的pc值为0的话,意味着执行流到了一个新的被调用智能合约,因此要生成一个新执行栈stacks作为该基本块的执行环境。
继续遍历,若执行流图基本块第一个操作码对象为调用类或创建类操作码。说明上一调用已结束,返回上一个调用结束的执行栈stacks-1,判断stacks-1与当前执行流图基本块第一个操作码的call_depths是否相等,若相等则使用stacks-1作为当前基本块的执行栈。若不等则返回stacks-2作为当前被调用智能合约的执行栈。
选取执行栈后,进行步骤2-2控制流图执行,执行完毕后进行判断,若执行流图基本块的第一个操作码对象的pc值为0且最后一个操作码对象类型不为终止类型,将执行栈加入至执行栈列表Stack中,此情况对应了当前被调用的新智能合约还未执行结束。
若执行流图基本块的第一个操作码对象为创建类型且最后一个操作码对象类型不为终止类型,将执行栈加入至执行栈列表Stack中,此情况对应了早先被调用智能合约还未执行结束,因此执行栈都还需保留。当被调用合约片段执行结束返回至调用合约时,则删除此执行栈,并将执行结果值加入至上一个执行栈。
2-2控制流图执行
在这一步中执行步骤1-4中由执行流图基本块构建的控制流图,步骤2-1中获取的执行栈作为当前控制流图的执行栈。
控制流图的执行顺序由基本块类型决定,其中条件跳转块的下一个执行基本块由该基本块的conditionJumpPos决定,下一个执行基本块为执行流图的CFGBlockMap中键为conditionJumpPos的基本块。无条件跳转块及终止块的执行顺序与条件跳转块同理,普通块则顺序执行下一控制流图基本块。
遍历执行流图,执行每个执行流图基本块在步骤1-4时构建的控制流图。主要执行部分为控制流图基本块中的instrList属性,instrList中包含了多个操作码对象,根据操作码本身的执行逻辑,在EVM中执行,根据操作码在执行栈的操作生成opcode_log,opcode_log代表了该操作码在执行栈内操作的执行状态。opcode_log的表达形式为(pc:opcode→pc→value_pc),pc为操作码pc值、opcode表示操作码本身、value_pc表示操作码操作值,图7为opcode_log生成过程中操作码对象与opcode_log生成对照图,图8为opcode_log的生成细节图。
所有opcode_log被保存至执行流图的StackEvents属性中作为交易执行分析阶段的漏洞检测依据,其中JUMPI操作码以及JUMP操作码相关的opcode_log分别作为conditionJumpExpression和unconditionJumpExpression,并赋值给控制流图基本块中的对应属性。conditionJumpExpression和
unconditionJumpExpression中包含的操作码代表该操作码与JUMP/JUMPI操作码有依赖关系。
执行栈选择与控制流图执行的伪代码如下,算法2:
/>
3交易执行结果分析阶段
3-1获取调用路径
根据步骤1-3和1-4构建的执行流图与控制流图,获取调用路径。调用路径指包含CALL操作码的控制流图基本块执行路径,交易中有部分漏洞由CALL操作码触发,如重入漏洞,若检测全局执行路径,其中的部分执行路径可能不包含CALL操作码,若执行路径中不包含CALL操作码则不可能含有重入漏洞,若执行这些路径则会导致浪费部分计算资源,因此针对部分漏洞直接检测调用路径能够极大提高检测的效率。
在步骤1-4中构建的控制流图,控制流图的基本块拥有基本块类型属性,基本块类型决定了块之间的执行顺序(在2-2中已阐述),按照基本块的执行顺序遍历控制流图,若执行路径中的基本块的instrList属性中包含CALL操作码那么则将该条执行路径定义为调用路径,并将此调用路径赋值给对应执行流图基本块的allCallPath属性,作为3-2中的漏洞检测路径。
3.2交易漏洞检测
交易漏洞检测的检测部分为2-2控制流图执行后生成的StackEvents以及3-1中获得的调用路径,然后通过编写检测规则检测合约执行的调用路径中依赖关系,检测发现漏洞。针对重入漏洞、未经检查低级调用漏洞、Tx.origin漏洞、自毁漏洞、时间戳依赖漏洞和算术溢出漏洞等漏洞的检测规则如下:
3-2-1重入漏洞检测
重入漏洞的检测着重检测步骤3-1中的调用路径,调用路径是和CALL操作码相关的执行路径,重入漏洞触发的关键操作码也为CALL操作码。在检测重入漏洞前先检测交易序列中是否包含CALL操作码和SLOAD操作码,若交易序列中不包含这两类操作码直接退出重入漏洞检测。重入漏洞检测分析CALL操作码、SLOAD操作码和SSTORE操作码之间的依赖关系,遍历每个执行流图基本块的调用路径,首先获得SLOAD操作码的pc值,遍历步骤2-2生成的StackEvents,在其中寻找到CALL操作码及SSTORE操作码的pc值。若在同一调用路径中存在SSTORE操作码的pc值大于CALL操作码的pc值,并且CALL操作码的pc值大于SLOAD操作码的pc值,或者存在SSTORE操作码的pc值不存在,且CALL操作码的pc值大于SLOAD操作码的pc值的情况,说明此交易序列受到了重入漏洞攻击。
3-2-2未经检查低级调用漏洞检测
未经检查低级调用漏洞是指在调用过后没有检测返回值,在智能合约检测返回值大多使用require或if语句,这两种检测语句在操作码中均表示为ISZERO。因此分析ISZERO操作码与CALL操作码之间的依赖关系。遍历各个执行流图中保存的StackEvents,找到以CALL操作码开头的opcode_log,从opcode_log中找到CALL_pc值。遍历下一条opcode_log,若该opcode_log以ISZERO操作码开头且包含了CALL_pc值,那么说明该CALL操作码的返回值已经经过ISZERO操作码的检验,不存在此漏洞,反之此交易包含了该漏洞攻击。
3-2-3Tx.origin漏洞检测
此漏洞由ORIGIN被错误使用引发,此漏洞检测ORIGIN操作码和EQ操作码之间的依赖关系,检测执行流图的stackEvents,首先在stackEvents中找到属于ORIGIN操作码的opcode_log,获得ORIGIN_pc值,遍历下一条opcode_log,若该opcode_log以EQ开头且包含了ORIGIN_pc值,那么说明该ORIGIN操作码y与EQ操作码之间的依赖关系,说明该交易存在此漏洞攻击,反之此交易则不包含该漏洞攻击。
3-2-4自毁漏洞检测
自毁漏洞检测SELFDESTRUCT操作码与JUMPI操作码之间的依赖关系,如果智能合约在使用自毁操作时经过验证则被视为一种安全操作。遍历执行流图并进一步遍历执行流图中包含的控制流图,若控制流图中的conditionJumpExpression包含SELFDESTRUCT操作码则说明该SELFDESTRUCT操作码是经过验证后被使用的,因此判断该交易不存在该漏洞攻击,反之存在此漏洞攻击。
3-2-5时间戳依赖漏洞检测
此漏洞检测TIMESTAMP操作码与JUMPI操作码之间的依赖关系,若时间戳TIMESTAMP被使用说明该交易中可能存在潜在的时间戳漏洞。遍历执行流图并进一步遍历执行流图中包含的控制流图,若控制流图中的conditionJumpExpression包含TIMESTAMP操作码则说明该TIMESTAMP操作码与JUMPI操作码之间的依赖关系,因此判断该交易存在该漏洞攻击,反之则不存在此漏洞攻击。
3-2-6算术溢出漏洞检测
此漏洞检测交易在执行过程中是否存在算术溢出的情况,主要检测加减乘除四种算术操作。交易序列中包含了历史交易中的操作码的执行参数,因此该漏洞在步骤2-2控制流图执行的过程中检测,操作码在EVM中执行算术操作的过程中,提取算术操作中的操作数与操作结果,根据验证操作数与操作结果的前后关系判断是否存在此漏洞。以加法操作和乘法操作为例,加法操作两个操作数a,b计算的结果值为c,若c-b!=a,那么说明发生了整数溢出;乘法操作的两个乘数a,b计算的结果只为c,若c/a!=b(a,b均不为0),那么说明发生了乘法溢出,则该交易中包含此类漏洞攻击。
以上所述仅是本发明的优选实施方式,应当指出:对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
Claims (9)
1.一种以太坊智能合约历史交易的漏洞检测方法,其特征在于包括三个阶段:交易序列处理阶段、交易执行阶段、交易执行结果分析阶段,具体实现步骤如下:(1)将智能合约交易序列文件作为交易序列预处理阶段的输入,该阶段由两个部分组成:I.根据从合约交易序列文件中读取的交易序列,将交易操作码序列初始化为操作码对象序列;II.根据第一部分的操作码对象序列构建执行流图,并为执行流图的各个基本块构建对应的控制流图;(2)在该阶段生成的执行流图及对应的控制流图用于交易执行阶段复现合约历史交易,以及用于交易执行结果分析阶段的调用路径获取;在交易执行阶段,根据交易序列处理阶段所构建的执行流图和控制流图;首先为执行流图的各基本块选择对应的执行栈,以对应的执行栈作为执行环境,在EVM中执行执行流图基本块对应的控制流图;在控制流图执行的过程中保留执行栈中执行的中间状态,执行的中间状态用于交易执行结果分析阶段对交易的漏洞分析;(3)在交易执行结果分析阶段,首先根据交易序列处理阶段生成的执行流图及控制流图获取交易序列中合约间的调用路径;然后结合调用路径、交易执行阶段生成的执行中间状态以及预定义的漏洞检测规则检测交易潜在的漏洞,最后根据检测结果输出交易漏洞检测报告。
2.根据权利要求1所述的一种以太坊智能合约历史交易的漏洞检测方法,其特征在于交易序列处理阶段具体实现如下:
1-1.获取交易序列;
从待测试交易序列文件中读取交易的操作码序列OC={oc1,…,oci,…,ocn},表示操作码序列OC有n个操作码;其中,操作码oci表示为三元组形式:(pci;opcodei;valuei),三个元素分别代表操作码的pc值、操作码本身以及操作码的运行参数;在读取过程中将操作码oci初始化为操作码对象:[linei,(pci,opcodei,valuei,call_depthi,call_numi)],其中linei代表操作码oci在操作码序列OC中的行号,call_depthi、call_numi分别代表操作码对应的调用深度及调用次数,将所有操作码oci都初始化为操作码对象后,将操作码对象序列作为输入;
1-2.计算操作码调用深度及调用次数;
遍历步骤1-1中获取的操作码序列OC,遍历过程中操作码的下标定义为i,初始调用次数为0,当遇到操作码对象的pc值为0但当前遍历下标i不为0,调用次数加1;这说明当前交易执行流到了一个新的智能合约;并将对应的调用次数赋值给对应操作码对象的call_numi属性;
遍历过程中每当遇到操作码对象的pc值为0但当前遍历下标i不为0,调用深度加1;当遍历到与调用相关或者与创建相关的操作码本身时进行判断,若当前操作码对象与上一操作码对象的call_numi属性相等且上一操作码本身不为终止类型操作码时;说明当前被调用智能合约还未执行结束因此call_depthi不变,否则代表当前智能合约执行已结束并返回上一级智能合约则call_depthi减1;并将对应的调用深度赋值给对应操作码对象的call_depthi属性;
1-3.执行流图的构建;
执行流图代表交易中智能合约间的调用执行顺序,执行流图的结构为EFGblock={efgblock1,…,efgblocks,…,efgblocks},执行流图基本块的结构为efgblocks:(startBlockPCs,endBlockPCs,instrLists,CFGBlockMaps,StackEventss,allCallPaths);
遍历步骤1-1中获取的操作码序列OC,在遍历过程中定义一个布尔值变量start,初始值为true,初始化第一个执行流图基本块后将start置为false;
当遇到与调用相关或者与终止相关的操作码本身时,若当前操作码对象的与上一操作码对象-1的call_num属性不相等且上一操作码对象-1为终止类型操作码时,说明智能合约执行已结束,需生成新的执行流图基本块,将start置为true并初始化一个新的执行流图基本块;初始化一个新的执行流图基本块后将start置为false;
遍历到与调用相关或者与终止相关之外的其他类型操作码时,将操作码对象加入当前执行流图基本块的instrLists属性中,执行流图基本块开始和结束位置的操作码对象的pc值赋值给执行流图基本块的startBlockPCs和endBlockPCs属性作为执行流图基本块的开始和结束位置;
1-4.控制流图的构建
一个执行流图基本块能够构建一个对应的控制流图,根据操作码将控制流图分为四个类型的块,分别为无条件跳转块、条件跳转块、终止块和普通块;
控制流图的结构为CFGblock={cfgblock1,…,cfgblockj,…,cfgblockJ},控制流图基本块的结构为cfgblockj:(startBlockPCj,endBlockPcj,instrListj,conditionJumpPosj,conditionJumpExpressionj,unconditionJumpPosj,unconditionJumpExpressionj,jumpTypej,stackj);
按块遍历步骤1-3中获取的执行流图的基本块序列EFGblock,进而遍历各执行流图基本块的instrList,在遍历过程中定义一个布尔值变量start,初始值为true,初始化第一个控制流图基本块后将start置为false;
当遍历到JUMPI操作码时需生成新的控制流图基本块并将start置为true,并将控制流图基本块cfgblockj的jumpType置为1;
遍历到JUMP操作码时需生成新的控制流图基本块并将start置为true,并将控制流图基本块cfgblockij的jumpType置为2;
当遍历到与终止相关操作码时需生成新的控制流图基本块并将start置为true,将控制流图基本块cfgblockij的jumpType置为4;
其余控制流图基本块的jumpType置为3;当遍历到JUMPDEST操作码时说明到了基本块结束位置,将start置为false;
遍历到其他类型操作码时将操作码对象加入当前控制流图基本块的instrList属性中;
基本块开始位置和结束位置的操作码对象的pc值赋值给控制流图基本块的startBlockPCj和endBlockPCj属性;且生成的控制流图需存储至执行流图基本块的CFGBlockMap属性,CFGBlockMap:(blockStartPoss,cfgblocks),CFGBlockMap的键为控制流图基本块的startBlockPC,值为控制流图基本块;直至所有执行流图基本块都构建了对应的控制流图。
3.根据权利要求1所述的一种以太坊智能合约历史交易的漏洞检测方法,其特征在于交易执行阶段具体实现如下:
2-1.控制流图执行栈选择;
首先初始化一个执行栈列表Stack={stack1,…,stacks,…,stacks},用于保存智能合约执行结束的执行栈;执行栈对象的结构为stack:(stack,preSrtack.call_depth),属性值分别为当前执行栈与上一执行栈的调用深度;执行栈的调用深度由控制流图基本块中的第一个操作码对象的调用深度赋值;
初始执行栈为一个空栈stack1;遍历执行流图基本块序列,若执行流图基本块的第一个操作码对象的pc值为0的话,意味着执行流到了一个新的被调用智能合约,因此要生成一个新执行栈stacks作为该基本块的执行环境;
继续遍历,若执行流图基本块第一个操作码对象为调用类或创建类操作码;说明上一调用已结束,返回上一个调用结束的执行栈stacks-1,判断stacks-1与当前执行流图基本块第一个操作码的call_depths是否相等,若相等则使用stacks-1作为当前基本块的执行栈;若不等则返回stacks-2作为当前被调用智能合约的执行栈;
选取执行栈后,进行步骤2-2控制流图执行,执行完毕后进行判断,若执行流图基本块的第一个操作码对象的pc值为0且最后一个操作码对象类型不为终止类型,将执行栈加入至执行栈列表Stack中,此情况对应了当前被调用的新智能合约还未执行结束;
若执行流图基本块的第一个操作码对象为创建类型且最后一个操作码对象类型不为终止类型,将执行栈加入至执行栈列表Stack中,此情况对应了早先被调用智能合约还未执行结束,因此执行栈都还需保留;
2-2.控制流图执行;
控制流图的执行顺序由基本块类型决定,其中条件跳转块的下一个执行基本块由该基本块的conditionJumpPos决定,下一个执行基本块为执行流图的CFGBlockMap中键为conditionJumpPos的基本块;无条件跳转块及终止块的执行顺序与条件跳转块同理,普通块则顺序执行下一控制流图基本块;
遍历执行流图,执行每个执行流图基本块在步骤1-4时构建的控制流图;主要执行部分为控制流图基本块中的instrList属性,instrList中包含了多个操作码对象,根据操作码本身的执行逻辑,在EVM中执行,根据操作码在执行栈的操作生成opcode_log,opcode_log代表了该操作码在执行栈内操作的执行状态;opcode_log的表达形式为(pc:opcode→pc→value_pc),pc为操作码pc值、opcode表示操作码本身、value_pc表示操作码操作值;
所有opcode_log被保存至执行流图的StackEvents属性中作为交易执行分析阶段的漏洞检测依据,其中JUMPI操作码以及JUMP操作码相关的opcode_log分别作为conditionJumpExpression和unconditionJumpExpression,并赋值给控制流图基本块中的对应属性;conditionJumpExpression和unconditionJumpExpression中包含的操作码代表该操作码与JUMP/JUMPI操作码有依赖关系。
4.根据权利要求3所述的一种以太坊智能合约历史交易的漏洞检测方法,其特征在于交易结果分析阶段具体实现如下:
3-1获取调用路径
根据构建的执行流图与控制流图获取调用路径;调用路径指包含CALL操作码的控制流图基本块执行路径,交易中有部分漏洞由CALL操作码触发,因此针对部分漏洞直接检测调用路径能够极大提高检测的效率;
控制流图的基本块拥有基本块类型属性,基本块类型决定了块之间的执行顺序,按照基本块的执行顺序遍历控制流图,若执行路径中的基本块的instrList属性中包含CALL操作码那么则将该条执行路径定义为调用路径,并将此调用路径赋值给对应执行流图基本块的a11CallPath属性;
3-2交易漏洞检测
交易漏洞检测的检测部分为控制流图执行后生成的StackEvents以及获得的调用路径,然后通过检测规则检测合约执行的调用路径中依赖关系,检测发现漏洞。
5.根据权利要求4所述的一种以太坊智能合约历史交易的漏洞检测方法,其特征在于通过检测规则对重入漏洞检测,具体实现如下:
重入漏洞的检测着重检测调用路径,调用路径是和CALL操作码相关的执行路径,重入漏洞触发的关键操作码也为CALL操作码;在检测重入漏洞前先检测交易序列中是否包含CALL操作码和SLOAD操作码,若交易序列中不包含这两类操作码直接退出重入漏洞检测;重入漏洞检测分析CALL操作码、SLOAD操作码和SSTORE操作码之间的依赖关系,遍历每个执行流图基本块的调用路径,首先获得SLOAD操作码的pc值,遍历步骤2-2生成的StackEvents,在其中寻找到CALL操作码及SSTORE操作码的pc值;若在同一调用路径中存在SSTORE操作码的pc值大于CALL操作码的pc值,并且CALL操作码的pc值大于SLOAD操作码的pc值,或者存在SSTORE操作码的pc值不存在,且CALL操作码的pc值大于SLOAD操作码的pc值的情况,说明此交易序列受到了重入漏洞攻击。
6.根据权利要求4所述的一种以太坊智能合约历史交易的漏洞检测方法,其特征在于通过检测规则对未经检查低级调用漏洞检测,具体实现如下:
未经检查低级调用漏洞是指在调用过后没有检测返回值,在智能合约检测返回值大多使用require或if语句,这两种检测语句在操作码中均表示为ISZERO;因此分析ISZERO操作码与CALL操作码之间的依赖关系;遍历各个执行流图中保存的StackEvents,找到以CALL操作码开头的opcode_log,从opcode_log中找到CALL_pc值;遍历下一条opcode_log,若该opcode_log以ISZERO操作码开头且包含了CALL_pc值,那么说明该CALL操作码的返回值已经经过ISZERO操作码的检验,不存在此漏洞,反之此交易包含了该漏洞攻击。
7.根据权利要求4所述的一种以太坊智能合约历史交易的漏洞检测方法,其特征在于通过检测规则对Tx.origin漏洞检测,具体实现如下:
此漏洞由ORIGIN被错误使用引发,此漏洞检测ORIGIN操作码和EQ操作码之间的依赖关系,检测执行流图的stackEvents,首先在stackEvents中找到属于ORIGIN操作码的opcode_log,获得ORIGIN_pc值,遍历下一条opcode_log,若该opcode_log以EQ开头且包含了ORIGIN_pc值,那么说明该ORIGIN操作码y与EQ操作码之间的依赖关系,说明该交易存在此漏洞攻击,反之此交易则不包含该漏洞攻击。
8.根据权利要求4所述的一种以太坊智能合约历史交易的漏洞检测方法,其特征在于通过检测规则对自毁漏洞检测,具体实现如下:
自毁漏洞检测SELFDESTRUCT操作码与JUMPI操作码之间的依赖关系,如果智能合约在使用自毁操作时经过验证则被视为一种安全操作;遍历执行流图并进一步遍历执行流图中包含的控制流图,若控制流图中的conditionJumpExpression包含SELFDESTRUCT操作码则说明该SELFDESTRUCT操作码是经过验证后被使用的,因此判断该交易不存在该漏洞攻击,反之存在此漏洞攻击。
9.根据权利要求4所述的一种以太坊智能合约历史交易的漏洞检测方法,其特征在于通过检测规则时间戳依赖漏洞检测,具体实现如下:
此漏洞检测TIMESTAMP操作码与JUMPI操作码之间的依赖关系,若时间戳TIMESTAMP被使用说明该交易中可能存在潜在的时间戳漏洞;遍历执行流图并进一步遍历执行流图中包含的控制流图,若控制流图中的conditionJumpExpression包含TIMESTAMP操作码则说明该TIMESTAMP操作码与JUMPI操作码之间的依赖关系,因此判断该交易存在该漏洞攻击,反之则不存在此漏洞攻击。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311795616.8A CN117911030A (zh) | 2023-12-25 | 2023-12-25 | 一种以太坊智能合约历史交易的漏洞检测方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311795616.8A CN117911030A (zh) | 2023-12-25 | 2023-12-25 | 一种以太坊智能合约历史交易的漏洞检测方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN117911030A true CN117911030A (zh) | 2024-04-19 |
Family
ID=90683101
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311795616.8A Pending CN117911030A (zh) | 2023-12-25 | 2023-12-25 | 一种以太坊智能合约历史交易的漏洞检测方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117911030A (zh) |
-
2023
- 2023-12-25 CN CN202311795616.8A patent/CN117911030A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112100054B (zh) | 一种面向数据管控的程序静态分析方法和系统 | |
CN113051574B (zh) | 一种智能合约二进制代码的漏洞检测方法 | |
CN111008067B (zh) | 一种在虚拟机中执行功能模块的方法和装置 | |
CN116361810A (zh) | 一种基于符号执行的智能合约漏洞检测方法 | |
CN113366474A (zh) | 用于通过将计算机程序的控制流表示为数据来混淆计算机程序的系统、方法和存储介质 | |
CN115022026A (zh) | 一种区块链智能合约威胁检测装置及方法 | |
CN110162474B (zh) | 一种基于抽象语法树的智能合约重入漏洞检测方法 | |
CN112767155B (zh) | 智能合约安全交易序列生成方法、装置、介质和设备 | |
CN113312058B (zh) | 一种智能合约二进制函数的相似性分析方法 | |
CN113031967B (zh) | 一种代码转换方法及装置 | |
CN113468524B (zh) | 基于rasp的机器学习模型安全检测方法 | |
CN114201756A (zh) | 一种智能合约代码片段的漏洞检测方法和相关装置 | |
Benzinger | Automated complexity analysis of Nuprl extracted programs | |
CN117033164B (zh) | 一种智能合约安全漏洞检测方法和系统 | |
CN116933267A (zh) | 一种符号执行的智能合约漏洞检测方法、系统和设备 | |
CN117911030A (zh) | 一种以太坊智能合约历史交易的漏洞检测方法 | |
CN111158667A (zh) | 代码注入方法和装置、电子设备及存储介质 | |
CN112181816B (zh) | 一种基于场景的接口测试方法、装置、计算机设备及介质 | |
CN111190813B (zh) | 基于自动化测试的安卓应用网络行为信息提取系统及方法 | |
KR20220077847A (ko) | 교차 아키텍처 바이너리에 대한 이진 비교 방법 | |
CN114020278A (zh) | 数据处理方法、装置、设备及存储介质 | |
CN117828618B (zh) | 许可链智能合约漏洞的检测方法、装置、设备及存储介质 | |
Liu et al. | Program Analysis for Adaptive Data Analysis | |
CN115296896B (zh) | 攻击路径动态生成方法、装置、电子设备 | |
CN117520191B (zh) | 一种基于程序路径的测试完备性检查方法、设备及存储介质 |
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 |