作者|0x6617

案件分析|链上天眼团队

近年来,随着DeFi市场规模的指数型增长,预言机作为DeFi安全性的重要组成部分,针对它的攻击已是屡见不鲜,而本次INV(Inverse Finance的链上资产)的价格被操纵,既不是闪电贷攻击,与Inverse Finance的智能合约或前端代码也无关,而是TWAP预言机使用的时间窗口太短。

价格操纵的另一面是链上套利。DeFi兴起后,以太坊等区块链网络不仅支撑链上资产转账,还有了如挖矿、借贷、衍生品等智能合约的交互场景,这也使得链上可捕获的价值变多,主要通过套利、清算的MEV(Maximum Extractable Value,最大可提取价值)提取的价值也在迅速增加,尤其是Flashbots推出可视化MEV产品「MEV-Explore v1」,更是将MEV清晰地呈现在我们眼前。

由于存在链上套利机器人不间歇的搬砖行为,如果攻击者操纵预言机,又不是借助闪电贷在一个区块内完成的话,防止MEV-bots抢跑(front-running)就成了攻击者需要考虑的问题。

2022年1月26日,有黑客使用了与Inverse Finance攻击者类似手法,攻击了借贷平台Rari的Index Coop Pool,但却上演了一幕「黑吃黑」,黑客的攻击被MEV-bots「截胡」,最终亏损68 ETH离场。

虽然Inverse Finance此次事件的攻击者预先准备了241个批量地址,每个地址打入1.5 ETH,但并不是为了发动DDOS攻击阻截其他人(通常是套利机器人)在监测到INV价格异常波动后的套利行为,而是为了保证他的攻击交易能被打包进下一个区块。

如果有MEV-bots套利,则他的后续攻击有可能跟Index Coop Pool的攻击者一样,面临赔了夫人又折兵的局面。

Inverse Finance被盗过程全解析

Inverse Finance是一套无需许可的去中心化金融工具,由运行在以太坊区块链上的去中心化自治组织Inverse DAO管理。Inverse Finance的主要产品是Anchor(借贷)和DOLA(资产)。

Anchor是一种货币市场和合成资产协议,可实现资本高效的借贷。DOLA是一种跟踪 1 美元价格的链上资产。DOLA可以用Anchor上的其他资产作为抵押来铸造,也可以自己作为抵押借入Anchor上的其他资产。INV具有附加功能,可用作锚定中的抵押资产。

经欧科云链链上天眼分析,本次攻击的关键在于,价格预言机虽然取了TWAP价格,但时间窗口较短,仅是相邻两个数值,由此使得操纵TWAP预言机成为可能。

另外SushiSwap: INV(INV-ETH交易对)的流动性非常低,仅用300 ETH(约103.5万美元)换取INV,即可大幅拉升INV价格,这也使得攻击者以1,746 INV(公允价值约64.4万美元)作为抵押品,在Inverse Finance借出1,475万美元的资产(包括1,588 ETH、94 WBTC、400万 DOLA,以及39 YFI),而后在INV价格被修正后,攻击者的INV抵押品被清算。

相关地址&交易列表:

攻击者地址1:

0x117C0391B3483E32AA665b5ecb2Cc539669EA7E9

攻击者地址2:

0x8B4C1083cd6Aef062298E1Fa900df9832c8351b3

攻击合约:

0xea0c959bbb7476ddd6cd4204bdee82b790aa1562

准备批量账号交易:

0x561e94c8040c82f8ec717a03e49923385ff6c9e11da641fbc518ac318e588984

兑换INV交易,交易块高「14506358」:

0x20a6dcff06a791a7f8be9f423053ce8caee3f9eecc31df32445fc98d4ccd8365

利用漏洞实施攻击,交易块高「14506359」

0x600373f67521324c8068cfd025f121a0843d57ec813411661b07edc5ff781842

预言机合约:

0x39b1dF026010b5aEA781f90542EE19E900F2Db15

攻击流程:

1)攻击者从Tornado Cash中提取了901 ETH,准备批量账号——通过Disperse分别向241个干净的账号发送1.5 ETH(合计361.5 ETH)作为手续费,交易哈希「0x561e」。

图片来源:OKLink

2)部署攻击合约「0xea0c」,攻击者分别将300 ETH和200 ETH兑换成WETH,并在SushiSwap的INV-WETH池子中,使用300 WETH(约103.5万美元),兑换出374枚INV。

原有46 WETH + 432枚INV ,拿300 ETH兑换374枚INV后,池子变成 346 WETH + 58枚INV,即INV价格从 0.106 WETH(约366美元)上涨至5.966 WETH(约20,583美元)。

随后,攻击者利用DOLA3POOL3Crv+SushiSWap把200WETH(约69万美元)换成1,372枚INV。

攻击者累计兑出1,746枚INV,交易哈希「0x20a6」。

图片来源:OKLink

这里可以发现,第一个池子用300WETH仅换出374枚INV,而第二个池子用200WETH却兑换出了1,372枚INV,可以明显看到第一个池子里(INV-WETH)的INV价格已明显被拉高。

