在开始看这篇文章之前我们可以先回顾一下之前一篇介绍流动池和LP的文章《DeFi基础知识普及:你了解LP流动池与Token逻辑吗?》
在对DeFi中被盗的经典案例做剖析之前,需要了解一个在传统金融和区块链中都出现过但又很陌生的名词—闪电贷。
在传统金融中闪电贷可以简单的被理解为无抵押贷款,即出借方授予用户一笔无需任何抵押的贷款,根据用户的过往偿还能力和信誉水平做评估,用户只需按照约定还款即可消除贷款记录。
在区块链中的闪电贷,则是指在某些协议中如:aave、uniswap中,项目方允许用户无代价的借出一笔大金额的Token。
但是为了保证用户归还Token,闪电贷借出的Token必须在一次交易内偿还,否则区块将会发生回滚,即贷款不会发生。
当然,使用闪电贷也并不是零成本的,每个协议规定了成功使用闪电贷的用户在归还资金时需要支付一定的手续费,即使是最终闪电贷失败回滚,那么调用和部署智能合约也需要付出一定的费用。
而区块链网络中闪电贷一般用来做三种用途:
套利以维持各流动池的资金平衡稳定、更换抵押物使资产更具灵活性、自我清算保护自身利益。
value项目被盗剖析
Value项目被盗是DeFi被盗项目中的经典案例,其使用的的正是闪电贷攻击的手法。
攻击者首先从aave协议中通过闪电贷借出了一笔巨额的eth Token,进一步转移到uniswap协议后,在uniswap协议中通过闪电贷再借出一笔巨额的DAI Token。
同时,aave协议中同样也是通过闪电贷借出eth Token,在uniswap中全部兑换成usdt Token。那么此时黑客手中就拥有了巨额的DAI和usdt两种Token。
将攻击所需的Token准备好之后,黑客将手上的一部分DAI Token存入被盗项目的流动池中,获取了这个流动池的pooltoken。此时流动池的价格和Token比例是正常的。
接着攻击者就会将手上剩余的巨额Token DAI在DAI/USDC/USDT流动池中进行兑换,兑换出巨额的USDC。
由于有恒等流动性做市商的存在,此时流动池中的USDC的价格已经偏离正常值,有了显著的升高,这时攻击者又将usdt在流动池中兑换成了USDC,进一步推高了流动池中USDC的价格。
此时由于pooltoken的数量是在黑客攻击前铸造和生成的,当池子中的USDC价值显著增加时,或者说流动池中的DAI Token数量变多了时。
每个pooltoken可以换出来的DAI Token数量将显著增加,变相的增加了pooltoken所对应的价值。
当黑客实现了他的目的,即通过攻击获取远高于正常价值水平的pooltoken后,将之前在流动池兑换出来的USDC按照原比例又兑换成了DAI和usdt还了回去。
此时,流动池中的Token比例恢复到正常水平,黑客此时手中拥有的是巨额的DAI和usdt两种Token以及远超正常价值的pooltoken。
这个时候,黑客将手中的pooltoken在流动池中进行兑换,由于这些pooltoken的价值远高于正常价格,所以黑客可以兑换出远超其存入数量的DAI Token。
所以超出其存入数量的这部分DAI就是被黑客所窃取的资产。
最后黑客将部分DAI Token在uniswap中进行闪电贷的偿还,同时将手中的usdt在uniswap进行兑换。
换成了eth Token后再偿还aave协议中的eth Token闪电贷,此时黑客完成了一次完整攻击,近零成本的窃取了大量的DAI Token。
闪电贷原本是用于套利、变更抵押物、自我清算的一种工具,而黑客利用了其中几乎零成本且金额巨大的特性,短时间的操纵了流动池中的Token价值,从而窃取资产。
操纵预言机使得pooltoken价值大幅度增加,再通过闪电贷扩大其交易和操纵规模,这就是黑客盗取value项目资金的核心手段。
Akropolis项目被盗剖析
DeFi项目被盗事件中,除了通过操纵预言机显示Token的盗取,还有一种常见的方法是通过重入攻击来攻击有缺陷的智能合约,使得流动池中的Token在攻击下被重复提取,从而造成项目资产的损失。
如图所示,黑客利用通过一个简单的重入攻击同时配合闪电贷的攻击模式窃取了akropolis项目的资产。
黑客首先调用了协议中的deposit函数,这个函数调用将会捕获计算存入的Token差值,从而铸造pooltoken。
由于deposit函数要捕获计算Token的数量,将会调用目标Token函数,而黑客在目标Token函数中嵌入恶意Token函数,再次调用deposit函数。
在这里一共调用了两次deposit的Token存入函数,重入攻击也由此得名。
在第二次deposit函数调用中,黑客正常存入了Token获取对应的pooltoken,此时第一次的deposit函数在执行中也会认为黑客正常存入了Token,因此生成了相应的pooltoken。
所以,黑客仅通过一次存入就能够获得双倍的pooltoken,在攻击中黑客依然使用了闪电贷,使得正常存入的金额变得巨大,从而放大了在攻击中所获得的资产数量。
黑客们使用的重入攻击的手法不仅在akropolis项目中盗取了大量的资产,同时也利用同样的手法让uniswap、lendf.me等著名项目遭受了资产损失。
Balancer项目被盗剖析
预言机操控和重入攻击是黑客们对DeFi项目进行攻击的常见手段,而许多DeFi项目的智能合约本身就存在着许多漏洞,这也给了许多聪明的黑客可趁之机。
在Balancer项目的被盗过程中,黑客通过利用Token的通缩机制,以项目智能合约的漏洞结合闪电贷,对Balancer项目完成了攻击。
如图所示,黑客首先是从闪电贷网络中借出了巨额的WETH Token,这个金额大到几乎可以将WETH/STA这个流动池中的STA提空。
再将流动池中的STA提取至仅剩STA Token通缩销毁机制销毁量的最小值。黑客向流动池中发送了等于这个最小值数量的STA Token,成功兑换出流动池中一半的资产。
但实际上由于STA Token的通缩销毁机制,流动池已经将这笔收到的STA Token进行了销毁,流动池的STA Token并没有增加。
此时再调用函数对STA的余额进行修正,使得STA Token接收和发送记录中所剩余的STA Token的数量等于流动池中的实际数量。
经过修正后,合约中的STA Token依然还是最小值,黑客再使用相同的手法又将流动池中剩余的Token提走一半。
经过多次重复攻击,流动池中的WETH很快被提空,黑客归还了闪电贷之后,将从流动池中盗取的WETH转移,完成了本次攻击。
本次黑客利用了智能项目智能合约的漏洞进行了攻击,如果这些功能不是形成组合的话,各自的存在并没有任何隐患,但是聪明的黑客在这中间找到了串联点并巧妙利用。
当然了,被盗事件的发生不单是因为合约安全问题和黑客攻击,也有可能是项目方的监守自盗。
希望通过这三个被盗事件的分析,可以让大家对区块链中的DeFi世界有一个更深层次的理解!