区块链行业WEB3底层语言(二):MOVE如何避免闪电贷重入攻击?

类别:行业 机构:国盛证券有限责任公司 研究员:宋嘉吉/任鹤义 日期:2022-12-29

  上一篇报告从底层语言特点,对比了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 系统闪电贷流程结束的前提除了正确归还资金之外,还需要将烫手山芋这个资源进行一次性回收销毁处理,这确保了闪电贷的原子性。

      风险提示:区块链商业模式落地不及预期;监管政策的不确定性。