火星链 火星链
Ctrl+D收藏火星链
首页 > 火币下载 > 正文

MOV:Move 如何避免闪电贷重入攻击?

作者:

时间:1900/1/1 0:00:00

撰文: 宋嘉吉、任鹤义

来源:吉时通信

摘要:上一篇报告从底层语言特点,对比了 Move 和 Solidity(以太坊)的优势和特点。作为 Web3 的基础性研究,本篇从闪电贷这一最具特色的应用角度出发,分析了以太坊和 Move 分别如何实现闪电贷,Move 怎样规避了闪电贷攻击?

以太坊合约之间的交互是通过互通消息实现的状态一致,且允许重入、动态调用,这一特点为实现闪电贷提供了基础。期间,合约之间的函数可以互相来回调用——调用过程中会发生控制权转移。如果 DeFi 项目平台合约有漏洞,套利者能够利用其合约的恶意代码调用相应函数进行资产盗取——利用合约之间的状态同步信息差,在一个流程未结束时双花资产(以太坊资产只是赋值),或者重复执行函数(本该不被允许的逻辑)进行盗取。

重入攻击的前提是攻击者部署的合约存在恶意代码,但最核心的因素是:

以太坊合约调用时控制权存在转移,这为恶意合约提供了主动权;

且流程在结束之前可以重入(重复调用),恶意合约可以利用漏洞反复调用函数实现资产盗取(如一笔取款流程未结束时反复提取很多次);

加上以太坊账户资产是以数值余额的形式存在,因此存在反复盗取资产(双花)的可能,或者在流程结束之前恶意合约就可以修改相关账户资产余额数值实现盗取。

Move 提出了闪电贷的新一种运行流程——烫手山芋模式,根本上弃用可重入。「烫手山芋(hot-potato)」模式是一种没有 key、store、copy 和 drop 能力的结构,是 Move 程序在交易执行期间仅使用一次的结构。由于没有 drop、key 或 store 能力,因此烫手山芋只能通过调用「销毁」函数来完结流程——这就如其名所示意的一样,这是一块烫手山芋,在流程中任何处置都是「烫手」的,只能交给销毁函数来完结。具体流程如下:

Move to Earn应用STEPN过去24小时新铸造鞋子3492双:金色财经消息,据Dune链上数据显示,Move to Earn应用STEPN过去24小时新铸造鞋子3492双,过去7日新铸造鞋子13623双;过去7日活跃用户59408。[2022/7/25 2:35:28]

闪电贷智能合约在工作时会创建了「烫手山芋」(hot-potato)的收据(receipt);

套利者向闪电贷合约贷款时,闪电贷合约发送贷款资金和一个烫手山芋收据(receipt);

套利者利用贷款资金进行套利操作;

套利者还款时,调用还款函数(repay),将资金和收据(receipt)发给还款函数,收据被还款函数接收后销毁。

闪电贷完成的前提的最后正确还款、流程结束,在流程结束之前恶意合约可以在以太坊系统实现重复调用、修改相应的资产账户赋值实现盗取。Move 系统闪电贷流程结束的前提除了正确归还资金之外,还需要将烫手山芋这个资源进行一次性回收销毁处理,这确保了闪电贷的原子性。

闪电贷作为以太坊 DeFi 生态最具特色的应用,其基础是以太坊使用的 Solidity 语言允许动态调用和重入。虽然这种动态调用是智能合约开放性、可组合性的重要体现,但其带来的控制权转移和对合约函数的重复调用带来了不小的安全隐患,行业内利用闪电贷攻击有漏洞的 DeFi 资金池事件时有发生。由于 Move 语言不允许动态调用和重入,它使用一种「烫手山芋」模式很简单地实现了闪电贷,因此完全可以避免以太坊那样的安全问题。

两种系统在生态应用的工作模式有着明显的区别,这种差别的根本在于 Move 底层语言的特点,我们在前一篇报告《Web3 底层语言:Move 弥补了 Solidity 哪些不足?》已有详述。本篇报告从闪电贷应用角度来比较一下两者实现应用的不同玩法。

Solana生态Move to Earn应用Walken将在6月7日进行公测:6月6日消息,Solana生态Move to Earn应用Walken将在6月7日推出公开测试版,该公开测试版已经可以在苹果应用商店APPStore和谷歌应用商店Google Play市场中下载,适用于iOS和Android移动操作系统,如果测试顺利将在6月底正式发布并上线WLKN代币。

此前报道,6月2日,Walken宣布完成470万美元融资,Morningstar Ventures等参投。[2022/6/6 4:04:33]

闪电贷(Flash Loan)是一种原生的 DeFi 新产物,可以理解为极速贷款。用户只需要在同一笔交易(区块)中完成借贷、套利、偿还并支付一笔手续费,由于是原子交易,那么借款人无需抵押任何资产即可实现借贷,提供了一种无本金套利方案。

我们在上一篇报告《Web3 底层语言:Move 弥补了 Solidity 哪些不足?》中提到的:

