CN115408689A - 一种重入漏洞的检测与修复方法、系统 - Google Patents

一种重入漏洞的检测与修复方法、系统 Download PDF

Info

Publication number
CN115408689A
CN115408689A CN202110577018.8A CN202110577018A CN115408689A CN 115408689 A CN115408689 A CN 115408689A CN 202110577018 A CN202110577018 A CN 202110577018A CN 115408689 A CN115408689 A CN 115408689A
Authority
CN
China
Prior art keywords
path
reentry
reentrant
function
vulnerability
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
Application number
CN202110577018.8A
Other languages
English (en)
Inventor
黄瑞瑶
王与琛
沈晴霓
阮安邦
吴中海
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Peking University
Beijing Octa Innovations Information Technology Co Ltd
Original Assignee
Peking University
Beijing Octa Innovations Information Technology Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Peking University, Beijing Octa Innovations Information Technology Co Ltd filed Critical Peking University
Priority to CN202110577018.8A priority Critical patent/CN115408689A/zh
Publication of CN115408689A publication Critical patent/CN115408689A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/55Detecting local intrusion or implementing counter-measures
    • G06F21/56Computer malware detection or handling, e.g. anti-virus arrangements
    • G06F21/562Static detection
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3684Test management for test design, e.g. generating new test cases
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/57Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
    • G06F21/577Assessing vulnerabilities and evaluating computer system security

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Computer Security & Cryptography (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • General Physics & Mathematics (AREA)
  • Physics & Mathematics (AREA)
  • Computing Systems (AREA)
  • Quality & Reliability (AREA)
  • Health & Medical Sciences (AREA)
  • General Health & Medical Sciences (AREA)
  • Virology (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明公开了一种重入漏洞的检测与修复方法、系统。本发明检测方法为:对待处理的智能合约源代码进行单重入路径检测、组合重入路径检测;其中单重入路径检测方法为:首先将该智能合约源代码进行编译并生成以太坊虚拟机字节码、应用二进制接口、源码映射、抽象语法树,然后对以太坊虚拟机字节码进行遍历,得到该智能合约源代码的执行路径并生成控制流图,遍历过程中根据重入模式映射表识别路径的重入模式;其中组合重入路径检测方法为:遍历主重入路径,将每条主重入路径与每条被重入路径两两组合,判断每一组合后路径是否满足连通性与重入漏洞读写模式,若满足则认为存在重入漏洞。本发明能够在保证合约语义不变的前提下进行漏洞修复。

Description

一种重入漏洞的检测与修复方法、系统
技术领域
本发明涉及智能合约安全领域,具体为一个重入漏洞的检测与修复方法、系统。
背景技术
近年来,加密货币市场蓬勃发展。大约有5392种加密货币在交易,截至2020年4月22日,总市值为2010亿美元(参考R.Bagshaw.Top 10 cryptocurrencies by marketcapitalisation,2020)。区块链平台,如比特币,以太坊正是这个巨大的加密货币市场的基石。以太坊作为一个被广泛使用的公有链,支持智能合约的运行。智能合约是存储在区块链上的程序,可以协助和验证合约的谈判和运行。由于区块链的难以篡改的特性,加之其公开透明的特点,如果智能合约存在安全漏洞,巨大的损失将无法弥补。其中最臭名昭著的恶意攻击名为“TheDAO”。2016年6月,攻击者利用The DAO合约中的重入漏洞,并从中盗取了360万以太币,在当时这价值约5000万美元(参考Wikipedia contributors.Ethereum—Wikipedia,The Free Encyclopedia,2020)。因此本文需要在智能合约被部署上链前完成对合约中重入漏洞的检测与修复。
重入漏洞检测与修复
目前常用的重入漏洞检测方法是静态分析。Oyente、Zeus和Securify都是用静态分析的方法(参考L.Luu,D.-H.Chu,H.Olickel et al.“Making smart contractssmarter”.In:Proceedings of the 2016 ACM SIGSAC conference on computer andcommunications security,2016:254–269;S.Kalra,S.Goel,M.Dhawan et al.“ZEUS:Analyzing Safety of Smart Contracts.”In:NDSS,2018;P.Tsankov,A.Dan,D.Drachsler-Cohen et al.“Securify:Practical security analysis of smartcontracts”.In:Proceedings of the 2018ACM SIGSAC Conference on Computer andCommunications Security,2018:67–82),但前两者由于对于重入漏洞的模式定义不完备,只能检测重入自身函数的重入漏洞,存在漏检的问题,后者由于对重入漏洞模式定义过于保守,导致会误判已经添加重入锁的不再包含重入漏洞的合约。Sereum中使用了动态检测的方法(参考M.Rodler,W.Li,G.O.Karame et al.“Sereum:Protecting Existing SmartContracts Against Re-Entrancy Attacks”.In:26th Annual Network and DistributedSystem Security Symposium,NDSS 2019,San Diego,California,USA,February 24-27,2019),但其局限在于无法覆盖合约中所有分支,如果函数的某些执行过程在交易中没有被调用,那么这些执行过程中的重入漏洞将无法被发现。
传统软件自动化修复框架分为“生成与验证”框架和“语义驱动”框架,Yu等人参考“生成与验证”框架实现了SCRepair系统来自动化修复重入漏洞(参考X.L.Yu,O.Al-Bataineh,D.Lo et al.“Smart contract repair”.ACM Transactions on SoftwareEngineering and Methodology (TOSEM),2020,29(4):1–32)。但目前系统只能检测修复链上公开的合约(修改下载的副本,不修改链上内容),因为测试用例依赖于链上已经执行的交易,难以检测修复未上链产生交易的漏洞合约。并且系统中使用相对随机的方法生成补丁,缺少对修复结果语义等价的形式化验证。因此本文采用基于模板的修复方法,完成重入漏洞的修复与语义等价的形式化验证。
发明内容
针对现有技术中存在的技术问题,本发明的目的在于提供一种重入漏洞的检测与修复方法、系统。本发明使用静态检测与基于模板的修复方法,并针对RRW-Self,RRW-Cross和RWR-Cross三种重入漏洞类型,设计了基于锁的修复模板与基于重排序的修复模板,并实现了检测修复系统。在该工具的帮助下,用户只需提供智能合约的Solidity源代码,即可生成一份重入漏洞检测修复报告,包括检测结果,修复代码与验证测试用例,随后用户可以在测试链上利用测试用例对修复代码进行语义等价检查。智能合约中包含重入漏洞将会被攻击者利用,攻击者对区块链状态恶意修改,包括重复转账、合约变量修改、日志异常记录,导致资金风险。本发明的目的是利用静态检测方法检测智能合约中的重入漏洞,并在保证合约语义不变的前提下进行漏洞修复,生成不含重入漏洞的合约源码与测试用例。
本发明的技术方案为:
一种静态检测与模板修复相结合的重入漏洞检测与修复方法,其步骤包括:
1)用户提供待分析的智能合约Solidity源代码,并上传至检测修复系统中。
2)检测修复系统对源代码进行重入漏洞检测。具体分为单重入路径检测和组合重入路径检测两部分。21)和22)检测完成后进行4)中的重入漏洞修复步骤。
21)单重入路径检测:首先将源代码编译、并生成EVM(以太坊虚拟机,EthereumVirtual Machine)字节码、ABI(应用二进制接口,Application Binary Interface)、SourceMapping(源码映射)、AST(抽象语法树,Abstract Syntax Tree)等信息,然后利用Z3(https://github.com/Z3Prover/z3)约束求解器对EVM字节码进行遍历,得到合约的执行路径并生成控制流图,遍历过程中根据路径上的关键指令识别单路径的重入模式,重入模式定义与关键指令见重入模式映射表,并以路径为单位记录主重入路径模式(RCW,RCR)与被重入路径模式(RC,RW,RL,RJ)。每条路径遍历完成后,若路径中包含状态修改节点,则为该路径生成一个语义等价测试用例,即进行步骤31)。
22)组合重入路径检测:首先对21)中的主重入路径模式中具有相同路径条件的路径去重,然后遍历主重入路径,将每条主重入路径与每条被重入路径两两组合,利用Z3约束求解器和污渍跟踪技术判断组合后路径连通性与重入漏洞读写模式是否满足(使用污渍分析技术判断指令间的依赖关系,使用Z3约束求解器对执行路径中的约束条件进行子问题划分,并约束求解判断连通性),判断方法见算法1,若满足则认为具有重入漏洞,并根据路径上约束条件中函数签名信息,记录主重入路径和被重入路径对应的函数对<主重入函数,被重入函数>以及主重入路径的ID与重入漏洞有关的指令编号等信息(比如外部调用指令CALL,状态修改指令SSTORE、日志记录指令LOG)。检测结果为具有重入漏洞时,进行重入漏洞修复测试用例计算,即进行步骤32)。
3)检测修复系统对源代码生成语义等价测试用例与漏洞修复测试用例。
31)语义等价测试用例:接收单重入路径检测时产生的语义等价测试用例计算请求,在子进程中,使用Z3约束求解器,根据计算请求中的条件约束计算求解测试用例所需变量值,形成待测函数对应的状态初始化数值列表、待测函数调用输入参数列表和待测函数运行后需要比较的状态列表。
32)漏洞修复测试用例:使用Z3约束求解器,根据检测结果中主重入路径与被重入路径的条件约束计算求解测试用例所需变量值。
33)修复完成后,即经过步骤4)后,根据31)、32)所得的测试用例变量值列表,基于测试用例模板生成可以在Truffle中运行的测试用例Solidity代码。模板中针对每一个测试用例包含4部分内容:修改前和修改后合约的创建;修改前后合约状态初始化;修改前后合约待测函数调用;比较待测函数运行后,修改前后合约中状态是否一致。在不修改语义的前提下,微调修改前的合约和修改后的合约,使其满足测试输入的需要。修改前和修改后的合约均需微调内容包括:对于缺少fallback函数的合约添加fallback函数;添加状态初始化函数;仅修改后的合约中需要微调的内容包括:针对和修改前合约同名但内容有修改的合约,修改合约名,在末尾添加“_patch”,针对和修改前合约同名但内容没有修改的合约,删去;添加修改前合约的引用(import语句)。
4)检测修复系统对包含重入漏洞的源代码进行修复。本文中包含两种修复模板:基于锁的修复模板和基于重排序的修复模板。应用基于锁的修复模板进行修复时不使用基于重排序的修复模板,应用基于重排序的修复模板进行修复时,若无法进行语义等价的修复,则改用基于锁的修复模板进行修复。虽然锁策略修复率更高,但修复结果会大幅提升合约运行时的gas消耗,提升合约运行成本,所以本发明采用两种策略进行修复。
41)基于锁的修复模板:依据22)中生成的重入函数对,对重入函数对<主重入函数,被重入函数>中的函数添加函数修饰器,添加原则如下:根据函数名找到函数的AST节点,对主重入函数添加“获取锁-释放锁”的函数修饰器;对被重入函数添加“检查锁占用”的函数修饰器。函数修饰器中传入函数对编号作为锁编号,每一个主重入函数赋予唯一锁id,当一个函数既要添加“获取锁-释放锁”又要添加“检查锁占用”两个函数修饰器时,锁检查占用作为外层函数修饰器。生成锁添加信息列表,其中包含函数名,函数需要添加的函数修饰器类型与锁id。
42)基于重排序的修复模板:利用22)中生成的主重入路径的ID与关键指令编号等信息,根据指令编号和21)中的sourceMapping找到检测结果中,关键指令对应语句的源码范围,再结合21)中的AST信息找到对应语句的AST节点,记录需要被移动的语句的原始AST编号与移动目的地的AST编号,记录需要被替换的语句的AST编号与替换内容,记录需要增加的语句对应位置的AST编号与增加内容。生成重排序信息列表。被移动的语句为RCW模式中写操作(SSTORE指令)对应的源码语句,移动目的地确定方法如下:找到RCW模式中外部调用(CALL指令)对应语句的AST节点c与RCW模式中写操作(SSTORE指令)对应语句的AST节点w,利用源码的AST结构找到距离节点c和节点w的最近公共AST父节点,移动目的地为紧邻最近公共父节点前的位置。被替换的语句为RCR模式中第二个读操作(SLOAD指令)对应的源码语句,具体地是storage变量值的读取语句。增加的语句为一个局部变量声明与初始化,局部变量名包含被替换的storage变量名,初始化值为被替换的storage变量值,增加语句的位置确定方法如下:找到RCR模式中外部调用(CALL指令)对应语句的AST节点c与RCR模式中读操作(SLOAD指令)对应语句的AST节点r,利用源码的AST结构找到距离节点c和节点r的最近公共AST父节点,增加位置为紧邻最近公共父节点前的位置。被替换语句的内容为增加的局部变量值的读取语句。
43)根据41)生成的锁添加信息列表和42)生成的重排序信息列表,调用prettier-plugin-solidity开源工具,修改源代码,生成修复后的智能合约。
5)检测修复系统对修复后的合约进行测试用例验证。
本发明的有益效果:
基于上述静态检测与修复模板的检测修复方案,本发明实现了检测、修复、测试用例生成、修复结果验证的子模块。
本发明针对导致重入漏洞的必要条件,总结出了基于锁和基于重排序两种修复模板。验证阶段,本文从网络中搜集了包含重入漏洞的真实合约和示例合约文件共计8个,对本文提出的重入漏洞检测与修复工具进行测试。结果显示,系统对重入漏洞的检测率为100%,其中4个真实合约文件中均包含RRW-Self漏洞,有两个真实合约中包含RRW-Cross类型漏洞,有一个真实合约中包含RWR-Cross类型漏洞;针对本文中的测试集,系统对重入漏洞的修复率为100%,在不改变原始语义的前提下,锁模板成功修复了全部漏洞,重排序模板仅有一个漏洞未能成功修复,针对此未能修复的漏洞使用锁模板成功修复,可见修复模板的有效性,保障了智能合约针对重入漏洞的安全性。
附图说明
图1为单路径重入模式检测的流程图;
图2为组合路径重入模式检测的流程图;
(a)组合路径约束求解流程,(b)组合路径重入检测总流程;
图3为基于锁策略的重入漏洞修复流程图;
图4为基于重排序策略的重入漏洞修复流程图;
图5为测试用例代码生成流程图;
图6为修复结果验证流程图;
图7为组合重入路径子问题划分求解示意图。
具体实施方式
本发明实现了检测、修复、测试用例生成、修复结果验证的子模块。重入漏洞检测模块分为两部分,单路径重入检测和组合重入路径检测。重入漏洞修复模块包括基于锁的修复和基于重排序的修复。实验中使用Solidity版本为0.5.13,Z3版本为4.8.9。
单路径重入模式检测
单路径重入模式检测流程图如图1所示。为了分析跨函数重入漏洞,本文首先需要分析每条重入路径上的重入模式,在根据EVM字节码构建好CFG基础块与边之后,开始逐路径遍历,并符号化执行路径上的每个指令。本文使用了污渍跟踪的技术,以便分析指令数据间的依赖关系,在每个指令执行前进行污渍提取,执行后进行污渍传播,特殊的,SLOAD指令是产生污渍的源头。针对与重入相关的关键指令,增加模式判断流程,如针对合约变量修改指令SSTORE、外部调用指令(CALL,DELEGATECALL,STATICCALL),日志记录指令(LOG0~LOG4),判断这些指令是否构成被重入路径的一部分,并记录这些指令依赖的SLOAD读取指令形成RC、RW、RL和RJ集合,判断这些指令是否构成主重入路径RCR模式的一部分。针对SSTORE指令还需判断是否构成主重入路径RCW模式的一部分。每条路径遍历完成后,若路径中包含状态修改节点,则进行语义等价测试用例计算。
组合重入路径检测
组合重入路径检测流程如图2所示。这一步本文将主重入路径中的重入模式与被重入路径中的重入模式两两组合,完成跨函数重入漏洞的判断。对于每条主重入路径,分别判断是否满足RCW模式与RCR模式,两种模式分别组合被重入路径中的模式,组合模式中的条件约束进行求解。条件约束求解分为三部分,第一部分是主重入路径外部调用前的条件约束与测试初始约束的求解,第二部分是被重入路径上的条件约束与第一部分求解结果约束的求解,第三部分是storage变量地址相等约束、RJ条件约束和第二部分求解结果约束的求解。当三部分解集均不为空时,本文认为构成重入漏洞,需要被修复。本文使用Z3约束求解器进行求解,为了提高求解成功率,本文使用自定义配置策略求解,包括simplify,solve-eqs,bit-blast,aig,sat。
基于锁策略的重入漏洞修复
基于锁策略的重入漏洞修复流程如图3所示。添加锁不会影响函数内已有数据值的读写,但是会影响函数的可执行性,即在主重入函数与被重入函数本身具有嵌套调用关系的时候。所以针对锁策略的语义等价检查内容即检查准备添加锁的函数间是否存在嵌套调用关系,若存在,则无法完成语义等价修复,若不存在,则进行修复步骤:对主重入函数添加“获取锁-释放锁”的函数修饰器,对与此主重入函数配对的被重入函数添加“检查锁占用”的函数修饰器,且使用相同的锁编号,锁信息记录在以函数签名为键,函数修饰器类型和锁ID为值的键值对中。在生成修复源码时,首先读取函数修饰器模板,使用锁ID替换修饰器模板中的参数,然后根据函数签名查找对应函数的AST节点,并在AST节点modifiers属性下添加已修改锁ID的函数修饰器。在全部函数AST修改添加完成后,利用prettier-plugin-solidity生成修复代码。
基于重排序策略的重入漏洞修复
基于重排序策略的重入漏洞修复流程图如图4所示。分为RCW修复信息生成和RCR修复信息生成两步。针对RCW类型重入漏洞,在检测时会生成语句重排序列表。根据产生重入漏洞的SSTORE指令和外部调用指令编号,通过source mapping中指令与源码的映射关系,AST中源码与AST节点的映射关系,找到指令对应语句(statement类型)的AST节点,并记录AST节点在抽象语法树中路径上的父节点信息,写语句AST是移动的起始位置,外部调用语句是移动的终点位置。
语句移动时的语义等价检测需要检查移动后合约CFG中受影响子图中是否包含读写节点,受影响子图的源点为外部调用AST中第一条指令对应节点,终点为写语句AST中最后一条指令对应节点。当受影响子图中既不包含读节点也不包含写节点时,语义不会改变,不需要进行语义等价维护。当受影响的子图中包含写节点时,会导致语义改变,本文在这种情况下转而使用锁策略修复。当受影响的子图中仅包含读节点时,会导致语义改变,本文将这些读节点对应的storage变量替换为局部变量,局部变量的初始化添加在紧邻移动后的写语句之前,并记录被替换变量的AST位置与替换的内容,记录新增局部变量初始化的位置与初始值。
针对RCR类型重入漏洞,在检测时会生成语句替换列表。将RCR中第二个读节点对应的storage变量替换为局部变量。局部变量初始化语句添加在紧邻外部调用语句之前。语义等价检测时,受影响子图的源点为外部调用AST中第一条指令对应节点,子图的终点为被替换读语句AST中最后一条指令对应节点,若子图中包含写节点则会导致语义改变,本文在这种情况下转而使用锁策略修复。
在生成修复源码时,读取重排序语句列表和替换语句列表并修改AST:针对移动语句操作,拷贝移动语句AST内容,并添加至移动后位置;针对代替语句操作,先根据模板创建局部变量初始化语句AST,然后用局部变量AST替换原始的storage变量AST,再将局部变量初始化AST添加至函数AST中。在全部函数AST修改添加完成后,利用prettier-plugin-solidity生成修复代码。
测试用例代码生成
测试用例代码生成流程如图5所示。模块首先接收检测过程中的测试用例生成请求,并利用Z3约束求解器计算出测试用例参数,形成JSON格式文件。然后读取测试用例Solidity模板,填入JSON文件中的测试数据,实现创建待测合约、运行待测函数、比对运行结果的逻辑。对于待测合约,由于需要在比对阶段读取其中变量值,所以需要为待测合约添加变量值读取函数;由于合约运行时需要消耗gas,所以在创建待测合约时要传入少量以太币,对于没有回调函数的待测合约也要添加回调函数。
修复结果验证
修复结果验证流程如图6所示。本文使用Truffle框架和Ganache测试网络完成测试。首先将原始合约和修复后的合约放入contract目录下,测试用例代码放入test目录下,然后将合约部署上链,接着运行测试用例代码,最后查看Ganache运行输出信息,若无错误信息说明测试用例通过。
重入模式映射表
Figure BDA0003084773600000071
Figure BDA0003084773600000081
算法1(组合重入路径的读写模式与连通性判断算法)
本发明中对重入路径的读写模式定义如下:
1)在RCW重入模式中:主重入模式为RCW,被重入模式为RC/RW/RL/RJ中的任意一种,主重入模式中的读操作R和写操作W与被重入模式中的读操作R对应相同的storage变量。
2)在RCR重入模式中:主重入模式为RCR,被重入模式为RC/RW/RL/RJ中的任意一种,主重入模式中的两次读操作R与被重入模式中的读操作R对应相同的storage变量。
组合重入路径的读写模式与连通性判断算法如下:
将组合路径分为3段求解:第一部分为主重入路径的起点至外部调用之前,求解参数为路径上的条件约束、路径执行前的初始状态(空集),和路径中写操作记录;第二部分为被重入路径,求解参数为路径上的条件约束、路径执行前的初始状态(主重入路径外部调用执行前的状态),和路径中写操作记录;第三部分为主重入路径外部调用之后至终点,求解参数为主重入路径和被重入路径中读写变量一致的条件约束和RJ的条件约束,路径执行前的初始状态(被重入路径执行后的状态),写操作记录(空集)。三段中任意一段求解失败认为没有重入漏洞,三段路径均求解成功认为包含重入漏洞。
每段路径的求解思路是将路径上的条件约束根据路径上的写操作进行了划分,任意一子问题无解则返回空集。首先对所有写操作根据storage变量名进行划分,每一个storage变量下可能包含1个或多个写操作。然后根据每一个storage变量依次对条件约束进行子问题划分,划分过程如图7所示。图中示例包含1个初始状态(c的值为3)、3个条件约束和两个写操作(对变量a赋值为1,对变量b赋值为2),条件约束中对变量a和变量b的值依赖于两个写操作。首先根据变量a将条件约束划分为依赖a的条件约束和不依赖a的条件约束,再根据变量b划分,得到4个子问题并使用Z3约束求解器求解,本例中4个子问题均有解,所以此路径求解成功。
以上实施例仅用以说明本发明的技术方案而非对其进行限制,本领域的普通技术人员可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明的精神和范围,本发明的保护范围应以权利要求书所述为准。

