USD:Yearn Finance攻击事件分析

https://etherscan.io/tx/0xd55e43c1602b28d4fd4667ee445d570c8f298f5401cf04e62ec329759ecda95d

攻击者从Balancer发起了闪电贷,借了?500?万DAI、?500?万USDC和?200?万USDT:

然后在Curve上,攻击者将?500?万DAI兑换成了?695,?000USDT,并将?350?万USDC兑换成?151USDT:

攻击者调用IEarnAPRWithPool的recommend函数来检查当前的APR。此时,只有Aave的APR不等于?0?:

接下来,攻击者将?800,?000USDT转移到了攻击合约0x9fcc1409b56cf235d9cdbbb86b6ad5089fa0eb0f中。在该合约中,攻击者多次调用了?Aave:LendingPoolV1的repay函数,帮助其他人偿还债务,以使Aave的APR等于?0?:

Yearn将发起提案以暂时延长多重签名的授权时间:Yearn.Finance官方刚刚发推称,即将在治理论坛上讨论新的潜在YIP,以暂时将Multisig(多重签名)的授权延长3个月。据悉,现有的授权将于2月24日到期。[2021/2/16 19:51:37]

攻击者调用了yUSDT的deposit函数,抵押了?900,?000USDT,并获得了?820,?000yUSDT:

接下来,攻击者调用了?bZxiUSDC?的mint函数,使用?156,?000USDC?铸造了?152,?000bZxiUSDC,并将其转移到了YearnyUSDT:

攻击者调用Yearn:yUSDT?的withdraw函数,将?820,?000yUSDT兑换成?1,?030,?000USDT。此时,合约中只剩下攻击者转移的bZxiUSDC:

Yearn.Finance创始人:YFI合理估值应是3美元:著名加密货币研究者、Uncommon Core主持人Hasu最近在博客节目中采访了Yearn.Finance创始人Andre Cronje。Hasu提问道:“我听你说,YFI 代币实际价值为零。零只是起始价格,你不理解为什么会有人拿钱买。”Cronje回应称:“所以技术上讲,我基于奖励和交易费用对YFI代币价值的估算是三美元。我没和任何人讨论过这个问题,因为不想有投机行为。YFI代币应该有实际用处。可惜系统首次分发代币后,就和投机有了联系。我对后续的分发没什么不满,只是觉得有点过头。”[2020/8/31]

接下来攻击者调用Yearn:yUSDT的rebalance函数,销毁bZxiUSDC:

然后攻击者向yUSDT合约转移了1/e?6个USDT,并调用了deposit函数,抵押了?10,?000USDT,获得了?1,?252,?660,?242,?850,?000yUSDT:

yearn.finance:有关同意yVaults参与治理的投票人数已达目标:yearn.finance官方刚刚发推文称,在关于是否允许yVaults参与治理的投票中,同意的人数已达成目标。假设这些支持的投票能一直维持到8月31日,那么提案将获得通过,yVaults将被允许参与治理。[2020/8/25]

然后在Curve上,攻击者将?70,?000yUSDT兑换成?5,?990,?000yDAI,将?4?亿yUSDT兑换成?4,?490,?000yUSDC,将?1,?240,?133,?244,?352,?200yUSDT?兑换成?1,?360,?000yTUSD:

然后在yearn:yDAI和yearn:yUSDC中分别调用withdraw,提取678?万个DAI和?562?w?万个USDC,并归还闪电贷:

Yearn创始人:最近的审计意味着Yearn项目并非100%安全:金色财经报道,Yearn.Finance创始人Andre Cronje最近公开了该项目的安全审计。他解释称,之所以此前未公布这些几个月前完成的审计,是为了不让用户产生错误的安全感。据悉,Cronje昨日在该项目的GitHub存储库上发布了五项审计,于2月至7月之间由Certik和等主要审计机构执行。其中已发现的某些漏洞被归类为“严重”。如Certik识别出一个重大漏洞,在相当普遍的情况下,该漏洞可能会暂时阻止用户提取所有资金。对此,Cronje解释说,尽管这是设计选择,但仍然是一个漏洞,如果用户放贷,借入的资产会多于可收回的流动性。此外,他表示,其他主要的DeFi项目(例如Compound和Aave)同样也存在这项漏洞。[2020/8/21]

漏洞分析

这次攻击中最关键的一点,是攻击者使用?100,?000USDT铸造了1,?252,?660,?242,?850,?000个yUSDT。查看deposit函数的实现:

可以看到share的数量和变量pool相关,pool越小,share越大,而pool的值由_calcPoolValueInToken获得:

攻击者在调用rebalance函数后,合约中只存在了USDC,但是_balance()获取的是USDT的余额,USDC的余额并不计入其中,因此此时的pool为1?:

这里显然是项目方的配置错误,yUSDT合约中应当都是USDT类的代币,但是其fulcrum变量却是USDC相关的bZxIUSDC代币,因此yUSDT中的USDC不计入balance中:

攻击者为什么能调用rebalance函数来burn掉bZxiUSDC代币呢?查看rebalance函数的实现:

可以看到在_withdrawFulcrum()中会存在redeem和burn操作,因此我们需要让"newProvider!=provider"成立,?其中recommend()的实现:

攻击者通过控制IIEarnManager(apr).recommend(token)的返回值,使其为都为0来操控newProvider:

如何让其都为0呢,该函数的返回值和计算出的各个DeFi中的APR相关,由于Compound,bZx,dydx中没有池子,因此只需要控制Aave(Aave:LendingPoolCoreV1)即可:

要使其值返回为0,需要让apr.calculateInterestRates函数的第一个返回值为0:

即让currentLiquidityRate为0,该值和_totalBorrowsStable、_totalBorrowsVariable相关,当这两个个值都为0时,currentLiquidityRate为0?:

_totalBorrowsVariable为0,即Aave:LendingPoolCoreV1此时没有人存在债务,为了达成这个条件,攻击者将池中所有人的债务进行了repay:

最后,攻击者让_totalBorrowsVariable变为?0?,所以它能够调用rebalance函数burn掉bZxiUSDC代币:

总结

此次Yearn攻击事件的根本原因是项目方的配置错误。攻击者通过一系列精妙的手法利用了该漏洞,最终获利大约?1000?万美元。

关于我们

AtEoceneResearch,weprovidetheinsightsofintentionsandsecuritybehindeverythingyouknowordon'tknowofblockchain,andempowereveryindividualandorganizationtoanswercomplexquestionswehadn'tevendreamedofbackthen.

了解更多:Website|Medium|Twitter

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

金星链

[0:0ms0-1:730ms