收藏 分销(赏)

区块链智能合约漏洞检测与自动化修复综述_童俊成.pdf

上传人:自信****多点 文档编号:453884 上传时间:2023-10-10 格式:PDF 页数:9 大小:1.86MB
下载 相关 举报
区块链智能合约漏洞检测与自动化修复综述_童俊成.pdf_第1页
第1页 / 共9页
区块链智能合约漏洞检测与自动化修复综述_童俊成.pdf_第2页
第2页 / 共9页
区块链智能合约漏洞检测与自动化修复综述_童俊成.pdf_第3页
第3页 / 共9页
亲,该文档总共9页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、2023 03 10计算机应用,Journal of Computer Applications2023,43(3):785-793ISSN 10019081CODEN JYIIDUhttp:/区块链智能合约漏洞检测与自动化修复综述童俊成,赵波*(武汉大学 国家网络安全学院,武汉 430072)(通信作者电子邮箱)摘要:智能合约技术作为区块链2.0的里程碑,受到学术界与企业界的广泛关注。智能合约运行在不具有可信计算环境的底层基础设施上,并且具有区别于传统程序的特性,在自身的安全性上存在许多影响很大的漏洞,针对它进行安全审计的研究也成为区块链安全领域的热门与亟需解决的关键科学问题。针对智能合约的

2、漏洞检测与自动化修复,首先介绍智能合约漏洞的主要漏洞类型与分类;然后,调研回顾近五年智能合约漏洞检测的三类最重要的方法,并介绍每类方法具有代表性和创新性的研究技术;其次,详细介绍智能合约升级方案与具有前沿性的自动化修复技术;最后,分析与展望了面向在线、实时、多平台、自动化与智能化需求的智能合约漏洞检测与自动化修复技术的挑战与未来可展开的工作,并提出技术解决方案的框架。关键词:区块链安全;智能合约;安全审计;漏洞检测;自动化修复中图分类号:TP309 文献标志码:AReview on blockchain smart contract vulnerability detection and au

3、tomatic repairTONG Juncheng,ZHAO Bo*(School of Cyber Science and Engineering,Wuhan University,Wuhan Hubei 430072,China)Abstract:Smart contract technology,as a milestone of blockchain 2.0,has received widespread attention from both academic and industry circles.It runs on an underlying infrastructure

4、 without trusted computing environment and has characteristics that distinguish it from traditional programs,and there are many vulnerabilities with huge influence in its own security,so that the research on security auditing for it has become a popular and urgent key scientific problem in the field

5、 of blockchain security.Aiming at the detection and automatic repair of smart contract vulnerabilities,firstly,main types and classifications of smart contract vulnerabilities were introduced.Secondly,three most important methods of smart contract vulnerability detection in the past five years were

6、reviewed,and representative and innovative research techniques of each method were introduced.Thirdly,smart contract upgrade schemes and cutting-edge automatic repair technologies were introduced in detail.Finally,challenges and future work of smart contract vulnerability detection and automatic rep

7、air technologies for online,real-time,multi-platform,automatic,and intelligent requirements were analyzed and prospected as a framework of technical solutions.Key words:blockchain security;smart contract;security auditing;vulnerability detection;automatic repair0 引言 在信任危机困境中,涉及第三方的交易存在安全风险或成本较高的问题。区

8、块链作为一种分散的分布式账本,帮助人们在不可信的环境中进行安全可靠的交易,得到了迅速发展和广泛应用。区块链在市场上的潜力随着比特币的流行而被重视1-2,但现在的区块链已不再局限于数字货币,而是由于智能合约这一应用于区块链 2.0上的技术而引起了广泛关注3。密码学者 Szabo4首次提出智能合约的概念,将它定义为一套以数字形式指定的承诺,合约参与者可以在上面执行这些承诺的协议。即智能合约是一段可以在计算机上自动执行的代码。由于缺乏可信的执行环境,这一概念在当时并未得到广泛地应用。如今区块链技术为智能合约提供了一个可以达成共识从而整体可信的网络环境,使智能合约真正流行起来。因此可以认为智能合约与区