Claims (10)

1.一种重入漏洞的检测方法,其步骤包括:检测修复系统对待处理的智能合约源代码首先进行单重入路径检测,然后进行组合重入路径检测;其中单重入路径检测方法为:首先将该智能合约源代码进行编译并生成以太坊虚拟机字节码、应用二进制接口、源码映射、抽象语法树AST,然后利用Z3约束求解器对以太坊虚拟机字节码进行遍历,得到该智能合约源代码的执行路径并生成控制流图,遍历过程中根据重入模式映射表识别路径的重入模式,并以路径为单位记录主重入路径模式与被重入路径模式,所述重入模式映射表中记录每一主重入模式、被重入模式对应的关键指令;每条路径遍历完成后,若路径中包含状态修改节点,则为该路径生成一个语义等价测试用例;其中组合重入路径检测方法为:首先对主重入路径模式中具有相同路径条件的路径进行去重,然后遍历主重入路径,将每条主重入路径与每条被重入路径两两组合,利用Z3约束求解器和污渍跟踪技术判断每一组合后路径是否满足连通性与重入漏洞读写模式,若满足则认为该智能合约源代码存在重入漏洞。
2.如权利要求1所述的方法,其特征在于,认为该智能合约源代码存在重入漏洞时,根据路径上约束条件中函数签名信息,记录该组合路径中主重入路径、被重入路径对应的函数对<主重入函数,被重入函数>以及主重入路径的ID、与重入漏洞有关的指令编号。
3.一种重入漏洞的检测与修复方法,其步骤包括:
1)将待处理的智能合约源代码输入检测修复系统;
2)检测修复系统对待检测的智能合约源代码首先进行单重入路径检测,然后进行组合重入路径检测;其中单重入路径检测方法为:首先将该智能合约源代码进行编译并生成以太坊虚拟机字节码、应用二进制接口、源码映射、抽象语法树AST,然后利用Z3约束求解器对以太坊虚拟机字节码进行遍历,得到该智能合约源代码的执行路径并生成控制流图,遍历过程中根据重入模式映射表识别路径的重入模式,并以路径为单位记录主重入路径模式与被重入路径模式,所述重入模式映射表中记录每一主重入模式、被重入模式对应的关键指令;每条路径遍历完成后,若路径中包含状态修改节点,则为该路径生成一个语义等价测试用例;其中组合重入路径检测方法为:首先对主重入路径模式中具有相同路径条件的路径进行去重,然后遍历主重入路径,将每条主重入路径与每条被重入路径两两组合,利用Z3约束求解器和污渍跟踪技术判断每一组合后路径是否满足连通性与重入漏洞读写模式,若满足则认为具有重入漏洞,并根据路径上约束条件中函数签名信息,记录该组合路径中主重入路径、被重入路径对应的函数对<主重入函数,被重入函数>以及主重入路径的ID、与重入漏洞有关的指令编号,并为该组合路径生成一重入漏洞修复测试用例;
3)根据检测结果,如果该智能合约源代码包含重入漏洞,则检测修复系统对该智能合约源代码进行修复,得到修复后的智能合约;
4)检测修复系统利用语义等价测试用例、重入漏洞修复测试用例对修复后的智能合约进行验证。
4.如权利要求3所述的方法,其特征在于,检测修复系统对该智能合约源代码进行修复,包括基于锁的修复模板和基于重排序的修复模板;其中基于锁的修复模板依据重入函数对<主重入函数,被重入函数>,对需要修复的函数添加函数修饰器,添加原则为:根据函数名从抽象语法树AST中找到函数的AST节点,对主重入函数添加“获取锁-释放锁”的函数修饰器;对被重入函数添加“检查锁占用”的函数修饰器;函数修饰器中传入函数对编号作为锁编号,每一个主重入函数赋予唯一锁id,当一个函数既要添加“获取锁-释放锁”又要添加“检查锁占用”两个函数修饰器时,锁检查占用作为外层函数修饰器;然后生成锁添加信息列表,其中包含函数名、函数需要添加的函数修饰器类型与锁id;基于重排序的修复模板根据与重入漏洞有关的指令编号和源码映射找到对应语句的源码范围,再结合抽象语法树AST找到对应语句的AST节点,记录需要被移动的语句的原始AST编号与移动目的地的AST编号,记录需要被替换的语句的AST编号与替换内容,记录需要增加的语句对应位置的AST编号与增加内容,生成重排序信息列表;然后根据生成的所述锁添加信息列表和所述重排序信息列表,修改该智能合约的源代码,生成修复后的智能合约。
5.如权利要求3所述的方法,其特征在于,语义等价测试用例生成方法为:使用Z3约束求解器,根据路径中的条件约束计算求解语义等价测试用例所需变量值,然后基于该语义等价测试用例所需变量值生成语义等价测试用例,并形成待测函数对应的状态初始化数值列表、待测函数调用输入参数列表和待测函数运行后需要比较的状态列表。
6.如权利要求3所述的方法,其特征在于,重入漏洞修复测试用例生成方法:使用Z3约束求解器,根据检测结果中主重入路径与被重入路径的条件约束计算求解重入漏洞修复测试用例所需变量值,然后基于重入漏洞修复测试用例所需变量值生成重入漏洞修复测试用例。
7.一种重入漏洞的检测与修复系统,其特征在于,包括单路径重入模式检测模块、组合重入路径检测模块、重入漏洞修复模块、测试用例代码生成模块和修复结果验证模块;其中
单路径重入模式检测模块,用于对待处理的智能合约源代码进行编译并生成以太坊虚拟机字节码、应用二进制接口、源码映射、抽象语法树AST,然后利用Z3约束求解器对以太坊虚拟机字节码进行遍历,得到该智能合约源代码的执行路径并生成控制流图,遍历过程中根据重入模式映射表识别路径的重入模式,并以路径为单位记录主重入路径模式与被重入路径模式,所述重入模式映射表中记录每一主重入模式、被重入模式对应的关键指令;每条路径遍历完成后,若路径中包含状态修改节点,则为该路径生成一个语义等价测试用例;
组合重入路径检测模块,用于对主重入路径模式中具有相同路径条件的路径进行去重,然后遍历主重入路径,将每条主重入路径与每条被重入路径两两组合,利用Z3约束求解器和污渍跟踪技术判断每一组合后路径是否满足连通性与重入漏洞读写模式,若满足则认为该智能合约源代码存在重入漏洞;
测试用例代码生成模块,用于对包含状态修改节点的路径生成一个语义等价测试用例,以及为具有重入漏洞的组合路径生成一重入漏洞修复测试用例;
重入漏洞修复模块,用于对包含重入漏洞的智能合约源代码进行修复,得到修复后的智能合约;
修复结果验证模块,用于利用语义等价测试用例、重入漏洞修复测试用例对修复后的智能合约进行验证。
8.如权利要求7所述的系统,其特征在于,重入漏洞修复模块包括基于锁的修复模板和基于重排序的修复模板;其中基于锁的修复模板用于依据重入函数对<主重入函数,被重入函数>,对需要修复的函数添加函数修饰器,添加原则为:根据函数名从抽象语法树AST中找到函数的AST节点,对主重入函数添加“获取锁-释放锁”的函数修饰器;对被重入函数添加“检查锁占用”的函数修饰器;函数修饰器中传入函数对编号作为锁编号,每一个主重入函数赋予唯一锁id,当一个函数既要添加“获取锁-释放锁”又要添加“检查锁占用”两个函数修饰器时,锁检查占用作为外层函数修饰器;然后生成锁添加信息列表,其中包含函数名、函数需要添加的函数修饰器类型与锁id;基于重排序的修复模板用于根据与重入漏洞有关的指令编号和源码映射找到对应语句的源码范围,再结合抽象语法树AST找到对应语句的AST节点,记录需要被移动的语句的原始AST编号与移动目的地的AST编号,记录需要被替换的语句的AST编号与替换内容,记录需要增加的语句对应位置的AST编号与增加内容,生成重排序信息列表;然后根据生成的所述锁添加信息列表和所述重排序信息列表,修改该智能合约的源代码,生成修复后的智能合约。
9.如权利要求7或8所述的系统,其特征在于,所述测试用例代码生成模块生成语义等价测试用例的方法为:使用Z3约束求解器,根据路径中的条件约束计算求解语义等价测试用例所需变量值,然后基于该语义等价测试用例所需变量值生成语义等价测试用例,并形成待测函数对应的状态初始化数值列表、待测函数调用输入参数列表和待测函数运行后需要比较的状态列表。
10.如权利要求7或8所述的系统,其特征在于,所述测试用例代码生成模块生成重入漏洞修复测试用例的方法为:使用Z3约束求解器,根据检测结果中主重入路径与被重入路径的条件约束计算求解重入漏洞修复测试用例所需变量值,然后基于重入漏洞修复测试用例所需变量值生成重入漏洞修复测试用例。
CN202110577018.8A 2021-05-26 2021-05-26 一种重入漏洞的检测与修复方法、系统 Pending CN115408689A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202110577018.8A CN115408689A (zh) 2021-05-26 2021-05-26 一种重入漏洞的检测与修复方法、系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110577018.8A CN115408689A (zh) 2021-05-26 2021-05-26 一种重入漏洞的检测与修复方法、系统

