模型1 使用交易所原本差价
参见之前的文章
模型2 使用抵押品不足未爆仓–头寸健康度
Bzx事件( 0xb5c8bd9430b6cc87a0e2fe110ece6bf527fa4f170a4bc8cd032f768fc5219838 )
攻击流程:
1 | [BTC吸筹] |
1 | [BTC拉升] |
1 | [清算] |
本步骤如果1300ETH抵押物不足导致bzx爆仓、那么攻击者将不会得到51.3wbtc这么多。按理5倍杠杆,BTC如果下降20%则会爆仓。但这里未在中途爆仓。
产生原因
Uniswap中的WBTC/ETH价格是如何被操纵至高达61.4的利润? ( WBTC/ETH的价格甚至在正常市场价格仅为38左右时==>被推高到了109.8 )
bzx为何在抵押物不足时仍继续砸盘?
跟进 _borrowTokenAndUse 函数,如果已质押,则 amountIsADeposit 为true,这时候会调用 _getBorrowAmountAndRate 返回借贷率
返回的borrowAmount将会存入sentAmounts[1] ,并更新 sentAmounts[6]
然后后续进入 _borrowTokenAndUseFinal
看一下_borrowTokenAndUseFinal ,该方法对 sentAmounts 和 sentAddresses 进行检查后进入 takeOrderFromiToken 来返回借款量
然后执行部分进入 **bZxContract . takeOrderFromiToken() **
然而该处的shouldLiquidate 逻辑错误导致流动性检查被跳过
在shouldLiquidate 中使用return返回流动性是否充足。返回false但是却不能阻止require的通过。
总结
这是一次利用杠杆抵押率不足检查绕过的漏洞来进行多倍砸盘导致的闪电贷攻击
模型3 以子之矛、攻子之盾
Bzx事件2( 0x31e085afd48a1d6e51cc193153d625e8f0514c7f )
( 0x4cb01bd05e4652cbb9f312ae604f4549d2bf2c99 )
攻击流程:
1 | [sUSD吸筹] |
1 | [以拉升的价值抵押取出原代币] |
产生原因
(bzx使用 Kyberswap 作为价格更新端)、攻击者使用bzx闪电贷去将源头的价格进行改变。
进而充分拉升源头sUSD价值、同时进行价格更新后抵押sUSD取出更多的需归还的ETH代币
总结
这是一次利用源头价值更新不完整设计缺陷来进行自我砸盘导致的闪电贷攻击,价值更新未完全同步。