背景介紹
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 來開始攻擊前的準備,
由於, staking 時選擇的_tier 為0, 根據合約,鎖倉期限為14天,
14天后,也就是2025年1月4日攻擊者開始攻擊。攻擊者透過withdraw 中,使_amount 為1。讓我們來看看withdraw 函數的具體實作。
上述程式碼整體的邏輯如下,首選判斷使用者的deposit 的資產是否到期,然後再計算reward ,最後減去position 。
首先看如何計算reward;
從程式碼中我們可以看出,計算reward 是計算了所有到期的deposit 的reward ,這塊看起來沒有什麼問題。
我們接下來來看看如何更新position ;
在updatePosition 中,由於沒有設定vaultExtension 所以直接到_decreasePosition 函數中。在_decreasePosition 函數中,只是做了提取金額部位減少操作。所以,漏洞就出現在這裡,當用戶deposit 到期後,可以提取任何金額的存款,同時會提取到所有到期存款的reward 。但是,由於沒有判斷reward 是否已經被提取,所以會重複提取reward 。
總結
這次漏洞的成因是Sorra 專案方在使用者withdraw 時,沒有判斷使用者是否已經提取過了reward ,導致使用者可以透過大量的操作重複提取reward 。攻擊者利用上述漏洞發動多次交易,將Sorra 專案中的SOR Token 全部提取。建議專案方在設計程式碼運作邏輯時要多方驗證,合約上線前審計時盡量選擇多個審計公司交叉審計。