Publications (1)

Publication Number Publication Date
CN115408689A true CN115408689A (zh) 2022-11-29

Family

ID=84155961

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202110577018.8A Pending CN115408689A (zh) 2021-05-26 2021-05-26 一种重入漏洞的检测与修复方法、系统

Country Status (1)

Country Link
CN (1) CN115408689A (zh)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116361810A (zh) * 2023-03-29 2023-06-30 中国石油大学(华东) 一种基于符号执行的智能合约漏洞检测方法
CN116541854A (zh) * 2023-07-06 2023-08-04 北京华云安信息技术有限公司 漏洞测试方法、装置、电子设备和存储介质
CN117614681A (zh) * 2023-11-24 2024-02-27 烟台大学 智能合约的重入漏洞检测方法、系统、设备和存储介质

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116361810A (zh) * 2023-03-29 2023-06-30 中国石油大学(华东) 一种基于符号执行的智能合约漏洞检测方法
CN116541854A (zh) * 2023-07-06 2023-08-04 北京华云安信息技术有限公司 漏洞测试方法、装置、电子设备和存储介质
CN117614681A (zh) * 2023-11-24 2024-02-27 烟台大学 智能合约的重入漏洞检测方法、系统、设备和存储介质
CN117614681B (zh) * 2023-11-24 2024-05-24 烟台大学 智能合约的重入漏洞检测方法、系统、设备和存储介质

