CN109801166B - 一种基于状态锁的智能合约的安全函数的设计方法及系统 - Google Patents
一种基于状态锁的智能合约的安全函数的设计方法及系统 Download PDFInfo
- Publication number
- CN109801166B CN109801166B CN201910077219.4A CN201910077219A CN109801166B CN 109801166 B CN109801166 B CN 109801166B CN 201910077219 A CN201910077219 A CN 201910077219A CN 109801166 B CN109801166 B CN 109801166B
- Authority
- CN
- China
- Prior art keywords
- function
- lock
- state
- call
- evm
- 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
Images
Abstract
本发明属于区块链安全技术领域,公开了一种基于状态锁的智能合约的安全函数的设计方法及系统,当EVM执行到call函数时,以太坊其余执行路径将被封锁;当call整体执行完毕后,其余路径被打开;当以太坊其余执行路径被封锁时,withdraw被再次请求,EVM将直接拒绝;EVM回到初始状态,完成攻击防御。本发明利用状态锁控制call函数有效解决重入漏洞;在本发明中,攻击过后账户b余额中,攻击者仅仅取出了自己在DAO中存储的5个以太币,并没有成功夺取DAO中剩余的50个以太币,因此,可以看出本发明的库函数成功阻止了重入攻击。
Description
技术领域
本发明属于区块链安全技术领域,尤其涉及一种基于状态锁的智能合约的安全函数的设计方法。
背景技术
目前,业内常用的现有技术是这样的:
重入漏洞:每一个以太坊智能合约都有且仅有一个没有名字的函数,该函数称为fallback函数,当合约接收到以太币时,这个函数会被执行,用于向以太坊表明收到了以太币,攻击者利用这一机制,在fallback函数中,写入攻击的代码,当被攻击合约向恶意合约传送以太币时,以太坊虚拟机EVM就会直接执行攻击者合约的fallback函数,来获取以太币。
具体来说攻击者调用withdraw函数取回合约中的以太币,在call将以太币发送给接收方,此时接收方的fallback被EVM调用,fallback里则再次调用Dao的withdraw,但是Dao的余额更新代码一直未被执行(该行代码用于减去调用方在该函数中的余额),也就是说这里就形成了一个循环,withdraw将一直被重复调用,直到Dao的以太币被盗取完为止。
综上所述,现有技术存在的问题是:
现有技术中,不能有效解决重入漏洞问题。
技术人员运用transfer等指令代替call从而避免fallback函数被重复调用,然而从EVM上来说,transfer函数需要消耗更多gas,且不如call函数灵活,所以call函数并不能被完全代替。
如果不考虑使用transfer,技术人员只能通过自身经验,在状态量改变后调用call函数,仍然很难预防重入攻击。
解决上述技术问题的难度和意义:
该技术问题难度:主要在于锁的创建必须在本地建立的library中用结构体存放锁。
本发明的意义:在于在开发过程中,call函数又能重新被运用,发挥本来的作用,不用担心遭遇重入攻击。
发明内容
针对现有技术存在的问题,本发明提供了一种基于状态锁的智能合约的安全函数的设计方法,
本发明是这样实现的,一种基于状态锁的智能合约的安全函数的设计方法包括:
步骤一:当EVM执行到call函数时,以太坊其余执行路径将被封锁;
步骤二:当call整体执行完毕后,其余路径被打开;
步骤三:当以太坊其余执行路径被封锁时,withdraw被再次请求,EVM将直接拒绝;EVM回到初始状态,完成攻击防御。
进一步,在EVM进入call函数之前,把锁n关闭,当攻击者再次调用withdraw进入_call()时,锁n还处于真状态,断言无法通过,直接退回到原状态,交易失败;当_call完整运行完毕,锁n被打开。
进一步,基于状态锁的智能合约的安全函数的设计方法进一步包括:
步骤一:编写安全库函数如图2所示;
步骤二:编译图2所示的安全函数库;
步骤三:其他智能合约函数通过调用安全函数库实现call功能。
本发明的另一目的在于提供一种实施所述基于状态锁的智能合约的安全函数的设计方法的基于状态锁的智能合约的安全函数的控制系统。
本发明的另一目的在于提供一种搭载所述基于状态锁的智能合约的安全函数的控制系统的基于状态锁的智能合约的安全函数的安全网络平台。
本发明的另一目的在于提供一种实现所述基于状态锁的智能合约的安全函数的设计方法的计算机程序。
本发明的另一目的在于提供一种终端, 所述终端实现所述基于状态锁的智能合约的安全函数的设计方法的控制器。
本发明的另一目的在于提供一种计算机可读存储介质,包括指令,当其在计算机上运行时,使得计算机执行所述的基于状态锁的智能合约的安全函数的设计方法。
进一步,本发明的所述基于状态锁的智能合约的安全函数包括:
在EVM进入call函数之前,把锁n关闭,当攻击者再次调用withdraw进入_call()时,第49行的锁n还处于真状态,所以49行断言无法通过,直接退回到原状态,交易失败,预防了攻击,只有当一个_call完整运行完毕,n才会被第52行的代码打开,避免进入重复取币的困境。
综上所述,本发明的优点及积极效果为:
在现有的技术中,技术人员利用transfer代替call来避免被重入攻击,本发明从EVM字节码的角度审视transfer函数相对于call函数的弊端:
Call函数的字节码:
JUMPDEST
DUP2
PUSH FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
AND
DUP2
PUSH 40
MLOAD
PUSH 0
PUSH 40
MLOAD
DUP1
DUP4
SUB
DUP2
DUP6
DUP8
GAS
CALL
SWAP3
POP
POP
POP
POP
POP
POP
JUMP [out]
transfer函数的字节码
JUMPDEST
DUP2
PUSH FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
AND
PUSH 8FC
DUP3
SWAP1
DUP2
ISZERO
MUL
SWAP1
PUSH 40
MLOAD
PUSH 0
PUSH 40
MLOAD
DUP1
DUP4
SUB
DUP2
DUP6
DUP9
DUP9
CALL
SWAP4
POP
POP
POP
POP
ISZERO
ISZERO
PUSH [tag] 21
JUMPI
PUSH 0
DUP1
REVERT
tag 21
JUMPDEST
POP
POP
JUMP [out]
.data0
从消耗gas的角度上来讲,transfer函数比call函数消耗更多的gas,所运用的指令更多。其次call仅仅是从头执行到尾,而transfer却有可能执行tag21这一代码块,若这一代码块被执行将消耗更多gas。
从字节码可以看出这两个函数是很大不同的函数,实际执行也很不相同,所以用transfer来代替call并不完全合适。
本发明利用状态锁控制call函数有效解决重入漏洞。
在本发明中,攻击过后账户b余额中,攻击者仅仅取出了自己在DAO中存储的5个以太币,并没有成功夺取DAO中剩余的50个以太币,因此,可以看出本发明的库函数成功阻止了重入攻击;
在调用_Call()函数时,需要创建锁及调用开关锁函数,提高了安全性;性价比较高。
如果不用该项技术,直接使用call函数,则极容易被盗取以太币,其效果如图7、图8所示。成功盗取了50个以太币。
附图说明
图1是本发明实施例提供的基于状态锁的智能合约的安全函数流程图。
图2是本发明实施例提供的状态锁代码图。
图3是本发明实施例提供的被状态锁控制的call函数代码图。
图4是本发明实施例提供的改进的DAO合约。
图5是本发明实施例提供的DAO合约与Attack合约的部署情况。
图6是本发明实施例提供的被状态锁控制的账户b进行重入攻击后的余额状况图。
图7是未运用本发明DAO合约与Attack合约的部署情况。
图8是未运用本发明实施例账户b进行重入攻击后的余额状况图。
实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
现有技术中,不能有效解决重入漏洞问题。
为解决上述问题,下面结合具体方案对本发明的应用原理作详细描述。
如图1所示,本发明实施例提供的基于状态锁的智能合约的安全函数的设计方法包括:
S101:当EVM执行到call函数时,以太坊其余执行路径将被封锁。
S102:当call整体执行完毕后,其余路径被打开。
S103:当以太坊其余执行路径被封锁时,withdraw被再次请求,EVM将直接拒绝;EVM回到初始状态,完成攻击防御。
在本发明实施例中,基于状态锁的智能合约的安全函数的设计方法进一步包括:
步骤一:编写安全库函数如图2所示。
步骤二:编译图2所示的安全函数库。
步骤三:其他智能合约函数通过调用安全函数库实现call功能。
如图2-图3所示,本发明实施例提供的基于状态锁的安全函数包括:
在EVM进入call函数之前,把锁n关闭,当攻击者再次调用withdraw进入_call()时,第49行的锁n还处于真状态,所以49行断言无法通过,直接退回到原状态,交易失败,预防了攻击,只有当一个_call完整运行完毕,n才会被第52行的代码打开,避免进入重复取币的困境。
下面结合具体测试对本发明的应用原理作进一步描述。
如图4至图6所示,本发明在Remix的IDE中进行测试,该测试环境模拟了以太坊多节点的分布式特征,在网页中完整集成了EVM环境:
(1)实验设置:
账户a:0xca35b7d915458ef540ade6068dfe2f44e8fa733c创建DAO合约,并在DAO合约中存储50个以太币;
账户b:0x14723a09acff6d2a60dcdf7aa4aff308fddc160c创建第三节的Attack合约;
Attack合约在0xbbf289d846208c16edc8474705c748aff07732db(账户a创建的DAO合约地址)存储了5个以太币,并以此向DAO合约进行重入攻击;
(2)实验结果:
攻击过后账户b余额中,攻击者仅仅取出了自己在DAO中存储的5个以太币,并没有成功夺取DAO中剩余的50个以太币,因此,可以看出本发明的库函数成功阻止了重入攻击;
在调用_Call()函数时,需要创建锁及调用开关锁函数,提高了安全性;性价比较高。
在本发明实施例中,图7是未运用本发明DAO合约与Attack合约的部署情况。图8是未运用本发明实施例账户b进行重入攻击后的余额状况图。
在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用全部或部分地以计算机程序产品的形式实现,所述计算机程序产品包括一个或多个计算机指令。在计算机上加载或执行所述计算机程序指令时,全部或部分地产生按照本发明实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(DSL)或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输)。所述计算机可读取存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,DVD)、或者半导体介质(例如固态硬盘SolidState Disk(SSD))等。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
Claims (5)
1.一种基于状态锁的智能合约的安全库函数的设计方法,其特征在于,所述基于状态锁的智能合约的安全库函数的设计方法包括:
步骤一:当EVM执行到call函数时,以太坊其余执行路径将被封锁;
步骤二:当call整体执行完毕后,其余路径被打开;
步骤三:当以太坊其余执行路径被封锁时,withdraw被再次请求,EVM将直接拒绝;EVM回到初始状态,完成攻击防御;
在EVM进入call函数之前,把锁n关闭,当攻击者再次调用withdraw进入_call()时,锁n还处于真状态,断言无法通过,直接退回到原状态,交易失败;当_call完整运行完毕,锁n被打开;
所述基于状态锁的智能合约的安全库函数的设计方法进一步包括:
第一步,编写安全库函数SafeCall;
第二步,编译安全函数库;
第三步,其他智能合约函数通过调用安全函数库SafeCall里面的函数function_Call()实现call功能。
2.一种实施权利要求1所述基于状态锁的智能合约的安全库函数的设计方法的基于状态锁的智能合约的安全库函数的控制系统。
3.一种搭载权利要求2所述基于状态锁的智能合约的安全库函数的控制系统的基于状态锁的智能合约的安全库函数的安全网络平台。
4.一种终端,其特征在于,所述终端实现权利要求1所述基于状态锁的智能合约的安全库函数的设计方法的控制器。
5.一种计算机可读存储介质,包括指令,当其在计算机上运行时,使得计算机执行如权利要求1所述的基于状态锁的智能合约的安全库函数的设计方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910077219.4A CN109801166B (zh) | 2019-01-28 | 2019-01-28 | 一种基于状态锁的智能合约的安全函数的设计方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910077219.4A CN109801166B (zh) | 2019-01-28 | 2019-01-28 | 一种基于状态锁的智能合约的安全函数的设计方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109801166A CN109801166A (zh) | 2019-05-24 |
CN109801166B true CN109801166B (zh) | 2023-04-18 |
Family
ID=66559011
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910077219.4A Active CN109801166B (zh) | 2019-01-28 | 2019-01-28 | 一种基于状态锁的智能合约的安全函数的设计方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109801166B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110598420B (zh) * | 2019-09-17 | 2022-03-01 | 北京丁牛科技有限公司 | 一种跨文件智能合约可重入漏洞防御方法及装置 |
CN110597731B (zh) * | 2019-09-20 | 2023-04-07 | 北京丁牛科技有限公司 | 一种漏洞检测方法、装置及电子设备 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108256337A (zh) * | 2018-02-26 | 2018-07-06 | 北京阿尔山金融科技有限公司 | 智能合约漏洞检测方法、装置及电子设备 |
JP2019003309A (ja) * | 2017-06-13 | 2019-01-10 | 株式会社野村総合研究所 | 検査装置 |
-
2019
- 2019-01-28 CN CN201910077219.4A patent/CN109801166B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2019003309A (ja) * | 2017-06-13 | 2019-01-10 | 株式会社野村総合研究所 | 検査装置 |
CN108256337A (zh) * | 2018-02-26 | 2018-07-06 | 北京阿尔山金融科技有限公司 | 智能合约漏洞检测方法、装置及电子设备 |
Non-Patent Citations (2)
Title |
---|
陈伟利 ; 郑子彬 ; .区块链数据分析:现状、趋势与挑战.计算机研究与发展.2018,(第09期),全文. * |
高枫 ; .区块链智能合约漏洞 修复困难.计算机与网络.2018,(第12期),全文. * |
Also Published As
Publication number | Publication date |
---|---|
CN109801166A (zh) | 2019-05-24 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
EP3477569B1 (en) | Method and system for securing smart contracts in blockchains | |
Chen et al. | A survey on ethereum systems security: Vulnerabilities, attacks, and defenses | |
JP2023100981A (ja) | ブロックチェーンスクリプトにおける制御フロー | |
US8352925B2 (en) | Mechanism for enabling a set of code intended for a first platform to be executed on a second platform | |
US9871800B2 (en) | System and method for providing application security in a cloud computing environment | |
US11263033B2 (en) | Usage checks for code running within a secure sub-environment of a virtual machine | |
Nelaturu et al. | Verified development and deployment of multiple interacting smart contracts with VeriSolid | |
CN109801166B (zh) | 一种基于状态锁的智能合约的安全函数的设计方法及系统 | |
US9245112B2 (en) | Apparatus and method for managing entitlements to program code | |
CN102955915A (zh) | 一种Java应用安全访问控制方法及其装置 | |
CN112202704A (zh) | 一种区块链智能合约安全防护系统 | |
US8429623B2 (en) | Processing engine for enabling a set of code intended for a first platform to be executed on a second platform | |
Staderini et al. | Classification of ethereum vulnerabilities and their propagations | |
Van Ginkel et al. | A server-side JavaScript security architecture for secure integration of third-party libraries | |
Bouichou et al. | An overview of Ethereum and Solidity vulnerabilities | |
Bräm et al. | Rich specifications for Ethereum smart contract verification | |
CN103309696B (zh) | 一种Java卡扩展库更新方法、装置和Java卡 | |
Ramezanifarkhani et al. | A secrecy-preserving language for distributed and object-oriented systems | |
US9800585B2 (en) | Restricting access by services deployed on an application server | |
CN105184150B (zh) | 一种语句预处理方法、装置以及语句的解释方法、装置 | |
US20100218261A1 (en) | Isolating processes using aspects | |
KR100456512B1 (ko) | 커널 백도어 탐지 시스템, 이를 이용한 커널 백도어 탐지방법 및 커널 데이터 복구 방법 | |
US7784063B2 (en) | Method and apparatus for system caller authentication | |
CN109165509A (zh) | 软件实时可信度量的方法、设备、系统及存储介质 | |
CN111654494B (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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |