Euler Finance donateToReserves 缺失健康检查事件复盘
基于公开披露资料的事后复盘,非 umibit 受托审计。2023-03-13,攻击者利用 EToken 的 donateToReserves() 缺少账户健康度检查这一业务逻辑缺陷:借闪电贷自我加杠杆、调用 donateToReserves 把头寸主动做成资不抵债,再自我清算、借 Euler 的软清算折扣低价吃下抵押品,循环套利约 $1.97 亿。 该函数缺陷由 eIP-14 升级引入、存活约 8 个月。攻击者随后通过链上协商归还了几乎全部可追回资金。
本页基于公开披露资料对一起真实安全事故做事后分析,用于安全研究与方法论说明,并不代表 umibit 与 Euler Finance(借贷协议) 存在任何业务关系。文中每一项结论均可对照下方「核验来源」独立核查。
- 报告编号
- EULER-2023
- 受影响项目
- Euler Finance(借贷协议)
- 区块链
- Ethereum
- 语言
- Solidity
- 损失规模
- ≈ $197M(后经链上协商追回约 $240M 价值)
- 报告版本
- 复盘 v1.0
- 事件日期
- 2023-03-13
- 事件评级
- 严重风险
相关合约 / 链上对象
事件涉及的合约 / 链上对象及其可核验身份(地址 / commit),据公开披露整理。
| 名称 | 类型 | commit | 地址 |
|---|---|---|---|
| EToken.donateToReserves() | 缺失健康检查的函数 | — | — |
| liquidate()(软清算折扣) | 清算逻辑 | — | — |
| 攻击者地址 | 链上地址 | — | 0xb66cd966670d962c227b3eaba30a872dbfb995db |
| 示例攻击交易(DAI 市场) | 交易哈希 | — | 0xc310a0affe2169d1f6feec1c63dbc7f7c62a887fa48795d327d4d2da2d6b111d |
根因与漏洞
严重 1高 2| ID | 标题 | 严重 | 状态 | 类别 |
|---|---|---|---|---|
| EULER-01 | donateToReserves() 缺少 checkLiquidity 健康度检查,可主动制造资不抵债 | 严重 | Resolved 已修复 | 业务逻辑 |
| EULER-02 | 自我抵押 + 动态软清算折扣,使自我清算可低价吃下抵押品获利 | 高 | Resolved 已修复 | 经济机制 |
| EULER-03 | 缺陷由治理升级 eIP-14(2022-07)引入,存活约 8 个月 | 高 | Resolved 已修复 | 治理 |
公开事件复盘。 本页基于公开披露资料对一起真实安全事故做事后分析,用于安全研究与方法论说明, 并非 umibit 受托审计。文中数据请以「核验来源」所列公开资料为准。
事件概览
Euler 是部署于以太坊主网的无许可借贷协议。2023-03-13,攻击者在多个市场反复套利,造成约 $1.97 亿 损失, 是 2023 年最大的一起。由于赃款以 ETH 持有、后续 ETH 升值,最终在链上协商归还时按价值计约 $2.4 亿—— $1.97 亿是损失、$2.4 亿是追回价值,二者不应混为一谈。
根因:一个本该有、却缺失的健康检查
Euler 中所有会改变账户余额、可能危及偿付能力的函数,都应调用 checkLiquidity 校验账户「健康度」。
但 EToken 模块的 donateToReserves() 漏掉了这道检查。攻击者据此构造闭环:
- 从 Aave 闪电贷 约 3000 万 DAI;
- 存入并用
mint()递归自我抵押、放大杠杆; - 调用
donateToReserves()主动把自己的头寸做成资不抵债——因为没有健康检查拦截; - 用第二个受控账户 自我清算:Euler 的 动态「软清算」折扣 让清算人能折价吃下抵押品,于是低价拿走抵押、 留下坏账、净赚一笔;
- 偿还闪电贷,跨市场重复,累计约 $1.97 亿。
根因是 业务逻辑缺陷(缺失的健康检查),并与「自我抵押 + 动态清算折扣」共同放大——不是重入、预言机或溢出。 该缺陷由治理升级 eIP-14(2022-07) 引入,已在主网存活约 8 个月,期间经过多家审计。
影响与处置
- 攻击者在约三周内 通过链上消息协商,分批归还了几乎全部可追回资金。
- 此案也凸显:多家审计 + 形式化验证 + 漏洞赏金,仍可能放过一个「少调用一个检查」的逻辑缺口—— 覆盖面与不变量的完整性,比「审过几家」更关键。
AI 视角 · 为什么这类风险只会更多
Euler 最扎心之处在于:漏洞不深奥,就是 「同类函数都做了健康检查,唯独这一个忘了」。这种「缺失的检查 / 被打破的不变量」是最难靠人工通读发现、却最适合自动化大规模比对的一类——可以系统性地枚举「所有改变偿付能力的路径 是否都过了 checkLiquidity」。
随着协议组合度与升级频率升高,这类逻辑缺口只会更多,而 AI 正让攻击者能更快地在海量代码里定位它们。防御的答案不是 「再多审一家」,而是把 关键不变量做成可机检的规则、对全量路径求覆盖,并在每次升级时重新求证——这正是 「AI 全覆盖 + 专家研判」要解决的问题。
核验来源
本页结论所依据的公开资料,每项数据与论断都可对照独立核查。
请对照上方「核验来源」所列的官方根因分析、安全机构报告与区块浏览器,独立核查事件日期、损失规模、根因与链上地址等每一项论断。