2023年3月,Euler Finance 协议遭受闪电贷攻击,损失高达1.87亿美元。攻击者通过创建多个合约,利用 Aave 闪电贷,并利用 Euler Finance 合约中 donateToReserves 函数缺乏流动性检查和健康评分的缺陷,成功窃取大量资金。
更新于:2025 年 6 月 26 日
阅读需 4 分钟
作者:Hacken
2023 年 3 月 13 日,加密货币行业受到了一些震动。一名攻击者利用 Euler Finance 协议进行了一次打破记录的 1.87 亿美元闪电贷攻击。
Twitter 嵌入
·
Euler Finance (@eulerfinance) 遭到了攻击
被盗金额约为 1.87 亿美元
更多细节在下面的线程中 …
复制链接
根据链上报告,黑客从 Euler Finance 协议中窃取了 1.87 亿美元。到目前为止,这在 2023 年最大的黑客攻击列表中名列前茅。这是如何发生的?
黑客创建了三个合约:一个主要的合约,然后是另外两个用于违规和清算的合约。他们从闪电贷协议 Aave 获得了一笔 3000 万 DAI 的闪电贷,并将其发送到违规合约。
黑客将 2000 万 DAI 存入 Euler 协议,并获得了约 1960 万 eDAI 作为回报。然后,他们利用这 1960 万 eDAI 借入了约 1.956 亿 eDAI 和 2 亿 dDAI。
回想一下,黑客在他们借入的 3000 万 DAI 中还剩下 1000 万 DAI。他们用剩下的 1000 万 DAI 偿还了部分债务。这很重要,因为 Euler Finance 智能合约会检查借款账户的健康评分。余额现在为 1.9 亿 dDAI。然后他们又借入了 1.956 亿 eDAI 和 2 亿 dDAI。
此时,黑客向 Euler 协议储备捐赠了 1 亿 eDAI。此调用成功,因为 donateToReserve 函数没有流动性检查。清算调用成功,攻击者获得了 2.54 亿 dDAI 和 3.1 亿 eDAI。他们偿还了 Aave 的 3000 万 DAI,并通过这次攻击赚取了约 870 万 DAI。
事情并没有就此结束。攻击者还使用了这个地址 [00x47ac3527d02e6b9631c77fad1cdee7bfa77a8a7bfd4880dccbda5146ace4088f] 来执行与 WETH 相同的攻击逻辑。
攻击者的行为:
经过仔细分析,我们发现黑客利用了 Euler Finance 合约中的两个漏洞。
1. donateToReserves 函数缺乏流动性检查。 donateToReserve 函数允许 Euler 的用户将资金存入保留地址。每个调用此函数的人都拥有债务代币 (DToken) 和权益代币 (EToken)。
此函数的主要漏洞在于它不会检查或确认借款人的流动性状况。因此,用户可以通过将其权益代币捐赠给储备,同时保持其债务代币不变,从而使其杠杆低于抵押水平。这会产生一种技术性坏账。因此,黑客的清算合约成功地从协议中撤回了资金。
2. 健康评分缺陷。 Euler Finance 有一个为账户分配健康评分的设计。它允许无力偿债的账户在不偿还未偿债务的情况下获得抵押品。这在 computeLiqOpp 函数中有所说明。
此代码块背后的逻辑是,没收借款人的所有抵押品并不一定意味着他们仍然有偿付能力。因此,他们剩下的任何抵押品都应该足够。但是,攻击者可以通过进行抵押不足的杠杆来利用此逻辑。
3 月 14 日,Euler 团队在其 Twitter 帐户上发布了一份声明,并提到了他们的 3 个行动步骤:
虽然 Euler 团队正在努力从攻击中恢复,但从这次攻击中可以吸取一些教训:
彻底测试。仔细观察,donateToReserve 函数没有经过适当的测试。正如在他们的 GitHub 上看到的那样,它没有针对借款后捐赠以及捐赠后的健康评分进行测试。如果团队针对每种可能的场景测试了易受攻击的函数,他们本可以缓解这次攻击。当向现有代码库引入新的逻辑和函数时,这一点更为关键。就像 donateToReserve 函数的情况一样,测试智能合约中的新改进。
更严格地审计。 六家 Web3 安全公司 已经审计了 Euler Finance,但仍然发生了此攻击。可以肯定地说,并非所有审计都审查了错误的函数。尽管如此,一些审计并没有深入进行,可能会遗漏重要的函数,因此最好进行全面的审计。
申请一项能够带来改变的 智能合约审计。
- 原文链接: hacken.io/discover/euler...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!