3月13日,Ethereum 链上项目 Euler Finance遭到闪电贷攻击,攻击者已获利近2亿美元。
SharkTeam对此事件第一时间进行了技术分析,并总结了安全防范手段,希望后续项目可以引以为戒,共筑区块链行业的安全防线。
一、事件分析
(相关资料图)
攻击者地址:
0x5F259D0b76665c337c6104145894F4D1D2758B8c(MEV Bot)
0xB2698C2D99aD2c302a95A8DB26B08D17a77cedd4
0xb66cd966670d962C227B3EABA30a872DbFb995db
攻击者合约:
0xeBC29199C817Dc47BA12E3F86102564D640CBf99(tx: 0xc310a0af)
0x036cec1a199234fC02f72d29e596a09440825f1C
攻击交易:
0xc310a0affe2169d1f6feec1c63dbc7f7c62a887fa48795d327d4d2da2d6b111d
0x71a908be0bef6174bccc3d493becdfd28395d78898e355d451cb52f7bac38617
0x62bd3d31a7b75c098ccf28bc4d4af8c4a191b4b9e451fab4232258079e8b18c4
0x465a6780145f1efe3ab52f94c006065575712d2003d83d85481f3d110ed131d9
0x3097830e9921e4063d334acb82f6a79374f76f0b1a8f857e89b89bc58df1f311
0x47ac3527d02e6b9631c77fad1cdee7bfa77a8a7bfd4880dccbda5146ace4088f
攻击流程:
本次事件有多次攻击交易,这些交易都利用了同一个合约漏洞进行攻击。对此,我们选择其中一个池交易。接下来会对攻击者合约(0x036cec1a),攻击交易(0x71a908be)进行分析攻击流程。
(1)首先,攻击者(0xB2698C2D)从AAVE借了3,000枚WBTC用于准备接下来的攻击。同时,攻击者部署了两个合约:被清算者(0xB324581E)和清算者(0xD041709e)。
(2)攻击者(0xB2698C2D)向Euler存入所借的2/3(2,000枚)WBTC,获得约1,975枚eWBTC。
(3)攻击者(0xB2698C2D)通过mint函数进行10倍借款存入被清算者(0xB324581E)地址中。此时,该地址从Euler中获得19,753 eWBTC和0.000002 dWBTC(此处涉及dToken的精度问题,可以视为价值为20,000枚eWBTC,WBTC是8位精度,dWBTC对外通用18位精度,实际是27位精度)。此时,该地址总计有21,728 eWBTC和0.000002 dWBTC。
(4)攻击者(0xB2698C2D)使用repay函数将借款剩下的1/3(1,000枚)WBTC偿还Euler的部分债务。攻击者向Euler发送1,000枚WBTC,并且销毁0.0000001 dWBTC。此时,该地址总计有20,728 eWBTC和0.000001 dWBTC。
(5)攻击者(0xB2698C2D)重复步骤3的mint方式,(0xB324581E)地址中再次从Euler中获得19,753 eWBTC和0.000002 dWBTC。此时,该地址总计有40,481 eWBTC和0.0000039 dWBTC。eWBTC价值大于dWBTC,在健康值范围内。
(6)攻击者(0xB2698C2D)利用donateToReserves函数进行捐赠被清算者(0xB324581E)地址中的10,000枚eWBTC。此时,该地址总计有30,481 eWBTC和0.0000039 dWBTC。eWBTC价值小于dWBTC,不在健康值范围内。
(7)清算者(0xD041709e)调用liquidate函数清算0xB324581E地址,并且从被清算者(0xB324581E)地址中获得约3,849枚WBTC。
(8)攻击者(0xB2698C2D)提取3,849枚WBTC,归还闪电贷。剩余849枚WBTC通过[Uniswap V3: WBTC].swap兑换了11,559枚以太币。
漏洞分析:
(1)在抵押借贷协议中,涉及资产凭证代币转账都需要检查健康因子,保证协议不会出现坏账。在Euler合约中,负责检查健康因子的函数是checkLiquidity。
(2)在mint、transferFrom函数中都有对健康因子进行检查,但是在donateToReserves函数中,没有对健康因子进行检查。如果正常坏账,资金最终也是流向Euler。但是,结合闪电贷借款时创建两个合约和两次mint,并且捐献自己的资产凭证给Euler这些操作来看。在攻击者资不抵债时,既是被清算者也是清算者,即自己清算自己。
事件总结:本次事件涉及多个攻击交易,每个交易涉及不同的池。但是,根本原因是项目方添加donateToReserves业务逻辑函数时,没有详细去考虑业务逻辑严谨性。导致添加逻辑函数后,多种业务逻辑交织,出现业务逻辑校验漏洞。
二、安全建议
针对本次事件,我们在开发智能合约时应当注意以下事项:
(1)添加新的业务逻辑功能时,应考虑整个业务逻辑的严谨性;
(2)项目上线前,需要向第三方专业的审计团队寻求技术帮助。
About Us
SharkTeam的愿景是全面保护Web3世界的安全。团队由来自世界各地的经验丰富的安全专业人士和高级研究人员组成,精通区块链和智能合约的底层理论,提供包括智能合约审计、链上分析、应急响应等服务。已与区块链生态系统各个领域的关键参与者,如Polkadot、Moonbeam、polygon、OKC、Huobi Global、imToken、ChainIDE等建立长期合作关系。
Twitter:https://twitter.com/sharkteamorg
Discord:https://discord.gg/jGH9xXCjDZ
Telegram:https://t.me/sharkteamorg
更多区块链安全咨询与分析,点击下方链接查看
D查查|链上风险核查https://app.chainaegis.com
关键词: