Web3底层语言(二):Move如何避免闪电贷重入攻击?(闪电贷 套路)
摘要
上一篇报告从底层语言特点,对比了Move和Solidity(以太坊)的优势和特点。作为Web3的基础性研究,本篇从闪电贷这一最具特色的应用角度出发,分析了以太坊和Move分别如何实现闪电贷,Move怎样规避了闪电贷攻击?
以太坊合约之间的交互是通过互通消息实现的状态一致,且允许重入、动态调用,这一特点为实现闪电贷提供了基础。期间,合约之间的函数可以互相来回调用——调用过程中会发生控制权转移。如果DeFi项目平台合约有漏洞,套利者能够利用其合约的恶意代码调用相应函数进行资产盗取——利用合约之间的状态同步信息差,在一个流程未结束时双花资产(以太坊资产只是赋值),或者重复执行函数(本该不被允许的逻辑)进行盗取。
重入攻击的前提是攻击者部署的合约存在恶意代码,但最核心的因素是:
1)以太坊合约调用时控制权存在转移,这为恶意合约提供了主动权;
2)且流程在结束之前可以重入(重复调用),恶意合约可以利用漏洞反复调用函数实现资产盗取(如一笔取款流程未结束时反复提取很多次);
3)加上以太坊账户资产是以数值余额的形式存在,因此存在反复盗取资产(双花)的可能,或者在流程结束之前恶意合约就可以修改相关账户资产余额数值实现盗取。
Move提出了闪电贷的新一种运行流程——烫手山芋模式,根本上弃用可重入。“烫手山芋(hot-potato)”模式是一种没有key、store、copy和drop能力的结构,是Move程序在交易执行期间仅使用一次的结构。由于没有drop、key或store能力,因此烫手山芋只能通过调用“销毁”函数来完结流程——这就如其名所示意的一样,这是一块烫手山芋,在流程中任何处置都是“烫手”的,只能交给销毁函数来完结。具体流程如下:
1)闪电贷智能合约在工作时会创建了“烫手山芋”(hot-potato)的收据(receipt);
2)套利者向闪电贷合约贷款时,闪电贷合约发送贷款资金和一个烫手山芋收据(receipt);
3)套利者利用贷款资金进行套利操作;
4)套利者还款时,调用还款函数(repay),将资金和收据(receipt)发给还款函数,收据被还款函数接收后销毁。
闪电贷完成的前提的最后正确还款、流程结束,在流程结束之前恶意合约可以在以太坊系统实现重复调用、修改相应的资产账户赋值实现盗取。Move系统闪电贷流程结束的前提除了正确归还资金之外,还需要将烫手山芋这个资源进行一次性回收销毁处理,这确保了闪电贷的原子性。
风险提示:区块链商业模式落地不及预期;监管政策的不确定性。
1. 核心观点
闪电贷作为以太坊DeFi生态最具特色的应用,其基础是以太坊使用的Solidity语言允许动态调用和重入。虽然这种动态调用是智能合约开放性、可组合性的重要体现,但其带来的控制权转移和对合约函数的重复调用带来了不小的安全隐患,行业内利用闪电贷攻击有漏洞的DeFi资金池事件时有发生。由于Move语言不允许动态调用和重入,它使用一种“烫手山芋”模式很简单地实现了闪电贷,因此完全可以避免以太坊那样的安全问题。
两种系统在生态应用的工作模式有着明显的区别,这种差别的根本在于Move底层语言的特点,我们在前一篇报告《Web3底层语言:Move弥补了Solidity哪些不足?》已有详述。本篇报告从闪电贷应用角度来比较一下两者实现应用的不同玩法。
2.以太坊闪电贷的基础:动态调用与可重入
闪电贷(Flash Loan)是一种原生的DeFi新产物,可以理解为极速贷款。用户只需要在同一笔交易(区块)中完成借贷、套利、偿还并支付一笔手续费,由于是原子交易,那么借款人无需抵押任何资产即可实现借贷,提供了一种无本金套利方案。
我们在上一篇报告《Web3底层语言:Move弥补了Solidity哪些不足?》中提到的:
“对于模块化和合约组合性方面,Solidity(如以太坊)上面的Contract合约通过library(相当于静态库)进行消息的传递,从而实现Contract合约之间的调用、交互。而Move语言使用了模块(module)和脚本(script)的设计,前者类似于Contract合约,Move语言的合约组合性则是模块之间的组合,通过传递资源(即前文提到的resources)。关于组合性方面,Solidity和Move的区别非常明显。”
以太坊合约之间的交互是通过互通消息实现的状态一致,且允许重入、动态调用,就是说合约之间的函数可以互相来回调用——调用过程中会发生控制权转移。这一特点为实现闪电贷提供了基础。
具体来说,在一个以太坊交易中,可以进行转账操作以及其他一些列合约操作,通过调用智能合约中的功能函数,执行多项复杂功能——也就是说,一笔基于以太坊的交易可以融合一系列复杂交易:将借款、套利、偿还等一系列交易操作融合到一起成为可能。Flash Loan中所有操作都在一个区块时间中完成,按照现在的以太坊的出块速度,Merge后也就是12秒——核心并非是12秒,而是这一系列的交易要能够最终盈利并偿还,如果没有做到这一点,这笔交易就不会被打包写入区块,相当于借款人借款、套利(失败)这些操作并不是有效交易,只是临时状态——即原子交易。因此,用户必须通过编程将需要执行的所有步骤形成一项智能合约交易并完成借贷、使用和偿还的三个步骤。
上述复杂的交易操作由几个合约之间的动态调用实现,且这种调用是可重入的(也就是可以反复调用)。
目前用户也可以通过如FURUCOMBO这一类第三方项目,对闪电贷完成更简易的插件性编程,无需实际编写代码完成智能合约的设计,最终实现闪电贷需要的全套操作。具体的套利流程如下图所示(利用FURUCOMBO平台,具体兑价均为示例),目前Kyberswap平台上的价格情况1 sUSD =0.9927 DAI,而Uniswap上1 DAI=1.2411 sUSD,用户发现这两个平台的DAI-sUSD交易对价格存在较大的套利空间,即可通过FURUCOMBO的界面,设计套利过程。包括:1、从AAVE借贷平台的闪电贷功能借出100 DAI;2、通过Uniswap将100 DAI兑换成约122个sUSD代币;3、通过Kyberswap平台将sUSD代币兑换成约122 DAI代币;4、偿还从AAVE借出的100 DAI代币以及手续费0.09 DAI;5、整个利用闪电贷的套利流程在一个以太坊交易内完成,并获利约22 DAI。
如果在这一笔以太坊交易内借贷的资金没有得到偿还,那么整笔借贷交易不会被打包进入区块中,相当于借贷并没有实际发生,所以借贷方的资金不会受任何影响——中间的借贷和套利过程只是临时状态,并未被矿工打包确认。基于闪电贷的特性和时效要求,目前其最广泛的应用是套利交易。套利者无需自身使用资产进行套利操作,只需要通过闪电贷获得所需的资金量完成套利交易,并及时偿还借贷的资金。这极大的降低了套利者的准入门槛,因为理论上任何一个人都可以成为套利者,并且拥有没有上限的套利资金进行操作。
从上述流程可以看到,以太坊合约控制权在FURUCOMBO闪电合约-套利者账户合约-Uniswap合约-Kyperswap合约-闪电贷合约之间切换,且可以进行动态调用相应的函数,如果DeFi项目平台合约有漏洞,套利者能够利用其合约的恶意代码调用相应函数进行资产盗取——利用合约之间的状态同步信息差,在一个流程未结束时双花资产(以太坊资产只是赋值),或者重复执行函数(本该不被允许的逻辑)进行盗取。
对于Move生态,由于资产并非简单的赋值,且禁止动态调用和可重入,从根本上杜绝了风险,其具体实现我们在后面会阐述。
3. Move与Solidity闪电贷的具体实现有怎样的区别?
3.1.以太坊闪电贷双刃剑:动态调用和可重入性
从实现方式上来看,以太坊EVM(基于Solidity)具有动态调度,可以通过可重入实现闪电贷。如我们在上一篇报告《Web3底层语言:Move弥补了Solidity哪些不足?》中提到的:
“以太坊(Solidity)的资产是由相应的合约控制,如果把Token A合约比喻为保险箱,保险箱会给所有用户分配一个数值余额,来表达用户所有拥有的Token A资产数量,但资产本身还是放在Token A合约的保险箱内。而Move用户账户本身就是一个单独的大保险箱,由用户自己控制,所有的Token资产都放在这个保险箱内。且这些Token并不是以数字的形式存在,而是不可复制的、权限受用户控制的资源(类型)。”
因此以太坊EVM实现闪电贷套利的流程是:
1)用户将调用控制权交给闪电贷合约;
2)闪电贷合约调用来自外部的套利合约程序中的执行函数,将请求的借款金额发送给套利合约,套利合约进行套利操作;
3)套利合约完成套利,将借款归还给闪电贷合约,执行函数完成工作,控制权还给闪电贷合约;
4)闪电贷合约检查还款金额是否正确,正确则套利交易成功,否则失败。
在上面这个过程中,相应的函数是动态调用的,闪电贷合约需要检查归还金额是否正确才会结束,因此控制权的转移过程是随时可以发生的,也就是可重入的——同时需要注意的事,以太坊账户资产是以数值余额的形式存在,重入会带来双花的可能,这也是存在漏洞的地方。调用外部合约的主要危险之一是它们可以接管控制,而这些来自外部的合约程序一旦有漏洞,攻击者可以通过反复调用实现攻击,即可重入攻击。
可重入攻击造就了以太坊历史上最严重攻击之一,直接导致了以太坊分叉,即2016年6月17日的The DAO崩溃事件。黑客部署了一个合约,作为“投资者”在The DAO中储存一些ETH。然后黑客通过调用The DAO 合约中的withdraw函数,使得The DAO合约给黑客提款,由于黑客合约(fallback函数)存在恶意漏洞——其没有结束的逻辑,于是The DAO始终未能完成提款(此时The DAO并不知道黑客收到了提款并将其账户余额变为0)并拿回控制权,黑客通过不断调用withdraw函数发送超过其初始存款ETH数量。
在闪电贷攻击事件中,攻击者往往通过恶意合约实现可重入攻击。如2022年3月16日,黑客通过闪电贷借款,利用借贷项目Hundred Finance的漏洞实时重入攻击,最终获利约2363 ETH。具体流程并不复杂,由于Hundred Finance是先转账后记账,黑客通过闪电贷借款,利用攻击合约存入Hundred Finance借款池实现抵押贷款,而攻击合约部署的onTokenTransfer函数在记账之前实现重复调用借款函数(重入攻击),以一笔抵押资产不断从不同借款池提取借款,由于是先转账后记账,当记账时(流程结束)黑客已经实现了攻击并获利。攻击的核心是:流程未结束之前,攻击者合约可以反复调用相关函数实现资产盗取。
就好比说,攻击者合约将资产抵押给A银行(项目A借款池)进行贷款,银行A在未完成记账结算之前就开始放款,而银行A完成记账结算流程意味着闪电贷交易要成功(原子性),这时候资产被A入库记账。但由于银行A和其他银行之间的信息不同步(合约函数之间的状态不同步),攻击者在A银行还未完成资产入库记账时(即被攻击合约贷款流程未结束时,这时候闪电贷工作流程还未结束,合约函数调用还可以进行),再次以该资产在B、C等其他银行进行抵押贷款(重入),待流程结束,攻击者已经完成闪电贷攻击并获利。
重入攻击的前提攻击者部署的合约存在恶意代码,但最核心的因素是:
1)以太坊合约调用时控制权存在转移,这为恶意合约提供了主动权;
2)且流程在结束之前可以重入(重复调用),恶意合约可以利用漏洞反复调用函数实现资产盗取(如一笔取款流程未结束时反复提取很多次);
3)加上以太坊账户资产是以数值余额的形式存在,因此存在反复盗取资产(双花)的可能,或者在流程结束之前恶意合约就可以修改相关账户资产余额数值实现盗取。
“可重入”是实现闪电贷的基础,然而一旦目标合约有漏洞,攻击者便可以实施重入攻击。这在我们前一篇报告中有详述。
3.2.MOVE的“烫手山芋”:没有重入的闪电贷
Move语言禁止动态调用和可重入,这从根本上杜绝了重入攻击。但Move系统的资产作为资源类型,一旦借出就相当于发生了真实转移,该如何确保闪电贷顺利还款呢?
Move提出了闪电贷的新一种运行流程——烫手山芋模式,根本上弃用可重入。“烫手山芋(hot-potato)”模式是一种没有key、store、copy和drop能力的结构,是Move程序在交易执行期间仅使用一次的结构。由于没有drop、key或store能力,因此烫手山芋只能通过调用“销毁”函数来完结流程——这就如其名所示意的一样,这是一块烫手山芋,在流程中任何处置都是“烫手”的,只能交给销毁函数来完结。具体流程如下:
1)闪电贷智能合约在工作时会创建了“烫手山芋”(hot-potato)的收据(receipt);
2)套利者向闪电贷合约贷款时,闪电贷合约发送贷款资金和一个烫手山芋收据(receipt);
3)套利者利用贷款资金进行套利操作;
4)套利者还款时,调用还款函数(repay),将资金和收据(receipt)发给还款函数,收据被还款函数接收后销毁。
我们在前一篇报告中已经分析过,账户资产和收据(receipt)都是一种资源类型,“不能复制、丢弃或重用,可以被安全地存储和转移”,因此收据(receipt)必须被处理(且只能使用一次),而非像以太坊那样的对账户进行数值赋予处理就行。因此烫手山芋模式可以确保被借出的资产(资源类型,一旦借出就真实发生转移了)必须被归还。收据(receipt)作为烫手山芋,就好比是定时一个引爆器(这里的定时,是闪电贷套利作为一个原子交易的“时间”,并非具体的时长),资金和引爆器一起绑定被借出,而任何一方都无法收留引爆器,它必须被还回原处得以拆除——否则交易都无法完成,因此闪电贷资金可以确保会被归还。
闪电贷完成的前提的最后正确还款、流程结束,在流程结束之前恶意合约可以在以太坊系统实现重复调用、修改相应的资产账户赋值实现盗取。Move系统闪电贷流程结束的前提除了正确归还资金之外,还需要将烫手山芋这个资源进行一次性回收销毁处理,这确保了闪电贷的原子性。
从应用角度看,Web3的底层代表要在保证开放性、可重构的基础上提高代码安全性。在Web3中,代码不仅包含信息,还直接涉及资产调用,保证用户资产安全是重中之重,否则Web3将是黑暗森林。以太坊的生态让大家看到了智能合约的活力,下一个时代将在此基础上向安全性、合规性继续演进,这也是我们当下关注Web3底层语言进化的核心逻辑,或者这孕育着下一轮的创新浪潮。
风险提示
区块链商业模式落地不及预期:区块链、密码学等相关技术和项目处于发展初期,存在商业模式落地不及预期的风险。
监管政策的不确定性:区块链项目实际运行过程中涉及到多项金融、网络及其他监管政策,目前各国监管政策还处于研究和探索阶段,并没有一个成熟的监管模式,所以行业面临监管政策不确定性的风险。
本文节选自国盛证券研究所已于2022年12月29日发布的报告《Web3底层语言(二):Move如何避免闪电贷重入攻击?》,具体内容请详见相关报告。
宋嘉吉 S0680519010002 songjiaji@gszq.com
任鹤义 S0680519040002 renheyi@gszq.com
特别声明:《证券期货投资者适当性管理办法》于2017年7月1日起正式实施。通过微信形式制作的本资料仅面向国盛证券客户中的专业投资者。请勿对本资料进行任何形式的转发。若您非国盛证券客户中的专业投资者,为保证服务质量、控制投资风险,请取消关注,请勿订阅、接受或使用本资料中的任何信息。因本订阅号难以设置访问权限,若给您造成不便,烦请谅解!感谢您给予的理解和配合。
重要声明:本订阅号是国盛证券通信团队设立的。本订阅号不是国盛通信团队研究报告的发布平台。本订阅号所载的信息仅面向专业投资机构,仅供在新媒体背景下研究观点的及时交流。本订阅号所载的信息均摘编自国盛证券研究所已经发布的研究报告或者系对已发布报告的后续解读,若因对报告的摘编而产生歧义,应以报告发布当日的完整内容为准。本资料仅代表报告发布当日的判断,相关的分析意见及推测可在不发出通知的情形下做出更改,读者参考时还须及时跟踪后续最新的研究进展。
本资料不构成对具体证券在具体价位、具体时点、具体市场表现的判断或投资建议,不能够等同于指导具体投资的操作性意见,普通的个人投资者若使用本资料,有可能会因缺乏解读服务而对报告中的关键假设、评级、目标价等内容产生理解上的歧义,进而造成投资损失。因此个人投资者还须寻求专业投资顾问的指导。本资料仅供参考之用,接收人不应单纯依靠本资料的信息而取代自身的独立判断,应自主作出投资决策并自行承担投资风险。
版权所有,未经许可禁止转载或传播。
【国盛区块链系列之元宇宙】
2021.6.28 国盛区块链独家带你——在“元宇宙”中看元宇宙
2021.7.16 国盛区块链:中国版Roblox上线,元宇宙UGC生态迎来新发展
2021.8.2 国盛区块链:元宇宙之二:算力重构,通向Metaverse的阶梯
2021.8.30 国盛区块链:元宇宙(四):GameFi赛道崛起,元宇宙踏上破圈征程
2021.10.12 国盛区块链:元宇宙(五) : NFT商业落地中的思考
2021.12.21 国盛区块链:虚拟人的“灵魂”是什么?
【国盛区块链系列之数字货币】
2019.9.24 国盛区块链:初探中国央行数字货币:目标、定位、机制与影响
2019.10.9 国盛区块链 | 再探央行数字货币:对电子支付产业有何影响?
2019.11.15 国盛区块链:数字货币的双离线支付是什么?
2020.4.8 国盛区块链专题:三探央行数字货币:透过专利看“超级货币”蓝图
2020.4.17 国盛区块链:一图看懂央行数字货币相关标的
2020.6.24 国盛区块链:四探央行数字货币:第三方支付产业新变量
2020.7.9 国盛区块链:五探数字货币:NFC+SIM卡打造DCEP安全支付环境
2020.9.22 国盛区块链:六探央行数字货币:他山之石,枕戈待旦
2021.3.9 国盛区块链:六大行发力DCEP,数字人民币渐行渐近
2021.4.20 国盛区块链:数字人民币测试加速,应用场景不断丰富
2021.4.19 国盛区块链:数字人民币与加密货币分而治之,公测在即
2021.5.7国盛区块链:不可或缺的数字货币
2021.7.18 国盛区块链:数字货币再加速,大国竞争新赛道
2021.9.8 国盛区块链:数字人民币产业链初现,亮相服贸会
2021.11.9 国盛区块链:外币兑换机亮相进博会,数字人民币国际化提速
2022.1.5 国盛区块链: 数字人民币App上线,新电子支付体系显露真容
【国盛区块链系列之DeFi】
2021.1.25 国盛区块链:DEFI生态、以太坊2.0:锁仓推动eth价格持续新高
2021.2.1 国盛区块链:链上费用Top10 DeFi占八席、以太坊扩容和二层网络值得期待
2021.4.22 国盛区块链·深度:DeFi新金融(一):构筑加密世界开放金融新生态
2021.4.24 国盛区块链·深度:DeFi新金融(二):超额抵押与资产映射
2021.5.12 国盛区块链·深度:DeFi新金融(三):DeFi高收益从何而来?
2021.6.16 国盛区块链·深度:DeFi新金融(四):暴跌下的压力测试,DeFi韧性如何?
2021.8.1 国盛区块链·深度:DeFi新金融(五):稳定币的昨天、今天和明天
2021.9.18 国盛区块链:掉进兔子洞——DeFi的诱人承诺与风险
【国盛区块链系列之NFT】
2021.3.15 国盛区块链|频频“出圈”的NFT:链接真实世界的入口
2021.4.11 国盛区块链·深度:NFT:数字资产化桥梁,进化才刚刚开始
2021.8.31国盛区块链: 互联网巨头入局元宇宙,NFT收藏品市场持续升温
2021.9.7 OpenSea——全球最大NFT交易平台的创新与破圈
2021.9.9 国盛区块链:何为NFT?价值何来?
【国盛区块链系列之上市公司】
2019.3.4 国盛区块链:Facebook计划发行加密货币、新加坡政府投资公司参与Coinbase融资
2019.11.24 国盛通信宋嘉吉:嘉楠科技深度:全球矿机第一股,产业延伸看 AI
2020.2.15 国盛区块链&轻工:东港股份深度:龙头转型,区块链业务锋芒渐露
2020.3.3 国盛区块链&轻工: 东港股份002117:北京试点区块链电子发票,公司步入快车道
2020.4.14 国盛区块链&轻工:东港股份002117:主业平稳,区块链业务驶入快车道
2021.2.8 国盛区块链:比特币价格高企,中嘉博创布局算力运营产业链
2021.2.23 国盛区块链·深度:全球比特币挖矿股全景解析
2021.3.16 国盛区块链·深度:Coinbase上市:里程碑与新起点
2021.3.22 国盛区块链:香港首家持牌数字资产交易所上线,Coinbase推迟至下月上市
2021.4.17 国盛区块链:嘉楠科技(CAN):比特币看多期权,业绩有望延后爆发
2021.8.11 国盛区块链:Coinbase月活增速亮眼,以太坊交易量首超比特币
【国盛区块链系列之周观点】
2020.12.21 国盛区块链:数字黄金渐行渐近,比特币会成为全球储备资产吗
2020.12.28 国盛区块链:比特币新高下,挖矿行业怎么看?
2021.1.18 国盛区块链:跨链生态引领币市热点,灰度下架XRP信托产品
2021.2.22 国盛区块链:比特币持续新高,概念股惊艳资本市场
2021.2.16 国盛区块链|特斯拉购入比特币,数字黄金再“出圈”
2021.3.1 国盛区块链:以太坊1559提案:矿工、持币人和社区利益的再平衡
2021.3.8 国盛区块链:火币科技虚拟资产基金登陆香港,行业加速合规化
2021.3.22 国盛区块链:香港首家持牌数字资产交易所上线,Coinbase推迟至下月上市
2021.4.5 国盛区块链:VISA将支持加密货币结算,crypto加速渗透传统金融
2021.4.17 国盛区块链:嘉楠科技(CAN):比特币看多期权,业绩有望延后爆发
2021.4.20 国盛区块链:数字人民币测试加速,应用场景不断丰富
2021.4.21 国盛区块链:Chia新模式催化,硬盘存储设备供不应求
2021.4.26 国盛区块链:Chia下周开启交易,挖矿新模式迎来市场首秀
2021.6.1 国盛区块链:加密货币挖矿监管趋严,BSC安全事件频发
2021.6.15 国盛区块链:中国数据安全法出台,隐私计算推动数据要素市场化
2021.6.29 国盛区块链:加密货币监管持续收紧,蚂蚁链NFT迎来首秀
2021.8.10 国盛区块链:以太坊1559提案正式实施,代币销毁效果显著
2021.8.31 国盛区块链: 互联网巨头入局元宇宙,NFT收藏品市场持续升温
2021.9.7 国盛区块链:OpenSea——全球最大NFT交易平台的创新与破圈
2021.9.21 国盛区块链:Loot异军突起,虚拟经济的新尝试
2021.10.24 国盛区块链: 从比特币期货ETF获批,看全球区块链产业变迁
2021.10.25 国盛区块链:Facebook计划更名,加速构建元宇宙版图
【国盛区块链系列之其他】
2021.5.1 国盛区块链|2021掘金丰水期——融合、出圈与合规
2021.4.29 国盛区块链·深度:迭代与竞争——以太坊的Layer2扩容之路
2021.4.16 国盛区块链:美联储全景解读DeFi的颠覆力量
2021.1.24 国盛区块链:区块链新基建(四):中欧投资协定背景下,隐私计算开启新蓝海
(向下滑动,查看更多)