Similar Documents

Publication Publication Date Title
JP7250178B2 (ja) ブロックチェーンネットワークにおけるスマートコントラクトをサポートするための方法及びコントラクト書き換えフレームワークシステム
US11868745B2 (en) System and method for compiling high-level language code into a script executable on a blockchain platform
CN109426722B (zh) Sql注入缺陷检测方法、系统、设备及存储介质
CN115408689A (zh) 一种重入漏洞的检测与修复方法、系统
Grishchenko et al. Ethertrust: Sound static analysis of ethereum bytecode
Chen et al. Maintaining smart contracts on ethereum: Issues, techniques, and future challenges
Chen et al. Maintenance-related concerns for post-deployed Ethereum smart contract development: issues, techniques, and future challenges
US20240020109A1 (en) Method and system for supporting smart contracts in a blockchain network
CN108614702B (zh) 字节码优化方法及装置
CN114996126B (zh) 一种针对eosio智能合约的漏洞检测方法及系统
Jiao et al. A Generalized Formal Semantic Framework for Smart Contracts.
Shishkin Debugging smart contract’s business logic using symbolic model checking
CN110795091B (zh) 一种模块化路由解耦方法、存储介质、电子设备及系统
CN114047928B (zh) 一种适用于组合交易的智能合约形式化验证方法及系统
Klomp et al. On symbolic verification of Bitcoin’s script language
Li et al. Detecting standard violation errors in smart contracts
Ali et al. SESCon: Secure Ethereum smart contracts by vulnerable patterns’ detection
US20230418951A1 (en) Apparatus and method for analyzing vulnerabilities of smart contract code
Yang et al. Definition and Detection of Defects in NFT Smart Contracts
Zhu et al. Formal verification of solidity contracts in event-b
CN116841906A (zh) 智能合约的检测方法、装置及电子设备
CN114282227B (zh) 一种Fabric区块链系统智能合约的安全分析检测方法
Liu et al. Automated Invariant Generation for Solidity Smart Contracts
Xi et al. When they go low: Automated replacement of low-level functions in Ethereum smart contracts
CN115470498A (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