我们监控到多起针对 Ethereum 链上项目 Sorra 攻击事件,攻击共造成 41, 000 USD 的损失。
<!--StartFragment-->
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 的损失。
<!--EndFragment-->
<!--StartFragment-->
2024年12月21日,攻击者通过 staking 来开始攻击前的准备,
<!--EndFragment-->
<!--StartFragment-->
由于, staking 时选择的 _tier 为0, 根据合约,锁仓期限为14天,
<!--EndFragment-->
<!--StartFragment-->
14天后,也就是2025年1月4日攻击者开始攻击。攻击者通过 withdraw 中,使 _amount 为1。我们看一下 withdraw 函数的具体实现。
<!--EndFragment-->
<!--StartFragment-->
上述代码整体的逻辑如下,首选判断用户的 deposit 的资产是否到期,然后再计算 reward ,最后减去 position 。
首先看如何计算 reward;
<!--EndFragment-->
<!--StartFragment-->
从代码中我们可以看出,计算 reward 是计算了所有到期的 deposit 的 reward ,这块看起来没有什么问题。
我们接下来看一下如何更新 position ;
<!--EndFragment-->
<!--StartFragment-->
在 updatePosition 中,由于没有设置 vaultExtension 所以直接到 _decreasePosition 函数中。在 _decreasePosition 函数中,仅仅是做了提取金额仓位减少操作。所以,漏洞就出现在这里,当用户 deposit 到期后,可以提取任意金额的存款,同时会提取到所有到期存款的 reward 。但是,由于没有判断 reward 是否已经被提取,所以会重复提取 reward 。
<!--EndFragment-->
<!--StartFragment-->
本次漏洞的成因是 Sorra 项目方在用户 withdraw 时,没有判断用户是否已经提取过了 reward ,导致用户可以通过大量的操作重复提取 reward 。攻击者利用上述漏洞发起多次交易,将 Sorra 项目中的 SOR Token 全部提取。建议项目方在设计代码运行逻辑时要多方验证,合约上线前审计时尽量选择多个审计公司交叉审计。
<!--EndFragment-->
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!