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 全部提取。建议项目方在设计代码运行逻辑时要多方验证,合约上线前审计时尽量选择多个审计公司交叉审计。
【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。