通过闪电贷攻击讲解什么是闪电贷
闪电贷(Flash Loan)和昨天发生的 Harvest Finance 被黑事件密切相关。
个人声明一下,最近公众号讲了不少关于安全、黑客相关文章。均属于技术分享,不存在任何诱导之说。我们了解黑客是如何行骗的,可以更好地帮助我们防范黑客犯罪。
最近 DeFi 安全事件频发,很多攻击事件都和闪电贷有关。我们先了解一下什么是闪电贷。
闪电贷(Flash Loan)不同于其他形式的借款。一般形式的借款均为抵押贷。例如你在 Compound 平台抵押 ETH 借出 USDT。一般来说你可以借出抵押物的 n%(例如:60%)。还款时,你还出借出物的本金+利息,赎回抵押物。抵押借贷一般借贷时间较长,你可以选择合适的时候进行还款。
而闪电贷在两个方面明显地区别抵押贷款:
无需抵押物
必须在同一个交易(transaction)中进行还款
从借出方而言,闪电贷永远是安全的,因为借出和还款必须同时发生才有效,否则交易失败。
有人肯定要问,既然借出,又必须立即要还,闪电贷还有什么用呢?
如果你用传统的思维考虑问题,闪电贷似乎无用。但是如果你用(全新的)智能合约的思路考虑问题,就不一样了,它大有用处!要知道,闪电贷的要求是在同一笔交易中借出和归还。如果你在一个交易的头部借出闪电贷,在尾部归还闪电贷,那么在交易中部可以做大量的事(调用智能合约使用闪电贷),从而让你的借款获得收益。
我们来看个例子:
有两个去中心化交易所(DEX1 和 DEX2),均有交易对:ETH/A。DEX1 中当前价格是 1 ETH/A,而 DEX2 中价格为 1.1 ETH/A。也就是说两个DEX中同一交易对价格出现了偏差(DEX2 中的A价格高10%)。那么此时你可以:
在 Aave 中借出闪电贷 100 ETH;
在 DEX1 中全部买入 A(为了解释原理,不考虑滑点的问题),得到 100 A;
将 100A 在 DEX2 中卖出,得到 110 ETH;
在 Aave 中偿还闪电贷 100 ETH;
获利 10 ETH 离场。
这是一个典型的用闪电贷获取利润的例子,我们可以看到它的几个典型特点:
空手套白狼,无需成本(ETH交易矿工费除外);
利用了价格差;
可以重复进行。
昨天发生的 Harvest Finance 攻击例子和上面的例子剧本是一样的,只是一些细节不同。以下是慢雾团队梳理的关于本次攻击事件的逻辑:
攻击者通过 Tornado.cash 转入 20ETH 作为后续攻击手续费;
攻击者通过 UniswapV2 闪电贷借出巨额 USDC 与 USDT;
攻击者先通过 Curve 的 exchange_underlying 函数将 USDT 换成 USDC,此时 Curve yUSDC 池中的 investedUnderlyingBalance 将相对应的变小;
随后攻击者通过 Harvest 的 deposit 将巨额 USDC 充值进 Vault 中,充值的同时 Harvest 的 Vault 将铸出 fUSDC。而铸出的数量计算方式如下:amount.mul(totalSupply()).div(underlyingBalanceWithInvestment()); 计算方式中的 underlyingBalanceWithInvestment 一部分取的是 Curve 中的 investedUnderlyingBalance 值,由于 Curve 中 investedUnderlyingBalance 的变化将导致 Vault 铸出更多的 fUSDC。
之后再通过 Curve 把 USDC 换成 USDT 将失衡的价格拉回正常;
最后只需要把 fUSDC 归还给 Vault 即可获得比充值时更多的 USDC;
随后攻击者开始重复此过程持续获利。
可以看到,这几乎是一个教科书式的攻击。和我们前文举的例子主要的不同点在于:
黑客进行事前洗币,这是一个有预谋的攻击;
从 Uniswap 借出闪电贷,而不是 Aave;
通过在 Curve 中将巨额 USDT 卖成 USDC,主动制造价格差。
现在,你似乎已经感觉到,所谓黑客,就是找现有程序漏洞,或者主动制造出漏洞。然后攻击该漏洞,从而获利。
闪电贷的攻击在此之前发生的也不止一次了。bZx 此前就发生了至少三起攻击事件。我们看其中一起来加深一下对于闪电贷攻击的印象:
黑客用闪电贷借出巨量 ETH;
用借来的 ETH 全额买入 sUSD,因为买量巨大,以至于 kyber 中的 sUSD 价格翻了一番;
bZx 此时认为 sUSD 价格翻了一番(这是 bZx 协议bug所在)。此时黑客在 bZx 用买来的 sUSD 抵押贷款借出 ETH。因为 bZx 认为 sUSD 当前价格很高,所以借出了比正常 ETH 两倍的 ETH;
黑客用借出的 ETH 偿还了闪电贷借出的 ETH,拿着剩余大量 ETH,逃之夭夭。
哈,多么清晰的攻击!以上的所有例子都利用了同一弱点,价格差。尽管,现在很多 DeFi 协议都使用了相对强壮的 oracle 来管理价格,但是价格差一直都存在。
以上的例子都是通过闪电贷进行黑客攻击,不当牟利。但是,闪电贷也可以被用来正当获利。只要有价格差,就有闪电贷获利的空间。闪电贷也是 DeFi 区别于传统金融最神奇的地方之一,它让智能合约散发出这个时代最耀眼的光芒。
转自公众号”谈谈区块链“ 链接:https://mp.weixin.qq.com/s/Rpmzags-VCeHy9VPwK2EUA
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!