2023年3月13日,Euler Finance资金池遭遇闪电贷攻击,预计损失总计约 1.95亿美元 。这一数字也是2023年迄今为止Web3领域所有其他安全事件资产损失总额的两倍以上。
根据Euler Finance对自己描述,该平台是“以太坊上的一个允许用户借出和借入几乎任何加密货币资产的非托管协议”。
造成该攻击的原因主要是Euler Pool合约中的` donateToReserve `存在漏洞。由于该功能 缺乏对调用者仓位健康度的检查 ,用户可以通过自主放弃一部分杠杆存款,使自身仓位失衡,从而使用Euler特色的清算规则清算自己的仓位而获利。
攻击者利用闪电贷借来的资产,首先通过Euler借贷协议中独特的`mintdonateToReserves'功能创建了一个高杠杆且资不抵债的状况。随后攻击者在同一笔交易以清算者的身份清算自己创建的资不抵债的仓位“免费”获得大量衍生eToken。最后通过提款耗尽资金池,并在多个Euler Pools反复实施攻击,以耗尽所有资金池。
下面是对某一资金池的攻击流程,还有其他四个具有相同漏洞的资金池也被攻击了。
攻击流程
①攻击者从AAVE闪电贷到3000万 DAI。
②攻击者通过eDAI合约向Euler存入2000万 DAI,并收到2000万 eDAI。在攻击者存入2000万DAI之前,Euler池中的DAI余额为890万。
③调用`eDAI.mint()`。该特定的`mint`功能是Eule Financer独有的,可允许用户反复借款和还款。这是一种创建借贷循环的方法,其结果是带杠杆的借贷仓位。
④调用`mint`后,收到2亿 dDAI和1.95.6亿 eDAI。(注:dTokens代表债务代币,eTokens代表抵押股权)。
⑤调用 "repay",将eDAI池中的1000万DAI偿还给Euler,这就将1000万dDAI销毁了。随后再次调用 "mint",为攻击合约创造另一个2亿dDAI和1.956亿eDAI形式的借贷仓位。此时攻击者的仓位为: 3.9 亿 dDAI 和 4亿 eDAI。
⑥调用`donateToReserves`(该存在漏洞的函数于2022年7月被引入),将1亿eDAI转给Euler。由于没有对这一行为的抵押状况进行适当的检查,"donate" 后的攻击者成为了"违规者"(非健康负债水平的地址), 其风险调整后负债远超过了的抵押品价值,因此可以对其进行清算。此时攻击者的仓位为: 3.9 亿 dDAI 和 3亿 eDAI。
⑦攻击者部署的清算人合约开始清算“违规者”。Euler Finance清算逻辑中一个特色功能是当被清算人的借贷仓位极其不健康时,清算人员可以在此过程中获得最高20%的“折扣”。
⑧通过清算,清算人获得了2.59亿dDAI的“债务”,获得3.1 eDAI的“资产”。清算过程中转让的债务总额比资产低得多。清算人获得了价值近4500万的eDAI资产。
⑨清算人通过获得的eDAI从协议中取走了所有的3890万DAI的抵押品,然后偿还了闪电贷款,获利800万美元。
攻击者目前在地址一持有价值1350万美元的ETH,在地址二持有1.48亿美元的ETH以及4300万DAI。
神奇的是,第一次攻击交易竟被MEV机器人无意拦截了。该 机器人获得了879万美元 的DAI。可惜攻击者合约里把提款地址写死了, MEV机器人在试图归还资金的过程中只能把截拦到的资金发到攻击者的地址。
第二到第五笔攻击使黑客获得了价值1.77亿美元的资产。
MEV机器人的所有者在链上留言并解释他们无法归还这些钱,并对受影响的用户感到抱歉和遗憾。
写在最后
目前,该事件是2023年Web3领域 最大的一次黑客攻击 。Euler Finance在推文中承认了这一事件的真实性,并表示他们目前正在与安全专家和执法部门进行合作。
Euler Finance团队的整体安全水平和意识在行业内处于相对较高的水准,目前也已与很多安全公司进行了合作。项目进行过审计,也有bug bounty漏洞赏金计划加持,不过项目还是未能逃过黑客的磨爪。
因此CertiK安全专家再次提醒, 新添加的功能,务必也要进行审计 。才造成了如此严重的后果。
所以审计并不是一劳永逸的,合约在添加新功能时,务必要重新对新添加功能进行审计,否则即便已审计过“千里之堤”,也可能溃于未审计的“蚁穴”。