随后,攻击者利用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对交易并不频繁。 |