[color=rgba(0, 0, 0, 0.847)]根据Numen链上监控显示,Mar-13-2023 08:56:35 AM +UTC,Euler Finance 项目因为Etoken中的donateToReserves函数缺少流动性检查而遭到闪电贷攻击。黑客通过不同币种多次调用完成获利,本次攻击共计损失1.97亿美元,金额巨大,涉及6种代币。当前,资金还存留在黑客的账户中。
黑客地址:https://etherscan.io/address/0xb66cd966670d962c227b3eaba30a872dbfb995db
黑客合约:https://etherscan.io/address/0x036cec1a199234fc02f72d29e596a09440825f1c
攻击交易(其中一笔): https://etherscan.io/tx/0xc310a0affe2169d1f6feec1c63dbc7f7c62a887fa48795d327d4d2da2d6b111d

详细分析
[color=rgba(0, 0, 0, 0.847)]1.黑客先从Aave闪电贷借了3000W个Dai后部署了两个合约,一个是借贷合约,一个是清算合约。

[color=rgba(0, 0, 0, 0.847)]2.调用deposit函数将借来的Dai其中的20 M个质押到 Euler Protocol合约中获取了19.5M个eDAI。

[color=rgba(0, 0, 0, 0.847)]3.Euler Protocol可以调用mint函数借出10倍存款,此时黑客从中借出了195.6M个eDAI 和200M个dDAI。

[color=rgba(0, 0, 0, 0.847)]4.调用repay函数,用闪电贷剩余的10M个DAI偿还债务并且销毁了10M个dDAI,然后继续调用min函数借出195.6M个eDAI 和200M个dDAI。

[color=rgba(0, 0, 0, 0.847)]5.调用 donateToReserves函数捐赠10倍的偿还资金,发送了100M的eDAI,并调用 liquidate函数去清算,得到310M的dDAI和250M的eDAI。
[color=rgba(0, 0, 0, 0.847)]


漏洞成因
[color=rgba(0, 0, 0, 0.847)]先看一下donateToReserves函数,用户能够被清算是在这一步发生的。

[color=rgba(0, 0, 0, 0.847)]与下图的mint函数对比我们发现,donateToReserves函数少了一个关键步骤checkLiquidity。

然后跟进看 checkLiquidity的实现。我们发现了callInternalModule函数,它会调用RiskManager对用户进行检查保证Etoken>Dtoken。


攻击复现
[color=rgba(0, 0, 0, 0.847)]我们成功复现了此次攻击,详细PoC可查看链接:https://github.com/numencyber/SmartContractHack_PoC/tree/main/EulerfinanceHack