9、块链平台相互促进,将受到学术界与工业界越来越多的重视。随着智能合约的快速发展,近年来针对它的漏洞的攻击层 出 不 穷。2016 年,去 中 心 化 自 治 组 织(Decentralized Autonomous Organization,DAO)这一部署在以太网上的全球最大众筹项目遭到黑客攻击,导致超过 300 万以太币脱离DAO资源池,直接造成以太坊采取硬分叉策略,损害了以太坊的公平性5。2017年,以太坊多重签名钱包Parity出现安全漏洞,导致超过15万以太币被侵吞。2021年,币安智能链上的自动做市商(Automated Market Maker,AMM)合约在迁移过程中出现漏洞并遭

10、到黑客攻击利用,导致5 000万美元的资金被盗。智能合约与传统程序区别很大。首先,它通过交易方式发布,一旦被部署成功,将分布式地存储到链上的每一个区块内,由矿工节点运行,而在现有的区块链系统中这些矿工文章编号:1001-9081(2023)03-0785-09DOI:10.11772/j.issn.1001-9081.2022020179收稿日期:20220218;修回日期:20220511;录用日期:20220511。基金项目:国家自然科学基金资助项目(U1936122);湖北省重点研发计划项目(2020BAB101,2020BAA003)。作者简介:童俊成(1995),男,湖北武汉人,博士

11、研究生,主要研究方向:区块链安全、可信计算;赵波(1972),男,山东青岛人,教授,博士,CCF会员,主要研究方向:信息系统安全、可信计算、区块链安全、人工智能、大数据安全隐私保护。第 43 卷计算机应用节点无需具有可信的基础计算环境;其次,智能合约常常通过相互调用以实现更加复杂的功能,但如果调用了不受信任的外部合约可能会引发风险和错误,甚至当它所依赖的其他合约内存在恶意代码时,会导致每个外部调用都存在潜在的安全威胁;再者,在区块链上智能合约可以由任意用户发布或协同编制,而在这一过程中用户知识和使用工具参差不齐、选择使用的智能合约源码的安全建议也并不齐全,还有可能存在不受控制的恶意用户操作规程

12、,无法保证智能合约部署上链后没有安全漏洞或缺陷;最后,智能合约还具有一些传统代码没有的机制,如以太坊智能合约的燃料(Gas)机制等。这些都导致区块链智能合约漏洞挖掘具有难度和挑战性。另外,区块链系统具有的两大特性也给智能合约的修复升级带来挑战:1)区块链系统具有的不可篡改性使智能合约一经部署就难以更新升级;2)区块链系统具有的透明性使普通用户获取区块链上运行的智能合约字节码更加容易,这就对智能合约修复工作提出了及时、快速的需求,因为仅挖掘、发现漏洞而不升级合约则攻击者更有可能利用漏洞对区块链平台产生威胁。综上所述,智能合约的漏洞检测与自动化修复技术的研究在区块链安全领域十分必要也非常热门,本文

13、从智能合约漏洞基础知识出发,重点调研了智能合约漏洞挖掘的关键技术方法以及自动化修复与升级方法,并探讨了前沿技术与未来可能的发展方向。1 背景知识 智能合约是一种旨在提供、验证与执行合约的特殊应用程序,整个存储、读取、执行过程由区块链技术保障。首先,智能合约通过交易方式发布,一旦被部署成功,与区块链融为一体,分布存储到链上的每一个区块内,且区块链的不可篡改性使它难以更新升级,而且存储于区块链上的智能合约字节码公开透明,这会导致智能合约不可信。由于智能合约最常见的部署平台是以太坊6,当前最广泛的智能合约漏洞挖掘工作也集中在以太坊,因此本章将重新审视它们的基本概念和执行上下文,对三个关键概念进行描述

14、:账户、交易和以太坊虚拟机(Ethereum Virtual Machine,EVM)。1)账户。以太坊采用类似传统银行系统中的账户管理机制的账户 模 式,有 两 种 账 户 类 型:外 部 账 户(Externally Owned Account,EOA)和合约账户(Contract Account,CA)。它们都由一个 20 Byte 的地址唯一标识,由随机数(Nonce)、账户余额(Balance)、合约代码(Bytecode)、存储(Stored Data)组成。EOA 由 公 钥/私 钥 对 控 制,主 要 用 于 管 理 以 太(ETHereum,ETH),并通过发送交易与合约进行

