SorStaking合约攻击分析---代码逻辑漏洞
基本信息
2025.1.5日SorStaking合约遭受逻辑漏洞攻击,只损失了43K。虽然金额不多,但是警钟长鸣,我还是写一下分析,给自己提个醒。 首次纰漏的X: https://x.com/TenArmorAlert/status/1875582709512188394 其中一笔攻击交易: https://app.blocksec.com/explorer/tx/eth/0x03ddae63fc15519b09d716b038b2685f4c64078c5ea0aa71c16828a089e907fd?line=2 被害合约代码: https://vscode.blockscan.com/ethereum/0x5d16b8ba2a9a4eca6126635a6ffbf05b52727d50
黑客攻击步骤
黑客的攻击步骤很简单,他在14天前存入了一笔资金。然后14天后开始withdraw之前存入的钱。每次withdraw只提取1个token,重复withdraw700次,截图如下:
在withdraw可以看到,虽然黑客withdraw amount为1,但是在内部transfer时候,sor合约给黑客转了6143个SOR token。
代码漏洞
为什么withdraw 1个token,可以得到6143个token,深入withdraw代码初见端倪: 可以看到withdraw的时候,不仅返回用户需要提取的_amount,还要计算用户是否有奖励rewardAmount。如果rewardAmount不为零,则返回用户_amount+rewardAmount。计算rewardAmount的代码在getPendingRewards方法中,如下图:
在234行可以看到,rewardAmount最终计算方法是:遍历用户所有的质押,每一次质押的所有资产deposit.amount乘以一个系数(deposit.rewardBps/10000),这个系数在1%左右,是预先设置的定值。再将所有计算出来的reward相加,得到最终的rewardAmount。 所以漏洞就在于,假设我的仓位只有一次deposit,且deposit了10000个token,即使我只withdraw1个token,我的rewardAmount依然是100001%=100. 每次我withdraw1个token,都会获得101个token。 我猜这个地方的逻辑原本是rewardAmount=withdrawAmount1%,但是不知出于什么原因,把depositAmount错当成了要withdrawAmount。
总结
- 作为合约审计人员一定要对资金计算的逻辑多看,理解透,多看十遍也值得。
- 如果是仿盘,对已有项目进行改造再发布的情况,往往更可怕。因为逻辑改动可能由于对代码理解不足造成重大逻辑漏洞。
版权声明
本文仅代表作者观点,不代表区块链技术网立场。
本文系作者授权本站发表,未经许可,不得转载。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。