2025.1.5日SorStaking合约遭受逻辑漏洞攻击,只损失了43K。本文对此次攻击进行梳理。
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。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!