15、交互。而CA则由智能合约中的代码逻辑控制,主要用于实现各种功能需求,记录已执行的交易、余额修改等合约状态变化,但不能发送交易。CA不能主动与外部账户交互。这两类账户将共同维护以太坊中包含变量状态信息的状态对象实体,并通过区块链的共识机制实现各节点之间的一致性。2)交易。以太坊中的交易指由外部账户发送的消息签名数据,其中包含了发送者签名、接收者地址、账户余额、发送币的数量、最大消耗的Gas限制以及合约每步执行支付给矿工的费用。在以太坊中,CA在智能合约被第一次发布时创建,它的创建过程通过合约创建交易形式完成。交易将广播到区块链上的每个矿机执行,并在达成一致共识后改变存储状态。在交易包含的信息中,

16、Gas机制维持以太坊生态系统正常运行的动力来源,合约中函数的计算都以 Gas进行衡量,无论是转账交易还是合约的创建与执行,都需要消耗Gas。在激励与安全上,Gas机制也发挥着关键作用:对矿工执行和存储交易进行补偿和激励;防范恶意用户发送复杂计算等拒绝服务攻击(Denial of Service,DoS)攻击。3)执行环境。以太坊智能合约由EVM执行。EVM由一个具有自定义指令格式的虚拟机组成,该虚拟机基于栈结构实现。在EVM 中,智能合约调用的每条指令都表示为一个字节操作码,参数在数据堆栈上传递。唯一的例外是Push指令,它将常量推送到堆栈上,这些常量被直接编码到指令字节中。EVM 的存储结构

17、有堆栈、内存和存储。堆栈可以存储局部变量;内存用于存储参数和返回值,被函数调用后释放。堆栈和内存具有易失性,将在完成事务后清除,存储将持久地存储状态变量。2 智能合约漏洞 以太坊智能合约漏洞按照引入原因可分为 Solidity、EVM 和区块链三个层级,其中:Solidity 为智能合约编程语言,因此可以将 DASP 10(Decentralized Application Security Project 10)列举的除了未知类型漏洞外的主要智能合约漏洞按表17进行归类。1)重入漏洞。重入漏洞是最臭名昭著的以太坊漏洞,第一次被发现时直接导致了以太坊的硬分叉。当允许外部合约调用时,在初始执行完

18、成之前对调用合约进行新调用时就会发生重入。对于函数而言,这意味着合约状态可能会在执行过程中由于调用不受信任的合约或使用具有外部地址的低级函数而发生变化。DAO项目遭到重入漏洞的攻击过程如图1所示。攻击者调用DAO合约中的splitDAO(),而SplitDAO()调用 withdrawRewardFor(),这个函数调用由 DAO 创建的子合约中的 payOut();然后,payOut()调用 call.value()向攻击者的智能合约发送 ETH;由于 call.value()将调用被调用合约中的回退函数 fallback(),因此攻击合约可以再次调用表1智能合约漏洞类型与引入层级Tab.1

19、Smart contract vulnerability types and introduction levels层级SolidityEVM区块链结构漏洞类型访问控制漏洞整数溢出漏洞拒绝服务漏洞重入漏洞低级调用中未检查返回值短地址攻击交易顺序依赖漏洞时间戳依赖漏洞错误随机漏洞攻击合约fun()1)35)6)fallback()splitDAO()2)DAO合约withdrawRewardFor()子合约4)call.value()payOut()图1利用重入漏洞攻击DAO合约Fig.1Attacking DAO contract by exploiting reentrancy vulner

20、ability786第 3 期童俊成等:区块链智能合约漏洞检测与自动化修复综述splitDAO(),从而被攻击的DAO合约可被重复执行如图1所示的步骤2)6),直到耗尽Gas,导致超过合理数量的ETH被取走。2)访问控制漏洞。攻击者利用不安全的可见性设置访问合约私有值或逻辑。当合约使用已弃用的tx.origin验证调用者,并在代理库或代理合约中鲁莽使用处理冗长的大型授权逻辑require以及delegatecall时,就会出现这类漏洞。如图2所示,在用户A调用合约 B 的内部函数并通过该内部函数再次调用合约 C的过程中,会出现 tx.origin 返回原始发送交易的地址,而msg.sender