3)随着INV的价格被修改,攻击者前往Inverse Finance抵押1,746枚INV,此时1枚INV的价值为20,583美元,从而借出共计1,475万美元的资产,包括1,588 ETH(约547.9万美元)、94 WBTC(435.2万美元)、400万DOLA(约400万美元),以及39 YFI(约91.7万美元)。

图片来源:OKLink

攻击漏洞分析:

本次攻击者能成功盗取Inverse Finance 1,475万美元的资产,其核心漏洞在于价格预言机虽然取了TWAP价格,但是采取的窗口只是相邻两个数值。

这里我们先简单科普一下TWAP (Time Weighted Average Price) 。TWAP Oracles是一种去中心化预言机,通过时间加权平均价格的方式来消除闪电贷等攻击方式对价格预言机的操纵,从而增加攻击者操纵价格的成本。

在本次攻击中,Keep3r TWAP价格在14,506,358块上链,攻击者需要在下一块使用该价格,就可以利用操纵的价格贷出超值资产。具体如下,预言机合约「0x39b1」:

#4-6:为获取TWAP价格,该数值为操纵后的,在操纵价格交易块高14,506,358上链。

#10-12:攻击交易发生在块高14,506,359,因此此处逻辑为获取操纵之前的价格。

#17:此处计算实际是将两个相邻价格进行计算,使得操纵的TWAP价格发挥作用。

批量账号作用:

我们在前文提到过,攻击者在交易哈希为「0x561e」中准备了241个批量账号,每个地址打入1.5 ETH作为手续费,并且这些账号在操纵价格交易(块高14,506,358)发生之前就开始发送攻击交易。

从攻击合约交易历史可以看到,攻击交易在区块高度14,506,357就已经开始发送,操纵价格发生在下一块14,506,358,具体攻击交易发生在再下一块14,506,359。

攻击者使用这些账号只是保证攻击交易能在操纵价格的下一块成交,从而使得操纵的价格可以发挥作用;但是并不能防止其他人(一般是MEV-bots)在监听到INV价格从0.106 ETH升高到5.966 ETH时进行套利(卖出INV将价格拉回正常数值)。

我们再分析操纵价格交易第二部分的200 WETH,从Curve兑换出DOLA后,在Sushiswap的DOLA-INV池购买INV。该池原有 2,188,077 DOLA + 5,734 INV(价格:382 DOLA/INV), 拿690,203 DOLA换成1,372 INV后,池子变为2,878,280 DOLA+ 4,362 INV(价格:660 DOLA/INV)。

我们之前计算过,攻击者在WETH-INV池子中,将INV价格从 0.106 WETH(约366美元)拉升至5.966 WETH(约20,583美元),而在DOLA-INV池子中,则是0.146 WETH(504美元),这意味着如果有MEV-bots从这个池子购入INV,然后卖出到WETH-INV池,是可以实现套利的,但实际情况是没有MEV-bots发起套利交易(我们在后文列举了一个相似攻击手法,但遭遇MEV-bots「截胡」的案例)。

另一方面,操纵价格交易所在区块高度14,506,358只有199个交易,且Gas使用只有52.27%,所以241个账号发送交易的目的也不是填满区块以阻止其他交易。

图片来源:OKLink

另外,下图可以看出,操纵价格交易之前WETH-INV对交易并不频繁。

相似手法,却遇「黑吃黑」

2022年1月26日有黑客以类似的手法攻击了借贷平台Rari的Index Coop Pool,但结果却是攻击失败。

攻击者首先买入285 ETH 的BED(WETH、WBTC、DPI组成的合成资产),希望大幅抬高BEP价格影响Uniswap V3 TWAP预言机,再抵押提前准备的BED借出其他资产。

图片来源:OKLink

由于BED在其他市场基本没有流动性,正常情况下这次攻击会成功。但攻击者忽略了BED本身属于合成资产,除了市场上的流动性外,还可以用对应等值的资产mint。

于是在黑客发起攻击的的下一个区块,MEV-bots就发起了“反击”。MEV-bots通过购买WETH、WBTC、DPI直接mint出了4,915.91个BED并卖出,直接将价格拉回了正常水平。

由于使用了TWAP预言机,单一区块的波动无法影响最终预言机价格。所以攻击者计划落空,最终亏损了68 ETH离场。

数据显示,截至4月8日,MEV提取价值已经达到了6.08亿美元,其中99.4%来自套利。过去30日的MEV提取价值为740万美元。

安全,是DeFi生态繁荣发展的保证

预言机作为DeFi生态重要的基础设施,其安全性是DeFi生态繁荣发展的保证,链上天眼认为,安全审计应审查预言机的价格算法、经济模型等。

项目方在设计借贷池的时候,抵押借贷的经济模型,不仅要关注价格,还要关注流动性,流动性差会导致相应的链上资产价格易被操纵。在上线前应加强对预言机的针对性测试,上线后也需对预言机进行定期的安全检查。