{"author":{"address":"0xbD0b3505cc45d97DdB3e7FAa75ED0Fc41c61A354","user":"https://learnblockchain.cn/people/52"},"content":{"body":"![登链封面(事件).jpg](https://img.learnblockchain.cn/attachments/2025/01/m3g7Grkw678771654dc0e.jpg)\r\n\r\n\u003c!--StartFragment--\u003e\r\n\r\n# **背景介绍**\r\n\r\n2025年1月4日，我们监测到多起针对 Ethereum 链上项目 Sorra 攻击事件，攻击hash为：\r\n\r\n**https\\://etherscan.io/tx/0x6439d63cc57fb68a32ea8ffd8f02496e8abad67292be94904c0b47a4d14ce90d**\r\n\r\n\r\n\r\n**https\\://etherscan.io/tx/0x03ddae63fc15519b09d716b038b2685f4c64078c5ea0aa71c16828a089e907fd**\r\n\r\n\r\n\r\n**https\\://etherscan.io/tx/0xf1a494239af59cd4c1d649a1510f0beab8bb78c62f31e390ba161eb2c29fbf8b**\r\n\r\n\r\n\r\n**https\\://etherscan.io/tx/0x09b26b87a91c7aea3db05cfcf3718c827eba58c0da1f2bf481505e0c8dc0766b**\r\n\r\n\r\n被攻击的项目为 **Sorra** ，攻击共造成 41, 000 USD 的损失。 \r\n\r\n\u003c!--EndFragment--\u003e\r\n\r\n\u003c!--StartFragment--\u003e\r\n\r\n# **攻击及事件分析**\r\n\r\n\r\n2024年12月21日，攻击者通过 staking 来开始攻击前的准备，\r\n\r\n\u003c!--EndFragment--\u003e\r\n\r\n\r\n![1.png](https://img.learnblockchain.cn/attachments/2025/01/VeTHFks1678772058c087.png)\r\n\u003c!--StartFragment--\u003e\r\n\r\n由于， staking 时选择的 \\_tier 为0， 根据合约，锁仓期限为14天，\r\n\r\n\u003c!--EndFragment--\u003e\r\n\r\n\r\n![2.png](https://img.learnblockchain.cn/attachments/2025/01/QOMYcrEh678772576e952.png)\r\n\r\n\u003c!--StartFragment--\u003e\r\n\r\n14天后，也就是2025年1月4日攻击者开始攻击。攻击者通过 withdraw 中，使 \\_amount 为1。我们看一下 withdraw 函数的具体实现。 \r\n\r\n\u003c!--EndFragment--\u003e\r\n\r\n![3.png](https://img.learnblockchain.cn/attachments/2025/01/Jl7n3naF678772642bb27.png)\r\n\u003c!--StartFragment--\u003e\r\n\r\n上述代码整体的逻辑如下，首选判断用户的 deposit 的资产是否到期，然后再计算 reward ，最后减去 position 。\r\n\r\n**首先看如何计算 reward；** \r\n\r\n\u003c!--EndFragment--\u003e\r\n\r\n\r\n![4.png](https://img.learnblockchain.cn/attachments/2025/01/SYXr8Bff67877276d4e21.png)\r\n\r\n\u003c!--StartFragment--\u003e\r\n\r\n从代码中我们可以看出，计算 reward 是计算了所有到期的 deposit 的 reward ，这块看起来没有什么问题。\r\n\r\n**我们接下来看一下如何更新 position ；**\r\n\r\n\u003c!--EndFragment--\u003e\r\n\r\n![5.png](https://img.learnblockchain.cn/attachments/2025/01/N6Pv2YxK6787728501c9b.png)\r\n\r\n![6.png](https://img.learnblockchain.cn/attachments/2025/01/y5RmTI3y6787728534407.png)\r\n\r\n\u003c!--StartFragment--\u003e\r\n\r\n在 updatePosition 中，由于没有设置 vaultExtension 所以直接到 \\_decreasePosition 函数中。在 \\_decreasePosition 函数中，仅仅是做了提取金额仓位减少操作。所以，漏洞就出现在这里，当用户 deposit 到期后，可以提取任意金额的存款，同时会提取到所有到期存款的 reward 。但是，由于没有判断 reward 是否已经被提取，所以会重复提取 reward 。\r\n\r\n\u003c!--EndFragment--\u003e\r\n\r\n\u003c!--StartFragment--\u003e\r\n\r\n# **总结**\r\n\r\n本次漏洞的成因是 Sorra 项目方在用户 withdraw 时，没有判断用户是否已经提取过了 reward ，导致用户可以通过大量的操作重复提取 reward 。攻击者利用上述漏洞发起多次交易，将 Sorra 项目中的 SOR Token 全部提取。建议项目方在设计代码运行逻辑时要多方验证，合约上线前审计时尽量选择多个审计公司交叉审计。\r\n\r\n\u003c!--EndFragment--\u003e","title":"零时科技 || SorraStaking 攻击事件分析"},"history":null,"timestamp":1736929986,"version":1}