
編者按:本文來自PeckShield(ID:PeckShield),Odaily經授權轉載。
編者按:本文來自
圖片描述
Figure 1: Five Arbitrage Steps in bZx Hack
漏洞的攻擊細節如下:
漏洞的攻擊細節如下:
漏洞的攻擊細節如下:
第一步:閃貸獲取可用資金
Figure 2: Flashloan Borrowing From dYdX
圖片描述
圖片描述
第二步:囤積WBTC 現貨
Figure 3: WBTC Hoarding From Compound
圖片描述
圖片描述
二級標題
在此步驟操作後,我們可以看到關於攻擊者控制的資產發生了改變,但此時仍然沒有獲益:
Figure 4: Margin Pumping With bZx (and Kyber + Uniswap)
二級標題
圖片描述
二級標題
圖片描述
Figure 5: WBTC Dumping With Uniswap
第五步:閃貸還款
二級標題
第五步:閃貸還款
二級標題
在這一步之後,我們重新計算了以下資產詳情。結果顯示,攻擊者通過此次攻擊獲得71 ETH,加上這兩個鎖倉:Compound(+5,500weth/-112WBTC)和bZx(-4,337WETH/+51WBTC)。 bZx 鎖倉處於違約狀態,Compound 的鎖倉是有利可圖的。顯然,在攻擊之後,攻擊者就開始償還Compoud 債務(112BTC)以贖回抵押的5,500 個WETH。由於bZx 鎖倉已經處於違約狀態,攻擊者也不再感興趣了。
二級標題
二級標題
參考1WBTC=38.5WETH(1WETH=0.025BTC)的平均市場價格,若攻擊者以市場價格購入112 WBTC花費約需4,300個ETH。此112 WBTC 用以清償Compond 債務並取回抵押品5,500 ETH,則最終攻擊者總共獲利為71 WETH +5,500 WETH -4,300 ETH=1,271 ETH,合計大約$355,880(當前ETH價格$280)。
二級標題
硬核解析:bZx 可規避風險代碼邏輯缺陷
通過前面攻擊者在合約中實現的步驟可以看出,問題的核心原因是在第三步調用marginTradeFromDeposit() 通過借貸的1,300 ETH,加5倍槓桿來實現做空ETH/WBTC 交易的,於是我們進一步審查合約代碼,發現這是一個「可避免的套利機會」,但因為代碼存在的邏輯錯誤造成可用於規避風險的代碼邏輯沒有生效。具體代碼追踪如下:
首先是marginTradeFromDeposit( ) 調用_borrowTokenAndUse( ),此處由於是以存入的資產作槓桿交易,第四個參數為true(第840行)。
在_borrowTokenAndUse( ) 裡,當amountIsADeposit 為true 時,調用_getBorrowAmountAndRate( ) 並且將borrowAmount 存入sentAmounts[1] (第1,348行)。
在1,355 行,sentAmounts[6] 被設置為sentAmounts[1] 並且於第1,370行調用_borrowTokenAndUseFinal( )