21、返回当前交易的发送者的情况。因此当利用tx.origin验证权限时,攻击者会利用上述差异进行攻击。3)算术漏洞。算术漏洞也被称为整数上溢和下溢,这并不是一类新的漏洞,但它们在智能合约中尤其危险,其中无符号整数导致的漏洞最常见,大多数开发人员习惯使用简单的Int类型(通常只是有符号整数)。如果发生溢出,许多看似良性的合约代码将成为盗窃以太币或拒绝服务的源头。如图3所示:由于高位为符号位置,若合约不检查整数上溢的函数,将导致127加上1得到有符号整数-128的错误。4)拒绝服务漏洞。与大多数分布式系统一样,拒绝服务在以太坊中是致命的攻击。导致拒绝服务的方式有很多,包括交易接收者的恶意行为、人为增加

22、计算函数所需的 Gas、滥用控制访问智能合约的私有组件、利用混淆和疏忽等。在如图4所示的锁仓合约调用示例中,用户 A、B、C 都可以通过发布在以太坊上的Lockdrop合约进行锁仓操作,成功后会生成一份属于自己权限控制下的Lock合约。但在Lock合约生成中函数会进行强制判断:属于参与者的 Lock 合约的金额必须等于参与者锁仓时发送的金额,如果不相等,意味着 Lock失败,此时会导致参与者的 Lock合约“瘫痪”而形成“拒绝服务”,如果攻击持续,那么锁仓机制将不再可用。5)低级调用中未检查返回值。call()、callcode()、delegatecall()和send()为Solidity

23、中的低级函数。它们在计算错误方面的行为与其他Solidity函数完全不同,因为它们不会传播并且导致当前执行的完全恢复。相反,它们将返回一个设置false的布尔值,并且代码将继续运行。如果不检查此类低级调用的返回值,可能会导致打开失败和其他不需要的结果。在如下所示的由于调用send()而产生的该类型的漏洞合约代码2)4)行中:如果漏洞合约提高send()函数调用将以太发送到不接受它的智能合约,EVM将用false替换返回值;如果漏洞合约未检查返回值,函数对合约状态的更改将不会被还原,并且 etherLeft变量最终将记录不正确的值。function withdraw(uint256_amount

24、)public require(balances msg.sender=_amount);balances msg.sender-=_amount;etherLeft-=_amount;msg.sender.send(_amount);6)短地址攻击。短地址攻击是 EVM 自身接受错误填充参数的副作用。攻击者通过使用特制地址,使编码不佳的客户端在将参数包含在事务中之前错误地对它进行编码。大量的以太币可能会 直 接 受 到 这 个 问 题 的 影 响。以 以 太 坊 协 议 ERC-20(Ethereum Request for Comments 20)为标准的代币为例,如果调用 transfe

25、r()函数给地址“0 x123456789012345678901234567890123456700”发送2个ETH,交易的input数据可以分为如图5所示的3个部分,但如果传入的地址最后两位是“00”,合约在解析参数时,会从下一个参数的高位拿到“00”来补充,导致后面的参数不足32 Byte,从而自动在尾部补上“00”,这样则会出现只取2个ETH,却拿到512个ETH的漏洞。7)交易顺序依赖漏洞。交易顺序依赖漏洞指一种依赖于交易执行顺序而造成执行结果差异的安全漏洞。交易打包发送出去后会先存入交易池中,区块链矿工节点按照规则从交易池中选取一批交易放入新生成的区块。此时该新生成的区块还没有被确

26、认为最终块,不同节点选取的交易和交易放入的顺序都不固定,因此合约执行的函数顺序也不可预测。一般矿工会选择交易费高的交易放入新区块中,因此攻击者可以通过提高交易费使交易在其他交易之前被写入,进而影响合约的最终执行结果。如图 6所示是 MarketPlace 合约的两种不同的被调用顺序。MarketPlace 合约是一个股票买卖合约,声明了price 和 stock 两个变量,以及两个功能函数 updatePrice 和buy。其中:updatePrice用于更新price值,只有合约所有者才能修改;buy是用户从合约中购买股票。按照顺序 1确认交易会出现用户使用旧的价格购买股票,而顺序2确认交易

