2023 年 11 月 23 日,因為 Tick 操縱和流動性重複計數,KyberSwap 在乙太坊、Arbitrum 等多個網路上受到駭客攻擊,攻擊者已獲利約 4800 萬美元。

SharkTeam 對此事件第一時間進行了技術分析,並總結了安全防範手段,希望後續專案可以引以為戒,共築區塊鏈行業的安全防線。
這次攻擊事件比較複雜,攻擊實現也比較巧妙,我們選擇其中一筆攻擊交易進行詳細分析和說明。
攻擊交易:
0x09a3a12d58b0bb80e33e3fb8e282728551dc430c65d1e520fe0009ec519d75e8
攻擊者位址:
0x50275E0B7261559cE1644014d4b78D4AA63BE836
攻擊者合約:
0xaF2Acf3D4ab78e4c702256D214a3189A874CDC13
在這次交易中,攻擊者針對 3 個不同的流動性池進行一系列操作用來耗盡池中的資金。 我們選擇了一個池進行攻擊流程分析,這些池彼此獨立存在。
攻擊流程:
1.攻擊者先是通過閃電貸貸了 10, 000 枚 wstETH,隨後將約 2, 998 枚 wstETH 添加進池子里,swap 出來約 2, 842 枚 WETH;

2.此時池子里對應的 Tick 狀態為-110, 910 ,wstETH 的價格從 1.05 ETH 變為 0.000015257 。 此時池子的流動性為 0 ,為接下來製造虛假的流動性做鋪墊;

3.攻擊者在[ 0.000014659 , 0.000015260 ]範圍中添加 3.4 wstETH 流動性,並且移除 0.56 wstETH;

4.接下來,攻擊者進行兩次 swap,分別是 WETH->wstETH、wstETH->WETH。 第一次 swap 後,將價格壓至 0.000014657 ,比 0.000014659 稍微低點。 第二次 swap 後,將價格抬高至 0.000016368 ;

5.一開始是池子裡有約為 3 wstETH 流動性(mint 3.4 wstETH - burn 0.56 wstETH),現在池子里約為(1, 056 + 3, 911)枚,顯然更多;
6.攻擊歸還閃電貸后,並且從攻擊合約轉走資金

本次攻擊事件根本原因:在 computeSwapStep 函數中,計算 Tick 時存在精度損失。 由於 Tick 可被操縱,成功繞過了_updateLiquidityAndCrossTick 函數,因而可以反覆增加流動性。
1.在第一次 swap 中,攻擊者利用 calcReachAmount 函數計算 wstETH 數量,最後計算得出 1, 056.0567356382208000000 ;

2.調用 estimateIncrementalLiquidity 和 calcFinalPrice 函數后,傳入的數量為 1, 056.056735638220799999 。 經過 round up 和 round down 處理后,此時 Tick 為-111311 ,而下限 Tick 為 -111310 。 因此,通過 nextTick = currentTick+ 1 ,並使用“!=”對兩個 sqrtP 參數進行判斷,成功繞過了_updateLiquidityAndCrossTick 函數,避免了流動性的更新;

3.在第二次 swap 時候,調用了_updateLiquidityAndCrossTick,增加了流動性。 由於第一次 swap 時數量計算發生精度損失,導致流動性未更新移除,從而導致第二次計算流動性時出現雙倍的情況。

針對這次的攻擊事件,開發人員在日常開發中應採取以下安全措施:
1.注意正確計算業務中的不變量和數學邏輯,避免精度損失。
2.項目發版前,需要與第三方專業的審計團隊合作,進行合約審計。
SharkTeam 的願景是保護Web3世界的安全。 團隊由來自世界各地的經驗豐富的安全專業人士和高級研究人員組成,精通區塊鏈和智慧合約底層理論。 提供包括鏈上大數據分析、鏈上風險預警、智慧合約審計、加密資產追討等服務,並打造了鏈上大數據分析和風險預警平臺 ChainAegis,平臺支持無限層級的深度圖分析,能有效對抗Web3世界的高級持續性攻擊(Advanced Persistent Threat,APT)風險。 已與Web3生態各領域的關鍵參與者,如 Polkadot、Moonbeam、polygon、Sui、OKX、imToken、ChainIDE 等建立長期合作關係。
官網:
唽:
不和:
電報: