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, 事前预警, 事后分析, 借贷协议, 债务追踪, 健康因子检查, 储备金增长, 区块链安全, 可视化界面, 抵押品攻击, 智能合约审计, 暴力破解, 检测与响应, 治理与合规, 测试框架, 漏洞复现