27、会出现用户用新的价格购买。利用这一漏洞可能导致合约所有者将用户账户余额清零的攻击行为。8)时间戳依赖漏洞。用户A智能合约Btxorigin值为Amsgsender值为B智能合约Ctxorigin值为Amsgsender值为B图2tx.origin与msg.sender调用结果差异Fig.2Differences between calling results of tx.origin and msg.sender+ll27-l28l00000000lllllll图3整数上溢示例图Fig.3Schematic diagram of integer overflow用户A拥有的 ock合约L用户B

28、拥有的 ock合约L用户C拥有的 ock合约LLockdrop合约function lock(Term term,bytes calldata edgewareAddr,bool isvalidator)uint256 eth=msg.value;address owner=msg.sender;uint256 unlockTime=unlockTimeForTerm(term):LocklockAddr=(new Lock).value(eth)(owner,unlockTime);emit Locked(owner,eth,lockAddr,term,edgewareAddr,isVali

29、dator,now);assert(addresz(lockAddr).balance=msg.value);1)3)5)2)4)6)用户A用户C用户B图4锁仓合约的拒绝服务漏洞Fig.4Denial of service vulnerability in lock contract0 x123456789012345678901234567890123456700对方以太地址)(32 Byte正常 函数前 字节Hash400000000000000000000000000000002转币数量)(32 Byte0 x1234567890123456789012345678901234567对方

30、以太地址)(32 Byte异常 函数前 字节Hash40000000000000000000000000000002转币数量)(32 Byte00图5短地址自动补齐机制Fig.5Short address auto-completion mechanism787第 43 卷计算机应用从锁定代币销售到在游戏的特定时间解锁资金,合约有时需要依赖当前时间,通常通过block.timestamp实现事件约束。在如图7所示的轮盘赌游戏合约中,如果参与用户在区块时间戳正好能被5整除的区块中第一个向智能合约转10以太,那么他将获得之前转入合约的所有赌注。但由于区块由矿工生成,矿工可以预先知道下一个区块的时间

31、戳是否能被5整除,从而作恶赢得所有以太。9)错误随机漏洞。由于以太坊是一种确定性的图灵机,因此通过区块链环境中的变量生成的随机数并不是真随机数。在如图 8所示的示例中,判断获胜合约的发布者定义了pointer指针作为私有变量,希望通过隐藏该私有变量,让用户参与者无法获取私有种子的数值。但攻击者实际上可以通过Web3等方法在区块链上查看到这一变量值,从而利用这一漏洞赢得游戏。3 智能合约漏洞检测关键技术 3.1符号执行符号执行是一种重要的程序分析技术,它通过用抽象符号值替换程序本身未指定的信息来表示任何值从而伪执行程序,同时也发展出了静态符号执行与动态符号执行8。在静态执行方面,Oyente9是

32、第一个被提出的工具,它将智能合约的字节码和以太坊区块链的状态作为输入,通过符号执行可以检测出事务排序依赖、重入、时间戳依赖和未处理的异常四个类型的漏洞。文献 10 中针对整数漏洞提出名为Osiris的工具。该工具通过符号执行方法,针对导致整数上溢或者整数下溢错误的算术指令,检查当前的路径条件下指令是否有可能违反边界检查要求;针对由 Solidity 使用AND和SIGNEXTEND指令截断有符号整数和无符号整数导致的错误,检查这两条指令的输入是否大于指令的输出;针对符号错误,检查特定指令的符号限制。文献 11 中提出了一种基于符号执行的工具DefectChecker,该工具使用堆事件和特征检测

