Move语言分析:如何避免电击信贷攻击?
日期:2023年04月15日 13:55 浏览量:1
原文: Shuming hao123 @ QQ.com
作者:宋嘉吉,任鹤义[ xy 002 ] [ xy 001 ]摘要:上一篇报告从基础语言特点谈起比较了Move和Solidity (以太网)的优势和特点。 作为Web3的基础性研究,本文从电击贷这一最具特色的应用角度分析了以太网和Move分别如何实现电击贷,Move是如何避免电击信贷攻击的?
以太网协议之间的交互,通过消息交换实现的状态一致,允许重入、动态调用,这为实现闪存信用提供了基础。 期间中选择所需的族。 合同之间的函数在——调用期间会发生控制权转移。 如果DeFi项目平台合同存在漏洞,仲裁器可以利用合同的恶意代码调用相应的函数进行资产窃取。 ——使用合同之间的状态同步信息差异、在一个流程未完成时重复执行双花资产(以太资产只是赋值)或函数(应该不允许的逻辑)进行窃取。
重做攻击的前提是攻击者引入的合同中存在恶意代码,但最核心的因素是
调用以太网协议时控制权有转移,这是一种为恶意协议提供了主导权的
,可以在进程结束之前重新输入(重复调用),恶意合同可以利用漏洞重复调用函数实现资产盗刷(如取款流程未结束时多次重复提取); 除了
之外,以太坊的账户资产还以数值余额的形式存在,因此有可能反复窃取资产(双花)或者,在流程结束前恶意合同可以修改并窃取相关账户的资产余额数值。
Move提出了电击信贷的新执行流程——烫手山芋模式,从根本上放弃了可以再投入的东西。 “烫染”模式是一种无密钥、存储、复制和复制功能的结构,其中Move进程在事务执行过程中只使用一次。 因为没有drop、key或store的能力,所以热刺只能调用“放弃”函数来完成进程——。 顾名思义,这是一个烫手山芋,流程中的任何措施都是“烫手山芋”,只能交给销毁函数处理。 具体流程如下。
智能合约在工作中制作“烫染”(hot-potato )收据(receipt )。
套利为电击信贷合同融资时、电击贷合同中融资资金和烫手山芋收据(receipt );
套利者利用贷款资金进行套利操作;
在偿还仲裁时调用偿还函数(repay ),将资金和收据(receipt )发送到偿还函数,收据被偿还函数接收并丢弃。
电击贷完成前提下的最后正确还款,流程结束,在流程结束前恶意合同可以通过以太网系统实现重复调用,修改相应的资产账户分配实现窃取。 在Move系统电击贷流程结束的前提下,除了正确返还资金外,还需要对烫染这一资源进行一次性回收处置这确保了电击信贷的原子性。
风险提示:区块链商业模式落地不及预期; 监管政策的不确定性。
1.核心观点
电击贷作为以太体DeFi生态最具特色的应用,其基础是以太体使用的Solidity语言允许动态调用和重新输入。 这种动态调用是智能合约开放性、可组合性的重要体现,但由此带来的控制权转移和对合同函数的重复调用带来了不少安全隐患,行业内发生了利用电击信贷攻击存在漏洞的DeFi资金池的事件。 由于Move语言不允许动态调用和重新输入,因此可以使用“烫手山芋”模式轻松执行闪存信用,从而完全避免以太网之类的安全问题。
两种系统在生态APP模式上存在明显差异,这种差异的根本在于Move的基础语言特征。 在上一份报告《Web3 底层语言:Move 弥补了 Solidity 哪些不足?》中进行了详细叙述。 本报告试从电击贷应用的角度,比较两者实现应用的不同玩法。
2.以太网闪信用基础:动态呼叫和可重入
闪信用Flash Loan是本机DeFi的新产物可以理解为极速贷款。 由于用户在同一交易(区块)下完成贷款、套期保值、还款,只需支付手续费,为原子交易,借款人无需抵押资产即可实现贷款,提供了无本金的套期保值方案。
上一份报告《Web3 底层语言:Move 弥补了 Solidity 哪些不足?》中提到:“关于模块化和合同的组合以太网等Solidity上的Contract合同通过library (相当于静态库)进行消息的传递,实现Contract合同之间的调用、对话。 Move语言使用模块(module )和脚本(script )的设计,前者类似于Contract合同,Move语言的合同组合性是模块之间的组合,传递资源(上述资源)。 关于组合性,索力和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达迪的利润。
如果在此以太体交易内借出的资金没有偿还,则整个借贷交易不会打包成区块,相当于实际上没有发生借贷没有被矿工打包确认。 基于电击贷的特性和时效要求,目前其最广泛的应用是套期保值交易。 套利者无需自行使用资产进行套利操作,只需通过电击贷款获得所需资金量完成套利交易,及时偿还所借资金即可。 这大大降低了套利者的准入门槛。 因为理论上谁都可以成为套利者,持有无上限的套利资金进行操作。
从上述流程可以看出以太网协议的控制权可以在富科宝闪电协议-仲裁客户协议-Uniswap协议-Kyperswap协议-电击贷协议之间切换,动态调用相应的函数、DeFi项目平台合同存在漏洞时,仲裁器可以利用该合同的恶意代码调用相应的函数进行资产窃取。 ——利用合同间状态同步信息的差异,在一个流程未完成时双重使用资产。 (以太资产只是赋值) )。、或函数(应该不允许的逻辑)重复执行来窃取。 在
move生态中,资产不是简单的分配,因为禁止动态调用和重新装入,所以风险从根本上为零。 其具体实现将在后面叙述。
3. Move和Solidity电击贷的具体实现有什么区别?
3.1 .以太体电击贷双刃剑:动态呼叫与可重入性
从实现方式看以太网EVM (基于solidity )具有动态调度,可以实现可复用的闪光信用。 如上一份报告《Web3 底层语言:Move 弥补了 Solidity 哪些不足?》所述
[ xy001 ]“以太网(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等其他银行进行抵押贷款(再入金),直到流程结束,攻击者完成电击贷攻击并获利
再入攻击前提攻击者引入的合同中存在恶意代码,但最核心的因素是调用
以太网合同时控制权转移,这为恶意合同提供了主导权。 xy 002 xy 001允许在进程结束之前重新输入(重复调用),恶意合同可以利用漏洞重复调用函数实现资产盗刷(如取款流程未结束时多次重复提取); 除了
之外,以太坊的账户资产还以数值余额的形式存在,因此有可能反复窃取资产(双花)或者,在流程结束前恶意合同可以修改并窃取相关账户的资产余额数值。
“可再入”是实现电击贷的基础,但如果目标合同存在漏洞,攻击者可以实施再入攻击。 这在上次的报告中详细说明了。
3.2.MOVE的“烫手山芋”:无重入的闪付
Move语言禁止动态调用和可重入,从根本上杜绝了重入攻击。 但Move系统的资产作为资源类型,一旦出租就相当于发生了实际转移如何确保电击贷的顺利还款?
Move提出了电击信贷的新执行流程——烫手山芋模式,从根本上放弃了可以再投入的东西。 “烫染”模式是一种无密钥、存储、复制和复制功能的结构,其中Move进程在事务执行过程中只使用一次。 因为没有drop、key或store功能,所以热插拔只能调用“放弃”函数来完成进程——。 顾名思义,这是一个烫手山芋,流程中的任何措施都是“烫手山芋”,只能交给销毁函数处理。 具体流程如下。
智能合约在工作中制作“烫染”(hot-potato )收据(receipt )。
套利为电击信贷合同融资时、电击贷合同中融资资金和烫手山芋收据(receipt );
套利者利用贷款资金进行套利操作;
在偿还仲裁时调用偿还函数(repay ),将资金和收据(receipt )发送到偿还函数,收据被偿还函数接收并丢弃。
正如上一份报告中所分析的,帐户资产和收据(receipt )都是资源类型,不能复制、处置或重用,可以安全保存并转移”,所以必须处理收据(receipt ),而不是像以太网一样对账户赋予数值进行处理。 因此,在烫手山芋模式下,出借的资产(借给你一次后实际上已经转移了)必须归还。 小票(receipt )作为一个烫手山芋,就像一个带有计时器的起爆器,资金随起爆器被借出(这里的计时器是电击贷对冲作为原子交易的“时间”,而不是具体时间)。另一方面,由于任何一方都不能容纳起爆器,必须恢复原状并撤除——才能完成交易,因此电击贷款资金将被可靠地返还。
电击贷完成前提下的最后一次正确还款,流程结束,流程结束前恶意合同可以通过以太网系统实现重复调用,修改相应的资产账户分配实现盗刷。 Move系统电击信贷流程结束的前提是,除了正确返还资金外,需要对烫染这一资源进行一次性回收销毁处理,确保了电击信贷的原子性。
从应用的角度看,Web3的基础代表在保证开放性、可重构性的前提下提高代码的安全性。 在Web3中,代码不仅包含信息,还包含资产调用,保证用户资产的安全很重要。 否则,Web3将成为黑暗森林。 以太坊的生态展现出智能契约的活力,下一个时代将在此基础上继续向安全、合规的方向发展,这也是我们现在关注Web3基础语言进化的核心逻辑,或者说这催生了下一次创新浪潮。
推荐阅读
-
黑色的招商信用卡(黑色的招商信用卡图片)
2023-04-15
但是,由于银行a与其他银行之间的信息不同步(合同函数之间的状态不同步),攻击者在被攻击a银行尚未完成资产入库登记时(即合...
-
万达期货官网(万达期货官网客服电话)
2023-04-15
但是,由于银行a与其他银行之间的信息不同步(合同函数之间的状态不同步),攻击者在被攻击a银行尚未完成资产入库登记时(即合...
-
建行港币兑换人民币(建行港币兑换人民币流程)
2023-04-15
但是,由于银行a与其他银行之间的信息不同步(合同函数之间的状态不同步),攻击者在被攻击a银行尚未完成资产入库登记时(即合...
-
九欧是多少人民币(9欧元等于多少英镑)
2023-04-15
但是,由于银行a与其他银行之间的信息不同步(合同函数之间的状态不同步),攻击者在被攻击a银行尚未完成资产入库登记时(即合...
-
临沂做期货去哪(临沂做期货去哪做)
2023-04-15
但是,由于银行a与其他银行之间的信息不同步(合同函数之间的状态不同步),攻击者在被攻击a银行尚未完成资产入库登记时(即合...
-
目前中国黄金价格(目前中国黄金价格走势图)
2023-04-15
但是,由于银行a与其他银行之间的信息不同步(合同函数之间的状态不同步),攻击者在被攻击a银行尚未完成资产入库登记时(即合...