背景介紹

2025年1月4日,我們監控多起針對Ethereum 鏈上項目Sorra 攻擊事件,攻擊hash為:

https://etherscan.io/tx/0x6439d63cc57fb68a32ea8ffd8f02496e8abad67292be94904c0b47a4d14ce90d

https://etherscan.io/tx/0x03ddae63fc15519b09d716b038b2685f4c64078c5ea0aa71c16828a089e907fd

https://etherscan.io/tx/0xf1a494239af59cd4c1d649a1510f0beab8bb78c62f31e390ba161eb2c29fbf8b

https://etherscan.io/tx/0x09b26b87a91c7aea3db05cfcf3718c827eba58c0da1f2bf481505e0c8dc0766b

被攻擊的項目為Sorra ,攻擊共造成41, 000 USD 的損失。

攻擊及事件分析

2024年12月21日,攻擊者透過staking 來開始攻擊前的準備,

零時科技 || SorraStaking 攻擊事件分析

由於, staking 時選擇的_tier 為0, 根據合約,鎖倉期限為14天,

零時科技 || SorraStaking 攻擊事件分析

14天后,也就是2025年1月4日攻擊者開始攻擊。攻擊者透過withdraw 中,使_amount 為1。讓我們來看看withdraw 函數的具體實作。

零時科技 || SorraStaking 攻擊事件分析

上述程式碼整體的邏輯如下,首選判斷使用者的deposit 的資產是否到期,然後再計算reward ,最後減去position 。

首先看如何計算reward;

零時科技 || SorraStaking 攻擊事件分析

從程式碼中我們可以看出,計算reward 是計算了所有到期的deposit 的reward ,這塊看起來沒有什麼問題。

我們接下來來看看如何更新position ;

零時科技 || SorraStaking 攻擊事件分析

零時科技 || SorraStaking 攻擊事件分析

在updatePosition 中,由於沒有設定vaultExtension 所以直接到_decreasePosition 函數中。在_decreasePosition 函數中,只是做了提取金額部位減少操作。所以,漏洞就出現在這裡,當用戶deposit 到期後,可以提取任何金額的存款,同時會提取到所有到期存款的reward 。但是,由於沒有判斷reward 是否已經被提取,所以會重複提取reward 。

總結

這次漏洞的成因是Sorra 專案方在使用者withdraw 時,沒有判斷使用者是否已經提取過了reward ,導致使用者可以透過大量的操作重複提取reward 。攻擊者利用上述漏洞發動多次交易,將Sorra 專案中的SOR Token 全部提取。建議專案方在設計程式碼運作邏輯時要多方驗證,合約上線前審計時盡量選擇多個審計公司交叉審計。