33、器代替了SMT求解器的使用,相较于基于符号执行方法的 Oyente、Mythril12和 Securify13这三种智能合约漏洞检测先驱工具,速度和准确性更优。动态符号执行也称为混合符号执行,通过对路径谓词的识别生成有约束的程序输入,从而提高准确度。文献 14 中提出名为 Manticore 的开源动态符号执行框架,该框架实现了与平台无关的通用符号执行引擎,该引擎对底层执行模型几乎没有任何假设,根据状态生命周期来操作和管理程序状态。文献 15 中提出名为 MAIAN 的工具,该工具通过分析智能合约在以太坊中的多次调用(合约的每次运行被称为一次调用),给定输入的上下文,在合约代码中执行一条执行路

34、径,系统地描述并检测出三种漏洞合约:1)贪婪合约,通过无法发送ETH来锁定资金;2)洪泛合约,可以将ETH泄露给从未互动过的用户;3)自杀性合约,可以杀死合约或强制合约执行自杀指令。尽管符号执行在智能合约漏洞检测方法中被广泛使用,但是将符号执行用于智能合约仍面临着无法识别不可行路径、无法验证交互的合约等局限性16,因此存在许多优化的符号执行漏洞检测方法。例如,文献 10 中的Osiris工具采用污点分析方法筛选掉不能被实际利用的整数错误,以降低误报率。文献 17 中提出一种新的增量符号执行方法,该方法基于路径探索和路径后缀摘要之间的迭代循环。一方面,汇总探索的路径,以更精确地识别受影响的路径;

35、另一方面,路径后缀摘要将路径探索引导到没有增量行为的修剪路径。文献 18 中提出名为Annotary的混合符号执行工具,该工具在 Mythril 工具的基础上,通过构建合约间以及交易间的控制流执行语义模型消除传统符号在执行无法处理的不可达状态时存在误报的问题,并且,通过支持合约开发者声明属性的可验证来实现Solidity语言的向后兼容扩展。3.2形式化验证结合静态分析的程序验证方法在智能合约安全审计中也是研究的热点。该方法基于形式化方法(Formal Method)的相关理论,通过形式化语言把合约中的概念、判断、推理转化成智能合约模型,可以消除自然语言的歧义性、不通用性,进而采用形式化工具对智

36、能合约建模、分析和验证。智能合约形式化验证方法包括演绎验证和模型检测等方法。演绎验证主要基于定理证明(Theorem Proving)的基本思想,采用逻辑公式描述系统及它的性质,通过一些公理或推理规则来证明系统具有某些性质。定理证明可以验证无限状态系统与有限状态系统。虽然定理证明技术通常是半自动化的,需要人的参与和专业知识,但是学术界与工业界依旧开发了许多由定理证明支持的智能合约安全审计方法与工具,可按照定理证明方法所基于的语言级别分为以下三类。1)对EVM字节码这一低级语言层面进行定理证明的研究工作受到了广泛的关注:文献 19 中将智能合约字节码序列组织成直线型程序,然后在Isabelle/

37、HOL定理证明器中用一个字节码级别的程序逻辑对 EVM 形式化进行了扩展;文献 20 中提出一种以Gas消耗量为重点的EVM执行抽象模型,该模型通过对EVM调用堆栈进行度量,提供了对智能合约终止条件的通用形式化证明。2)文献 21 中认为中间语言(Intermediate Language,IL)有助于在验证的直观性和减少底层理解所需的能力之间取得平衡,因此通过 Isabelle/HOL 证明器对 Yul 这一以太坊的IL进行形式化证明,并在证明过程中利用Yul的良好可理解性来设计合约函数的初始前置/后置条件以达到精确识别合约函数的所有假设和影响的目的。基于IL的另一项更具代表性的工作是由文献

