前言
北京时间 4 月 17 日,以太坊平台 Beanstalk 协议遭到攻击,损失超过 8000 万美元,知道创宇区块链安全实验室 第一时间跟踪本次事件并分析。
分析
基础信息
攻击者:0x1c5dCdd006EA78a7E4783f9e6021C32935a10fb4
攻击合约:0x79224bC0bf70EC34F0ef56ed8251619499a59dEf
攻击tx:0xcd314668aaa9bbfebaf1a0bd2b6553d01dd58899c508d4729fa7311dc5d33ad7
Beanstalk(Diamond):0xC1E088fC1323b20BCBee9bd1B9fC9546db5624C5
恶意提案18:0xE5eCF73603D98A0128F05ed30506ac7A663dBb69
流程
- Aave 闪电贷借来 350,000,000 DAI、500,000,000 USDC、150,000,000 USDT;Uniswap 闪电贷借来32,100,950 BEAN;SushiSwap 借来 11,643,065 LUSD
- 在 Curve 3pool中添加 DAI/USDC/USDT 流动性,获得979,691,328 3Crv,在 LUSD3CRV-f 中兑换 15,000,000 3Crv => 15,251,318 LUSD
- 在 BEAN3CRV-f 中添加流动性 964,691,328 3Crv => 795,425,740 BEAN3CRV-f;在 BEANLUSD-f 中添加流动性 32,100,950 BEAN、26,894,383 LUSD => 58,924,887 BEANLUSD-f
- 将全部 BEAN3CRV-f 和 BEANLUSD-f 质押进 Diamond 合约,调用
vote
函数投票 18 号提案,并调用emergencyCommit
函数紧急执行调用恶意提案合约的init
函数,获得 36,084,584 BEAN、0.54 UNI-V2(WETH/BEAN)、874,663,982 BEAN3CRV-f、60,562,844 BEANLUSD-f,最后铸币 100 BEAN - 在 BEAN3CRV-f 中移除流动性 874,663,982 BEAN3CRV-f => 1,007,734,729 3Crv;在 BEANLUSD-f 中移除流动性 60,562,844 BEANLUSD-f => 28,149,504 LUSD
- 归还 SushiSwap 闪电贷 11,678,100 LUSD,归还 Uniswap 闪电贷 32,197,543 BEAN
- 在 LUSD3CRV-f 中兑换 16,471,404 LUSD => 16,184,690 Crv,接着在 3pool 中销毁获得 522,487,380 USDC、365,758,059 DAI、156,732,232 USDT,并归还 Aave 闪电贷
- 0.54 UNI-V2(WETH/BEAN) 移除流动性,获得 10,883 WETH、32,511,085 BEAN;向乌克兰捐赠地址转入 250,000 USDC
- 将攻击获利的剩余 DAI/USDC/USDT 兑换为 WETH,累计 24,830 WETH,转入攻击者地址
细节
此次攻击的根本原因在于协议中对于提案的投票和执行缺乏反闪电贷机制,而投票所需的代币凭证可通过闪电贷获取大量份额,而导致恶意提案被投票通过执行
同时,提案被紧急执行时间设置的为 1 天,仅需提前一天部署恶意提案合约即可准备攻击
总结
此次攻击事件的核心在于提案投票执行系统中,缺乏对闪电贷的防护措施,用于投票的代币凭证可通过闪电贷大量获得并用于投票执行,导致攻击者利用闪电贷投票通过了恶意提案,盗走协议中的资产。
近期,各类合约漏洞安全事件频发,合约审计、风控措施、应急计划等都有必要切实落实。