业务逻辑漏洞+闪电贷攻击:Euler Finance被攻击事件分析
作者: 日期:2023年03月17日 阅:1,619

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业务逻辑函数时,没有详细去考虑业务逻辑严谨性。导致添加逻辑函数后,多种业务逻辑交织,出现业务逻辑校验漏洞。

二、安全建议

针对本次事件,我们在开发智能合约时应当注意以下事项:

  • 添加新的业务逻辑功能时,应考虑整个业务逻辑的严谨性;

(2)项目上线前,需要向第三方专业的审计团队寻求技术帮助。

申明:本文系厂商投稿收录,所涉观点不代表安全牛立场!


相关文章