38、 22 中提出的ZEUS工具,它构建了第调用buy购买stock合约所有者调用undatePrice修改价格值合约所有者调用undatePrice修改价格值调用buy购买stock交易确认顺序顺序1顺序2图6MarketPlace合约的两种交易确认顺序Fig.6Two transaction confirmation orders for MarketPlace contract轮盘赌合约function()publicpayable require(msg.value=10 ether);require(now!=pastBlockTime);pastBlockTime=now;if(now

39、%5=0)ms.sender.transfer(this.balance);参与用户恶意挖矿节点1 生成包含)该合约的区块2 发送以太)参与游戏3 发送以太)参与游戏图7具有时间戳依赖漏洞的轮盘赌合约Fig.7Roulette contract with timestamp dependence vulnerabilityuint256 privateseed;require(msg.value=1 ether);iteration+;uint randomNumber=uint(keccak256(seed+iteration);if(randomNumber%2=0)msg.sender.

40、transfer(this.balance);functionplay()publicpayable 攻击者合约发布者将私有种子作为 哈希通过eb3W查看私有种子判断获胜合约图8具有错误随机漏洞的游戏合约Fig.8Game contract with error random vulnerability788第 3 期童俊成等:区块链智能合约漏洞检测与自动化修复综述一 个 从 Solidity 语 言 到 低 级 虚 拟 机 中 间 表 示(Low Level Virtual Machine Intermediate Representation,LLVM-IR)的转换器,并进行给定策略下的形

41、式化证明。3)由于并不需要程序员理解 Solidity 源码的编译过程,并且等价性检查对基于IL进行形式化验证的有效性至关重要(例如ZEUS的大多数误报正是由Solidity与转换为LLVM-IR后的语义不一致造成的),因此对Solidity以及生成的领域特定语言(Domain Specific Language,DSL)这样的高级语言进行形式化验证也是研究的热点。文献 23 中基于形式记忆框架完成了第一个Solidity子集的语义形式化工作。模型检测(Model Checking)可以根据系统的规格自动验证具有有限状态的系统模型。该方法的基本思想是通过状态空间搜索来确认合约是否具有某些性质。

42、即给定一个智能合约P和规约,生成对应的合约模型M,然后证明规约公式在智能合约模型M中成立,这样就证明了智能合约P满足规约。在基于模型检测方法的智能合约安全审计研究工作中,模型检测方法的流行得益于传统代码分析领域大量成熟的框架与工具的存在,比如 NuSMV 和 nuXmv等模型检查器以及WebGME等开源Web框架。文献 24 中提出 FSolidM 工具,该工具建立在 WebGME之上,能够将智能合约转为有限状态机,并通过锁定、交易计数器等插件完成对重入漏洞与交易排序依赖漏洞的检测;在此基础上,文献 25 中进一步设计并实现集成了nuXmv验证器的VeriSolid工具,以满足并发系统死锁和活

43、锁等机制的验证需求;文献 26 中则基于多个智能合约交互的视角,通过引入部署图来扩展VeriSolid系统的操作语义;文献 27 中提出一种由不同实体开发和控制的交互智能合约组成的系统的验证方法,该方法使用NuSMV模型检测器和行为-交互-优先级(Behavior Interaction Priority,BIP)工具建模智能合约的行为及交互,从而验证它们是否符合系统的功能要求。上述模型检测方法虽然已经从对单个智能合约的验证扩展到了对智能合约交互进行验证,但由于 NuSMV 等模型检测器输入语言的限制,模型检查方法很少考虑区块链上智能合约执行的细节,比如 Gas机制或内存模型,这意味着对区块链

44、环境进行精确建模成为了难点。文献 28 中考虑智能合约在执行环境中的执行行为因素,如合约的注册、外部交易的接收等并对此进行建模;文献 29 中通过将着色Petri网(Colored Petri Net,CPN)与 EVM 字节码的程序逻辑相结合,实现了一个更现实的智能合约执行模型。3.3模糊测试模糊测试(Fuzzing)是一种流行且有效的软件测试技术,通过向被测智能合约输入大量意外数据,检测异常发生情况,从而发现潜在漏洞。相较于符号执行与形式化验证等方法的复杂设计,模糊测试具有简单高效的特点,而且是在运行过程中测试,有助于挖掘出更深层的智能合约漏洞。文献 30 中设计并实现了第一个基于模糊测试

45、的以太坊智能合约漏洞检测工具ContractFuzzer,通过分析智能合约的应用程序二进制接口(Application Binary Interface,ABI)生成符合被测智能合约调用语法的输入。在输入用例生成过程中,该工具针对重入等7个类型的智能合约漏洞按照固定大小输入与非固定大小输入两类将用户提供的输入种子生成输入。后续学者在智能合约模糊测试领域的研究工作热衷于提高模糊测试中测试用例的覆盖率以提高漏洞检测的精度。文 献31中 提 出 一 种 基 于 属 性 的 智 能 合 约 测 试 工 具Echidna,它利用了基于语法的模糊测试。Echidna首先通过智能合约静态分析框架编译合约并进

