本文分析了2023年3月13日Euler Finance遭遇的安全事件,重点是捐赠机制的漏洞如何导致用户能够创造无担保的债务。该漏洞源于未进行适当的账户健康检查,允许用户在同一交易内人工增加杠杆并随之进行自我清算,结果造成了大量的坏账和不必要的损失。
本文旨在以中立的方式分析于3月13日大约08:50 UTC发生的Euler Finance事件,并识别根本原因。
被利用的漏洞源于Euler Finance如何允许在没有适当账户健康检查的情况下进行捐赠。
该漏洞代码是在eIP-14¹中引入的,该提案在Euler生态系统中进行了多项更改。缺陷存在于对EToken
实现的第一次更改(EToken::donateToReserves
功能²)中。
Liquidation
模块中的逻辑将尝试偿还违规者的全部债务,但如果他们拥有的抵押品无法满足预期的偿还收益,系统默认使用用户持有的任何抵押品³。
该代码块的假设状态为,当借款人的可用抵押品不足时,唯一的情况是:
这可能发生在借款人拥有多个抵押品时,并且没收其中所有抵押品并不会使违规者恢复偿付能力。
该安全保证未能通过捐赠机制得到维护,该机制允许用户以捐赠其EToken
单位的方式创造“坏债务”,而不影响他们的DToken
余额⁴。
Euler Finance协议允许用户通过在同一交易中铸造和存入资产来创造人工杠杆,这个过程通过EToken::mint
进行。此机制允许铸造超过Euler Finance协议自身所持抵押品的代币。
欧拉金融在eIP-14¹中引入的捐赠机制(EToken::donateToReserves
)允许用户将其余额捐赠给他们所交易的代币的reserveBalance
。缺陷在于它没有对执行捐赠的账户进行任何健康检查。
因为捐赠会使用户的债务(DToken
)保持不变,而他们的权益(EToken
)余额减少,账户的清算将使用户的部分DToken
单位保留,从而形成坏债务。
上述缺陷允许攻击者创建一个过度杠杆的位置,并在同一个区块中自行清算,通过人为导致其“水位下沉”。
当violator
自行清算时,会应用基于百分比的折扣,这将导致liquidator
以折扣方式获得大量EToken
单位,确保他们将“在水面上”,并仅承担与他们获得的抵押品相对应的债务。
最终结果是violator
拥有大量“坏债务”(DToken
),而liquidator
则由于Euler协议的基于百分比的清算激励⁵,其联合担保超过其债务(DToken
> EToken
)。在交易本身中可以看到,攻击过程中应用了最高20%的折扣⁶。
为了使攻击者能够清算自己,他们必须部署至少两个合约来利用此漏洞。在2023年02月01日06:29:18 UTC提交的攻击交易⁶调用了在之前的交易中部署的一个合约⁷。
在攻击交易的执行过程中,该合约执行了以下步骤:
a. 主合约:
violator⁸
& liquidator⁹
)用于攻击violator
b. violator
合约:
EToken
存入2000万DAI,获得约1956万eDAI
代币eDAI
杠杆,为violator
铸造约1956万eDAI
和200万dDAI
violator
的头寸上偿还1000万DAI,使其dDAI
余额减少至1900万eDAI
杠杆,为violator
铸造约1956万eDAI
和200万dDAI
EToken
的储备捐赠1000万eDAI
此时,我们获得以下 violator
状态:
eDAI
: ~310,93mdDAI
: 390m在上述状态下,violator
持有的dDAI
代币数量远大于eDAI
代币,这些eDAI
代币将永远不会被作为抵押,因为它们的支持在捐赠调用中被“抹去”。liquidator
将利用Liquidation
模块中的计算。
如前所述,Liquidation
模块将清算用户的抵押品余额。因此,liquidator
可以清算violator
,承担其全部约310,93m eDAI
余额,但只需承担部分dDAI
余额,进一步因Euler Finance的清算折扣而加剧。
由于最低健康水平将对该头寸应用最高折扣,liquidator
将以约310,93m eDAI
的余额,按照1.25
eDAI
代币兑换dDAI
的汇率获取。这将最后评估为扣费后约259,31m dDAI
余额。
liquidator
合约:
eDAI
代币和约259,31m dDAI
代币eDAI
代币提取全部储备DAI代币在提现步骤中,EToken
所尊重的eDAI
与DAI
的兑换率因计算的交换率¹⁰考虑了系统的总借款,而这些借款因清算的repayExtra
值而被人为增加。
因此,赎回时使用的兑换率大约为0.97 eDAI
每DAI
。由于用户已经“在水面上”,是因为在他们的清算中施加的最高20%清算折扣,他们能够“燃烧”约380万eDAI
以释放对应合同持有的约389万DAI
。
最终,攻击者在其交易执行后保留了以下资产:
+~8,877,507 DAI
= ~8,779,854.423 USD
攻击者使用的合约的eDAI
和dDAI
余额也不为零,特别是liquidator
合约的健康因子为~1.05。因此,用户应避免重新存入DAI代币至EToken
,因为它们可能仍然易受攻击。
我们可以评估DAI
资产的财务影响,计算出截至2023-03-13 12:42:00 UTC的估计收益约为~8,779,854.423 USD
。
此次攻击已被复制到多个其他资产。因此,存款警告适用于以下 EToken
资产:DAI
,WETH
Omniscia对Euler Finance协议进行了多次安全审计。然而,相关的更改是在eIP-14中引入的。如信息板所示,Omniscia仅审核了Chainlink集成组件,该报告公开可用在这里。
导致此漏洞的EToken::donateToReserve
功能并不在Omniscia进行的任何审计范围内。因此,导致漏洞的代码从未在我们团队所进行的任何审计范围内。
donateToReserves函数在2022年7月 被Sherlock团队 审核。Euler Finance和Sherlock确认,在攻击发生时,Euler与Sherlock之间有有效的覆盖政策。
此次攻击最终源于不正确的捐赠机制,并未考虑捐赠者的债务健康,从而允许他们创造未被支持的DToken
债务,这笔债务将永远不会被清算。
Liquidator
抵押默认逻辑: https://github.com/euler-xyz/euler-contracts/blob/fa9398728165676a5666939d8c34a7578d8e1919/contracts/modules/Liquidation.sol#L139-L151 EToken
故障捐赠机制: https://github.com/euler-xyz/euler-contracts/blob/fa9398728165676a5666939d8c34a7578d8e1919/contracts/modules/EToken.sol#L356-L386 BaseLogic
交换率计算: https://github.com/euler-xyz/euler-contracts/blob/fa9398728165676a5666939d8c34a7578d8e1919/contracts/BaseLogic.sol#L292-L296Omniscia.io 是快速增长和最受信任的区块链安全公司之一,迅速成为真正的市场领军者。到目前为止,我们的团队已经共同保证了超过2000亿美元的数字资产,与260多位客户合作,发现了1300多个高严重性问题** 在我们客户的智能合约中。
创立于2021年初,由区块链网络安全老将组成的团队, omniscia.io 是Web3安全的开创者,利用数年的经验,开发专有工具以及经过验证的保护智能合约和复杂的去中心化协议的方法,包括Aave、YFI、lien、1inch、fetch、compound、synthetix等。
我们的客户、合作伙伴和支持者 包括L’Oréal、Polygon、AvaLabs、Morpho、Euler、CLabs、Olympus DAO、Fetch.ai、LimitBreak等领先生态系统参与者。
确保关注我们的社交媒体并订阅我们的新闻通讯以获取更多更新:
- 原文链接: medium.com/@omniscia.io/...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!