前言
北京时间 2022 年 6 月 16 日,知道创宇区块链安全实验室监测到以太坊链上借贷项目 Inverse Finance 因预言机设计问题被攻击,损失约 77BTC(152W美元)。
知道创宇区块链安全实验室第一时间跟踪本次事件并分析。
基础信息
被攻击预言机合约:0xe8b3bc58774857732c6c1147bfc9b9e5fb6f427c
攻击者地址:0x7b792e49f640676b3706d666075e903b3a4deec6
攻击合约:0xf508c58ce37ce40a40997c715075172691f92e2d
tx:0x958236266991bc3fe3b77feaacea120f172c0708ad01c7a715b255f218f9313c
漏洞分析
与大部分预言机事件一样,项目方由于在预言机实现过程中过度依赖某一池子内的价格进行定价。导致攻击者可操控该分布式池子的代币比例导致价格控制进而攻击协议。
本次事件中,攻击者利用了项目方如下的价格预言机代码:
该喂价函数将 Crv3 池内 BTC/ETH/USDT 池内代币余额作为价格源的一部分,导致在攻击者在 CRV3CRYPTO 池子中利用大量 BTC 换取了 USDT 后产生了巨大的价格拉升。
攻击流程
1. 攻击者首先利用闪电贷从 AAVE 中借来了 27000 个 WBTC, 随后将225个存入了 Curve,协议为其铸造相应的质押凭据(crv3crypto);
2. 利用 crv3crypto 存入 yvCurve-3Crypto,协议为其铸造相应凭据anYvCrv3Crypto;
3. 利用余下的 WBTC 来进行兑换,进而控制 latestAnswer 中获取的 Curve池子中的余额比例。(使用 26,775 WBTC 交换获得了 75403376 USDT);
在第三步兑换前预言机 latestAnswer 返回为 979*1e18;
在价格操控后 latestAnswer 返回为 2831*1e18;
4. 于是攻击者得以使用抵押物借出 10,133,949 个 DOLA(价值 1011W 美元),而原本 225 个 BTC 价值 466W 美元;
5. 然后则是利用 USDT 换回 WBTC、交换 DOLA 为 3Crv;
6. 移除 3Crv 流动性换取稳定币 USDT;
7. 交换为 BTC 并归还闪电贷。
总结
预言机合约中错误的使用了 balanceOf 导致攻击者可操控数据源导致被攻击,这样的攻击方式在之前已出现过多次如 Definer 预言机攻击事件,项目方在开发过程中不应忽视安全性考量,在上线前建议做好审计工作。