46、行分析,确定直接处理ETH的常量和函数;然后基于得到的常量、事务与函数生成的随机交易进行模糊测试。文献 32 中提出名为sFuzz的方法,该方法基于传统工具AFL,采用反馈自适应模糊策略并考虑将区块编号和时间戳建模为环境信息,以提高路径覆盖率。文献 33 中结合深度学习在学习阶段通过神经网络对运行符号执行所获得的交易序列进行训练,但也增加了学习阶段的开销。文献 34 中提出了一个用于智能合约的混合模糊测试器 ConFuzzius,结合了进化模糊测试和约束求解,能执行更多的智能合约代码并找出更多的bug。进化模糊测试用于测试智能合约的浅层逻辑,约束求解用于生成可以满足复杂条件的输入,从而得到更深

47、入的测试路径,而且ConFuzzius使用数据依赖分析高效地生成交易序列,以找出可能存在bug的特定的合约状态。另外,也有越来越多的学者致力于研究效率和覆盖率平衡的智能合约模糊测试方法。文献 35 中通过污点分析指导交易序列的生成,排除候选测试对象,从而实现最小化搜索空间并提高模糊测试过程效率的目的。文献 36 中提出一种用于智能合约漏洞挖掘的灰盒模糊测试方法Harvey,它在兼顾灰盒模糊测试方法轻量级特点的同时通过基于预测输入和基于需求驱动的模糊序列的方式以提高覆盖率。4 智能合约漏洞修复与升级部署方法 虽然已经有如第 3章所示的各类方法致力于检测出智能合约的错误,以太坊社区也已经发布了许多

48、安全编程建议与指南37-39,但一旦智能合约部署在区块链上,区块链系统就认为它的代码不可改变,因此需要漏洞自动修复技术以升级部署无错误的指南合约,否则,智能合约安全审计方法反而会增加攻击者利用合约漏洞的可能性。对于智能合约升级部署问题,以太坊社区已经探索了几种设计模式来支持可升级的智能合约40-43。其中,最简单的方法是将修补后的合约部署在新地址,并将原始合约的状态迁移到该地址。但这一过程要求合约开发者访问旧合约的所有内部状态以及新合约中接受状态转移的程序,增加了开发者的工作量。为避免状态迁移,合约修复与升级还可以由开发者使用新的合约作为数据存储合约(也称为永恒存储模式)来实现,但是这会增加外

49、部调用带来的额外的 Gas开销问题。一种更实用的策略是使用委托调用代理模式编写合约。在该模式下,一个智能合约被拆分为两个不同的合约:1)代理合约,持有所有资金和所有内部状态,但不实现任何业务逻辑,它是所有用户交易的接入点,具有不可变的代码与合约地址。2)逻辑合约,包含管理合约动作的实际代码。代理合约使用DELEGATECALL指令将所有函数调用转发到注册的逻辑合约。该指令用于授予逻辑合约访问代理合约中存储的所有内部状态和资金的权限。当智能合约升级时,首先需要部署一个新的逻辑合约,并在代理合约中更新相应地址;然后,代理合约将所有未来的交易转发给修补后的逻辑合约。在这一部署升级合约的过程中不需要任

50、何数据迁移,因为所有数据都存储在不可变代理合约中,并且,由于合约地址保持不变,用户对升级过程也是可见的。由于区块链系统的分布式特性,智能合约数量始终在线增长,合约升级模式又要求确保版本兼容,因此修补智能合约错误是一个耗时、繁琐的过程,对自动化的智能合约字节码重写技术研究成为了一项重要且具有实际意义的工作。789第 43 卷计算机应用文 献44中 提 出 了 智 能 合 约 字 节 码 修 复 系 统SMARTSHIELD,该系统的工作流程如图 9 所示。该系统的工作流程主要包含以下2部分:1)语义提取。首先分析每个智能合约的抽象语法树(Abstract Syntax Tree,AST)和未修正

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 学术论文 > 论文指导/设计

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服