智能合约漏洞案例,Euler Finance 1.96 亿美元闪电贷漏洞分析
2023 年 3 月 13 日上午 08:56:35 +UTC,DeFi 借贷协议 Euler Finance 遭遇闪电贷攻击。
Euler Finance 是一种作为无许可借贷协议运行的协议。其主要目标是为用户提供各种加密货币的借贷便利。这家总部位于英国的科技初创公司利用数学原理在以太坊和其他区块链网络上开发非托管协议,重点是实现高性能。
根据链上数据分析,攻击者已成功执行多笔交易,造成约 1.96 亿美元的盗窃,成为 2023 年迄今为止最大的黑客攻击。被盗资产包括价值数百万的 DAI、USDC、Staked Ether (StETH) 和 Wrapped Bitcoin (WBTC)。
被盗资产明细如下:
详细分析
由于 Etoken 的 donateToReserves 函数中缺乏流动性检查,所以可能会发生攻击。攻击者使用不同的货币执行多次调用以产生利润,导致六种不同代币的巨额损失 1.96 亿美元。目前,资金仍留在攻击者的账户中。
攻击者地址为:https://etherscan.io/address/0xb66cd966670d962c227b3eaba30a872dbfb995db
攻击者的合约地址为:https://etherscan.io/address/0x036cec1a199234fc02f72d29e596a09440825f1c
其中一项攻击交易可以在这里找到:https://etherscan.io/tx/0xc310a0affe2169d1f6feec1c63dbc7f7c62a887fa48795d327d4d2da2d6b111d
- 攻击者首先通过闪电贷向 Aave 借了 3000 万个 DAI,然后部署了两份合约:一份用于借贷,一份用于清算。
- 攻击者随后调用 deposit 函数并向 Euler 协议合约质押 2000 万个 DAI,获得 1950 万个 eDAI 作为回报。
- Euler Protocol 允许用户通过调用 mint 函数借入最多 10 倍于存款的资金。攻击者利用此功能借入了 1.956 亿个 eDAI 和 2 亿个 dDAI。
- 攻击者调用 repay 函数,用闪电贷借来剩下的 1000wDai 来偿还债务,并销毁 1000 万 dDAI。然后他们再次调用 mint 功能借入 1.956 亿个 eDAI 和 2 亿个 dDAI。
- 攻击者随后调用 donateToReserves 函数并捐赠了偿还债务所需金额的 10 倍,发送了 1 亿个 eDAI。然后他们调用 liquidate 函数启动清算过程,获得了 3.1 亿个 dDAI 和 2.5 亿个 eDAI。
- 攻击者调用了 withdraw 函数,获得了 3890 万个 DAI,用来偿还闪电贷借来的 3000 万个 DAI。他们从这次攻击中获利 887 万 DAI。
核心漏洞
首先,让我们看一下 donateToReserves 函数,这是用户容易被清算的地方。
对比下图中的 donateToReserves 函数和 mint 函数,我们可以看到 donateToReserves 函数中少了一个关键步骤 checkLiquidity。
接下来,我们跟进检查了 checkLiquidity 的实现。我们发现了 Call InternalModule 函数,它调用 RiskManager 来检查并确保用户的 Etoken > Dtoken。
每次操作都需要检查用户的流动性,调用 checkLiquidity。
但是 donateToReserves 函数不执行这个操作,让用户先通过协议的某些函数让自己处于清算状态,然后完成清算。
关于攻击的官方更新
Euler Finance 已在其官方推特(@eulerfinance)上确认了此次攻击,并表示他们目前正在与安全专业人员和执法部门合作解决该问题。
Euler Finance 最近更新了他们为协议用户收回资金的努力。他们概述了自攻击发生以来他们采取的几项行动,包括通过禁用 EToken 模块来尽快停止直接攻击,该模块阻止了存款和易受攻击的捐赠功能。
此外,他们还与各种安全组织合作,例如 TRM Labs、Chainalysis 和更广泛的以太坊安全社区,以协助调查和追回资金。Euler Finance 还与美国和英国的执法部门共享信息。
最后,该公司试图联系攻击者以了解更多有关潜在恢复选项的信息。
结论
最近针对 Euler Finance 协议的攻击凸显了实施严格安全措施的重要性,例如进行彻底审计和定期检查漏洞。
随着去中心化金融生态系统的不断发展,项目必须优先考虑用户资金的安全并采用最佳实践来降低未来类似攻击的风险。