imbanytuidoter/euler-trap-poc
GitHub: imbanytuidoter/euler-trap-poc
一个针对 Euler Finance 漏洞的 Drosera Trap 概念验证,演示如何在同一区块内检测并阻止攻击。
Stars: 0 | Forks: 0
# euler-trap-poc
Drosera Trap 的概念验证,针对 Euler Finance 漏洞 —— $197M,2023年3月13日,区块 16818057。
目标:在攻击开始的同一区块内证明 Drosera Trap 能够检测并阻止该攻击。
## 漏洞利用
Euler Finance v1 在 `donateToReserves()` 中缺少健康因子检查。攻击流程如下:
1. 通过 `mint()` 构建最大杠杆仓位 —— eToken 和 dToken 原子发行,仅一次最终状态偿付能力检查
2. 调用 `donateToReserves()` 燃烧抵押品且 **无任何偿付能力检查** —— 仓位立即资不抵债
3. 第二个 EOA 对第一个仓位进行清算 —— 接收抵押品并获得 20% 奖励
4. 协议留下坏账;攻击者保留提取的抵押品
根本原因仅是一行缺失的代码:在 `donateToReserves()` 调用后缺少健康因子检查。
## Trap 检测机制
两项不变量,按检测速度排序:
### 不变量 1 —— 严格(1 个区块内触发)
```
getTotalBadDebt(trackedAccounts) > 0
```
一旦 `donateToReserves()` 使抵押品低于负债阈值,`getTotalBadDebt` 将返回非零值。无需清算。这是二元的 —— 要么为零,要么为攻击。
### 不变量 2 —— 速度(坏账前的早期预警)
```
reserveGrowth >= 50% AND totalBorrows grew in window
```
在仓位尚未资不抵债前捕获攻击指纹。Euler 的正常利息累积约为每区块 0.01% —— 50% 的储备突增是明确信号。这在杠杆与捐赠阶段触发,在自我清算完成前即可生效。
## 测试结果
```
forge test -vvv
Ran 14 tests across 3 suites: 14 passed, 0 failed
EulerExploitReproduction (proof the exploit works):
[PASS] test_Attack_CreatesProtocolBadDebt
Protocol bad debt: 71,250,000 * 1e18
[PASS] test_DonateToReserves_HasNoSolvencyGuard
[PASS] test_PausedMarket_BlocksAttackerExit
EulerTrapDetection (proof the Trap catches it):
[PASS] test_Invariant1_BadDebt_TriggersShouldRespond
[TRIGGERED] TRIGGERED: BadDebtInvariantBroke() — bad debt: 71250000...
[PASS] test_Invariant2_ReserveVelocity_TriggersShouldRespond
[TRIGGERED - EARLY WARNING] TRIGGERED: DonationAttackVelocityAnomaly()
reserve growth BPS: 70000 — borrow increase: 100000000...
[PASS] test_FullMitigation_AttackerCannotExit
Market paused: true — Attacker successful exits: 0
[PASS] test_NoFalsePositive_NormalOperation
[PASS] test_InsufficientWindow_NoTrigger
[PASS] test_ResponseAuthorization_OnlyTrapManager
EulerTrapFuzz (513 fuzz runs each):
[PASS] testFuzz_NoFalsePositive_NormalBorrowAndDeposit
[PASS] testFuzz_TriggerOnBadDebt
[PASS] testFuzz_ReserveSpike_ThresholdBoundary
[PASS] testFuzz_WindowSize_Robustness
[PASS] test_EdgeCase_ZeroBaselineReserves_NoDivByZero
```
## 项目结构
```
src/
Trap.sol local mirror of Drosera abstract Trap
EulerFinanceTrap.sol main Trap — collect() + shouldRespond()
interfaces/IEulerMarket.sol
mocks/MockEulerMarket.sol full economic simulation, no spoofed flags
response/EulerPauseResponse.sol response contract — pauses the market
test/
EulerExploitReproduction.t.sol proves the exploit is mechanically sound
EulerTrapDetection.t.sol proves the Trap detects and halts the attack
EulerTrapFuzz.t.sol property-based tests
```
## 运行
```
git clone
cd euler-trap-poc
forge install foundry-rs/forge-std
forge test -vvv
```
需要 [Foundry](https://getfoundry.sh)。
## 参考
- 漏洞区块:16818057
- 日期:2023年3月13日
- 协议:Euler Finance v1
- 损失:约 $197M
- 根本原因:`donateToReserves()` 调用后无健康因子检查
- Drosera 文档:https://dev.drosera.io
标签:DeFi安全, Drosera Trap, Euler Finance, Forge, PoC, Solidity, 事前预警, 事后分析, 借贷协议, 债务追踪, 健康因子检查, 储备金增长, 区块链安全, 可视化界面, 抵押品攻击, 智能合约审计, 暴力破解, 检测与响应, 治理与合规, 测试框架, 漏洞复现