「对于模块化和合约组合性方面,Solidity(如以太坊)上面的 Contract 合约通过 library(相当于静态库)进行消息的传递,从而实现 Contract 合约之间的调用、交互。而 Move 语言使用了模块 (module) 和脚本 (script) 的设计,前者类似于 Contract 合约,Move 语言的合约组合性则是模块之间的组合,通过传递资源(即前文提到的 resources)。关于组合性方面,Solidity 和 Move 的区别非常明显。」

以太坊合约之间的交互是通过互通消息实现的状态一致,且允许重入、动态调用,就是说合约之间的函数可以互相来回调用——调用过程中会发生控制权转移。这一特点为实现闪电贷提供了基础。

Ontology与bloXmove达成合作:基于区块链的自主身份识别系统开发商Ontology宣布与去中心化移动出行平台bloXmove建立合作关系,以加速其去中心化凭证的开发。去中心化数字身份协议(DID)将使区块链参与者能够以隐私、安全和加密的方式共享其个人信息,如驾驶执照。Ontology将能够通过bloXmove的BLMX代币实现自动化和安全结算。(Cointelegraph)[2021/11/24 22:13:09]

具体来说,在一个以太坊交易中,可以进行转账操作以及其他一些列合约操作,通过调用智能合约中的功能函数,执行多项复杂功能——也就是说,一笔基于以太坊的交易可以融合一系列复杂交易:将借款、套利、偿还等一系列交易操作融合到一起成为可能。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。

货币分析师Abrosimova:黄金准备进一步迈向2000美元:黄金价格已连续6个交易日处于稳定增长轨道上,距离2011年创下的历史高位1921美元/盎司不过一步之遥。考虑到对全球经济状况的持续担忧,以及日益加剧的地缘冲突,金价将在接下来的交易时段创下历史新高,而更重要的心理关口是2000美元/盎司。美元走弱,以及全球央行持续宽松也是看涨黄金的因素之一。虽然市场普遍预期周四凌晨美联储将维持利率不变,但鸽派言论可能导致美元抛售,届时黄金可能跳升至1950美元/盎司甚至更高水平。不过,随着黄金迈向新高,许多交易员也感到忧虑并倾向于止盈。大量卖单可能形成强烈的看跌偏向,并在金价恢复涨势前将其压低至1883-1900美元/盎司。但相对强弱指标RSI并未出现反转信号,意味着多头仍完全主导市场,金价的向下调整幅度不会太深。[2020/7/27]

如果在这一笔以太坊交易内借贷的资金没有得到偿还,那么整笔借贷交易不会被打包进入区块中,相当于借贷并没有实际发生,所以借贷方的资金不会受任何影响——中间的借贷和套利过程只是临时状态,并未被矿工打包确认。基于闪电贷的特性和时效要求,目前其最广泛的应用是套利交易。套利者无需自身使用资产进行套利操作,只需要通过闪电贷获得所需的资金量完成套利交易,并及时偿还借贷的资金。这极大的降低了套利者的准入门槛,因为理论上任何一个人都可以成为套利者,并且拥有没有上限的套利资金进行操作。

从上述流程可以看到,以太坊合约控制权在 FURUCOMBO 闪电合约 - 套利者账户合约 -Uniswap 合约 -Kyperswap 合约 - 闪电贷合约之间切换,且可以进行动态调用相应的函数,如果 DeFi 项目平台合约有漏洞,套利者能够利用其合约的恶意代码调用相应函数进行资产盗取——利用合约之间的状态同步信息差,在一个流程未结束时双花资产(以太坊资产只是赋值),或者重复执行函数(本该不被允许的逻辑)进行盗取。

动态 | eToroX 实验室将对 Libra 编程语言 Move 进行试验:全球多资产交易平台 eToro 旗下加密货币交易所 eToroX 的区块链实验室团队宣布将对 Facebook 区块链 Libra 使用的编程语言 Move 进行试验,使用部署在以太坊区块链上的 eToken 实施,测试代币如何在 Libra 上运行。eToroX 团队表示 Move 类似编程语言 Rust,但 Move 以不同的方式定义资源:Move 不允许移动或复制资源,目的是防止意外重复和丢失;Move 会阻止代表其他用户发布数据,因此用户需要确认所发布的所有内容,使他们能够完全控制选择共享的信息。[2019/6/28]

对于 Move 生态,由于资产并非简单的赋值,且禁止动态调用和可重入,从根本上杜绝了风险,其具体实现我们在后面会阐述。

从实现方式上来看,以太坊 EVM(基于 Solidity)具有动态调度,可以通过可重入实现闪电贷。如我们在上一篇报告《Web3 底层语言:Move 弥补了 Solidity 哪些不足?》中提到的:

「以太坊(Solidity)的资产是由相应的合约控制,如果把 Token A 合约比喻为保险箱,保险箱会给所有用户分配一个数值余额,来表达用户所有拥有的 Token A 资产数量,但资产本身还是放在 Token A 合约的保险箱内。而 Move 用户账户本身就是一个单独的大保险箱,由用户自己控制,所有的 Token 资产都放在这个保险箱内。且这些 Token 并不是以数字的形式存在,而是不可复制的、权限受用户控制的资源(类型)。」

