【漏洞分析】20250105-SorraStaking:獎勵金額計算錯誤,每次取款都有大收益
背景信息
2024-12-21 11:58:11 (UTC)
2025-01-04 11:59:23 (UTC)
- 攻擊交易 1:https://app.blocksec.com/explorer/tx/eth/0x6439d63cc57fb68a32ea8ffd8f02496e8abad67292be94904c0b47a4d14ce90d
- 攻擊交易 2:https://app.blocksec.com/explorer/tx/eth/0xf1a494239af59cd4c1d649a1510f0beab8bb78c62f31e390ba161eb2c29fbf8b
- 攻擊交易 3:https://app.blocksec.com/explorer/tx/eth/0x09b26b87a91c7aea3db05cfcf3718c827eba58c0da1f2bf481505e0c8dc0766b
漏洞合約:https://vscode.blockscan.com/ethereum/0x5d16b8ba2a9a4eca6126635a6ffbf05b52727d50
sorraStaking 項目是一個質(zhì)押獎勵項目,用戶質(zhì)押 SOR 代幣并鎖定一段時間,解鎖后獲取 SOR 代幣作為獎勵。
Trace 分析
準(zhǔn)備交易
在 2024-12-21 11:58:11 (UTC),攻擊者進行了一筆 deposit 操作。

攻擊交易
由于三筆攻擊交易類似,所以只分析其中一筆。
在 deposit 操作的 13 天后,攻擊者進行了后續(xù)的攻擊操作。攻擊者反復(fù)調(diào)用 withdraw 函數(shù),雖然每次只取回 _amount = 1 的代幣,但是能夠獲得大量的獎勵代幣。

然后將獲得的 SOR 代幣進行出售,最后支付 bundler 的費用。

代碼分析
當(dāng)用戶執(zhí)行 deposit 進行質(zhì)押時,合約收取質(zhì)押代幣,并記錄倉位

deposite → _updatePosition → _increasePosition
_increasePosition 函數(shù)記錄質(zhì)押的數(shù)量,時間和利率等相關(guān)信息。

在 withdraw 函數(shù)中,會先計算用戶的獎勵代幣數(shù)量 rewardAmount,然后將 (_amount + rewardAmount) 一同發(fā)給用戶。

通過 _calculateRewards 函數(shù)來計算獎勵金額。

代碼問題:
- 每次所領(lǐng)取的獎勵金額都是按照用戶質(zhì)押的總金額來計算的,而不是當(dāng)前取款數(shù)額對應(yīng)的獎勵金額。
withdraw函數(shù)可以將質(zhì)押金額進行分批提取。
所以攻擊者通過多次調(diào)用 withdraw 函數(shù)來贖回部分質(zhì)押代幣,卻每次都能獲取到對應(yīng)所有質(zhì)押金額的獎勵代幣,最終獲得超額的收益。

浙公網(wǎng)安備 33010602011771號