概述
2023年4月13日,YearnFinance遭到黑客攻击,导致大约损失1000万美元。本文将分析攻击过程以及漏洞产生的原因。
攻击分析
这是一笔攻击交易:
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:
Yearn创始人Andre Cronje推出新产品Fixed Forex:7月2日,Yearn创始人Andre Cronje发文介绍其新产品Fixed Forex(固定外汇)。文中提到,Fixed Forex 旨在成为一个不可变、0 费用、0 治理、去中心化的稳定币框架。LTV(贷款价值比)源自 Compound、Aave v1、Aave v2 和 Iron Bank。随着这些系统添加或更新其接受的抵押品,Fixed Forex也会动态更新。铸币上限(用户可以根据给定的抵押品铸币多少流动性)来自可用的链上流动性,链上流动性越高,铸币上限就越高。该产品无代币,审计尚未完成,智能合约是实验性的。外汇种类包括美元、欧元、日元、人民币等。[2021/7/2 0:23:36]
接下来,攻击者将800,000USDT转移到了攻击合约0x9fcc1409b56cf235d9cdbbb86b6ad5089fa0eb0f中。在该合约中,攻击者多次调用了Aave:LendingPoolV1的repay函数,帮助其他人偿还债务,以使Aave的APR等于0:
攻击者调用了yUSDT的deposit函数,抵押了900,000USDT,并获得了820,000yUSDT:
yearn.finance推出Yearn Partners计划:3月8日,yearn.finance (YFI)官方发布项目周报。根据周报,yearn.finance宣布推出Yearn Partners计划。参与该计划的DeFi协议将可获得Yearn产品代币锁定产生的部分收益。官方表示,yearn.finance不会审核参与参与该计划协议的代码,协议安全仍依赖协议开发团队,但使用yearn.finance用户界面和合约,则官方将监督合约安全。[2021/3/8 18:24:05]
接下来,攻击者调用了bZxiUSDC的mint函数,使用156,000USDC铸造了152,000bZxiUSDC,并将其转移到了YearnyUSDT:
攻击者调用Yearn:yUSDT的withdraw函数,将820,000yUSDT兑换成1,030,000USDT。此时,合约中只剩下攻击者转移的bZxiUSDC:
Cover开启投票是否对Yearn漏洞提供保险:2月5日,Cover社区决定yearn漏洞是否有效的Snapchat投票已经上线,用户可以使用COVER和COVER-ETH UNI-LP代币参与投票。投票将持续3天。此前消息,yearn v1 yDAI vault今日遭受攻击,损失了1100万美元。[2021/2/5 18:57:57]
接下来攻击者调用Yearn:yUSDT的rebalance函数,销毁bZxiUSDC:
然后攻击者向yUSDT合约转移了1/e6个USDT,并调用了deposit函数,抵押了10,000USDT,获得了1,252,660,242,850,000yUSDT:
然后在Curve上,攻击者将70,000yUSDT兑换成5,990,000yDAI,将4亿yUSDT兑换成4,490,000yUSDC,将1,240,133,244,352,200yUSDT兑换成1,360,000yTUSD:
yearn.finance取消yVault提款费:yearn.finance通过YIP-51提案,取消yVault提款费,并将费用结构调整为2%的管理费和20%的利润绩效费。YIP-51提案将会对于v2 yVault产生直接影响,而目前v1 yVault尚未进行费用结构修改,仍需要支付0.5%的提款费。[2020/11/11 12:16:44]
然后在yearn:yDAI和yearn:yUSDC中分别调用withdraw,提取678万个DAI和562w万个USDC,并归还闪电贷:
漏洞分析
这次攻击中最关键的一点,是攻击者使用100,000USDT铸造了1,252,660,242,850,000个yUSDT。查看deposit函数的实现:
可以看到share的数量和变量pool相关,pool越小,share越大,而pool的值由_calcPoolValueInToken获得:
动态 | 区块链公司Chain 与 Lightyear 合并:据ethnews消息,区块链公司Chain与Lightyear合并,成立了新的区块链公司Interstellar。[2018/9/11]
攻击者在调用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
波场黑客松大赛第四季正在火热进行中,获胜者将有机会享受诸多重磅福利,包括优先在Huobi上线、通过TRON拥抱顶级交易所、丰富的行业合作伙伴资源、TRONDAOVentures和HuobiVen.
据官方消息,波场TRON已与Arkham建立合作伙伴关系。波场TRON将被添加至Arkham平台,用户将能够通过Arkham检查波场生态系统中钱包和实体的活动.
波场TRON月报新鲜出炉,一起来看看3月波场TRON都有哪些亮眼表现吧。 一、核心数据 1、新增账户数:5,328,4652、TVL最高值:$12,199,014,407波场TRON用户数突破6.
3月1日,ETHDenver2023在美国科罗拉多州如火如荼进行中。波场TRON团队受邀参与此次会议,并与现场人员进行充分互动,留下诸多精彩瞬间.
去中心化存储,是近年来Web3发展的关注热点之一。去中心化存储以安全、可靠和反审查的方式实现对数据的存储和管理,这可能彻底改变各种行业和应用程序的运作方式.
前几天看到一篇文章里说到了曾经风光无限的几个蓝筹PFPNFT在这轮熊市中跌跌不休,有的价格甚至跌了99%,这让前两年刚入场的很多新韭菜们心头在流血.