因此以太坊 EVM 实现闪电贷套利的流程是:

用户将调用控制权交给闪电贷合约;

闪电贷合约调用来自外部的套利合约程序中的执行函数,将请求的借款金额发送给套利合约,套利合约进行套利操作;

套利合约完成套利,将借款归还给闪电贷合约,执行函数完成工作,控制权还给闪电贷合约;

闪电贷合约检查还款金额是否正确,正确则套利交易成功,否则失败。

在上面这个过程中,相应的函数是动态调用的,闪电贷合约需要检查归还金额是否正确才会结束,因此控制权的转移过程是随时可以发生的,也就是可重入的——同时需要注意的事,以太坊账户资产是以数值余额的形式存在,重入会带来双花的可能,这也是存在漏洞的地方。调用外部合约的主要危险之一是它们可以接管控制,而这些来自外部的合约程序一旦有漏洞,攻击者可以通过反复调用实现攻击,即可重入攻击。

可重入攻击造就了以太坊历史上最严重攻击之一,直接导致了以太坊分叉,即 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 等其他银行进行抵押贷款(重入),待流程结束,攻击者已经完成闪电贷攻击并获利。

重入攻击的前提攻击者部署的合约存在恶意代码,但最核心的因素是:

「可重入」是实现闪电贷的基础,然而一旦目标合约有漏洞,攻击者便可以实施重入攻击。这在我们前一篇报告中有详述。

Move 语言禁止动态调用和可重入,这从根本上杜绝了重入攻击。但 Move 系统的资产作为资源类型,一旦借出就相当于发生了真实转移,该如何确保闪电贷顺利还款呢?

我们在前一篇报告中已经分析过,账户资产和收据(receipt)都是一种资源类型,「不能复制、丢弃或重用,可以被安全地存储和转移」,因此收据(receipt)必须被处理(且只能使用一次),而非像以太坊那样的对账户进行数值赋予处理就行。因此烫手山芋模式可以确保被借出的资产(资源类型,一旦借出就真实发生转移了)必须被归还。收据(receipt)作为烫手山芋,就好比是定时一个引爆器(这里的定时,是闪电贷套利作为一个原子交易的「时间」,并非具体的时长),资金和引爆器一起绑定被借出,而任何一方都无法收留引爆器,它必须被还回原处得以拆除——否则交易都无法完成,因此闪电贷资金可以确保会被归还。

从应用角度看,Web3 的底层代表要在保证开放性、可重构的基础上提高代码安全性。在 Web3 中,代码不仅包含信息,还直接涉及资产调用,保证用户资产安全是重中之重,否则 Web3 将是黑暗森林。以太坊的生态让大家看到了智能合约的活力,下一个时代将在此基础上向安全性、合规性继续演进,这也是我们当下关注 Web3 底层语言进化的核心逻辑,或者这孕育着下一轮的创新浪潮。

吉时通信

个人专栏

阅读更多

金色财经

金色财经 子木

金色早8点

去中心化金融社区

虎嗅科技

区块律动BlockBeats

CertiK中文社区

深潮TechFlow

念青

Odaily星球日报

标签:MOVMOVE以太坊SOLMOVR价格MOVEY以太坊硬币solana币官网下载app

火币下载热门资讯
NFT:投资NFT在365天亏损2万美元 但为什么我却依然看好 NFT 的未来?

作者 | Michael Hebenstreit编译 | 白泽研究院大约一年前,我开始涉足 NFT 并购买了人生的第一个 NFT.

1900/1/1 0:00:00
NFT:金色早报 | 隐私币今年损失超过60亿美元

▌数据:过去一周Circle USDC流通量减少9亿美元12月25日消息,据官方消息,12月15日至12月22日期间,Circle共发行46亿美元USDC,赎回56亿美元USDC.

1900/1/1 0:00:00
AME:金色观察 | FTX破产冲击波:加密机构与FTX关联情况大全

FTX暴雷大戏暂时到了曲尽人散的时候。北京时间2022年11月11日晚,FTX官方发布声明表示,FTX集团(包括FTX交易所、Alameda在内的大约130家公司)已根据美国破产法第11章开始自.

1900/1/1 0:00:00
CRY:Crypto.com 年终总结与 2023 年展望:SBT将引导我们进入去中心化社会

撰写:Crypto.com Research编译:深潮 TechFlow2022 年对加密行业来说是一段旅程.

1900/1/1 0:00:00
RIN:V神揭示2023年加密行业的3个“巨大”机会

文:BRAYDEN LINDREA太坊联合创始人Vitalik Buterin表示,创新的空间仍然很大.

1900/1/1 0:00:00
SOUL:2022 以太坊大事记

我们挑选了 9 个最值得记录下来的事件与话题,加以梳理与总结,希望能帮助大家在回顾 2022 时带来一些记忆点.

1900/1/1 0:00:00