零时科技 || RareStaking 攻击事件分析

我们监控到 Ethereum 上针对 RareStaking 的攻击事件,攻击共造成25.8kUSD 的损失

登链封面(事件).jpg

<!--StartFragment-->

背景介绍

2025年7⽉28⽇,我们监控到 Ethereum 上针对 RareStaking 的攻击事件https\://etherscan.io/tx/0xd813751bfb98a51912b8394b5856ae4515be6a9c6e5583e06b41d9255ba6e3c1,

攻击共造成25.8kUSD 的损失。

<!--EndFragment-->

<!--StartFragment-->

攻击及事件分析

⾸先,攻击者创建了⼀个攻击合约,并在攻击合约中获取了 RareStaking 对应的 Staking Token 。

<!--EndFragment-->

1.png

<!--StartFragment-->

随后,攻击者通过调⽤ updateMerkleRoot 更新了 Merkle Tree Root 。

<!--EndFragment-->

2.png

<!--StartFragment-->

让我们看⼀下 updateMerkleRoot 的代码:

<!--EndFragment-->

<!--StartFragment-->

    function updateMerkleRoot(bytes32 newRoot) external override {        
        require((msg.sender != owner() || msg.sender != 
address(0xc2F394a45e994bc81EfF678bDE9172e10f7c8ddc)), "Not authorized to update merkle root");                
        if (newRoot == bytes32(0)) revert EmptyMerkleRoot();        
        currentClaimRoot = newRoot;        
        currentRound++;        
        emit NewClaimRootAdded(newRoot, currentRound, block.timestamp);    }

<!--EndFragment-->

<!--StartFragment-->

⼀般来说,更新 Merkle Tree Root 是敏感操作,通常需要管理员或者运营⼈员才可能更改。但是程序代码中的逻辑,不是 owner 且不是项⽬⽅地址的⼈才可以更改,显然,开发者把 require 的功能理解错了。在攻击者 updateMerkleRoot 后,便发起了 claim ,提取了项⽬中的所有 Token 。

<!--EndFragment-->

3.png

<!--StartFragment-->

由于 MerkleRoot 已经被攻击者修改,所以 claim 可以通过验证。在被攻击后,项⽬⽅在交易

https\://etherscan.io/tx/0x65f37e4b1ec995adadd3f264a77f67b6bcbb52f16f29cf3302c9bf90396aa67e

中升级了实现合约,将 updateMerkleRoot 的代码修改为下⾯的代码:

<!--EndFragment-->

<!--StartFragment-->

function updateMerkleRoot(bytes32 newRoot) external override {         
    if (             
        (msg.sender != owner() &&                 
            msg.sender !=                 
            address(0xc2F394a45e994bc81EfF678bDE9172e10f7c8ddc))         
    ) revert NotAuthorized();        
    if (newRoot == bytes32(0)) revert EmptyMerkleRoot();         
    currentClaimRoot = newRoot;         
    currentRound++;         
    emit NewClaimRootAdded(newRoot, currentRound, block.timestamp);    }

<!--EndFragment-->

<!--StartFragment-->

可以看到,修改后的逻辑才能正确验证调⽤者的权限。

总结

本次漏洞的成因是函数 updateMerkleRoot 函数在校验调⽤者权限时,没有正确理解 require 的作⽤,导致权限验证失效。最终,导致攻击者通过权限校验修改了 MerkleTreeRoot 后通过验证提取了项⽬所有资⾦。建议项⽬⽅在设计经济模型和代码运⾏逻辑时要多⽅验证,合约上线前审计时尽量选择多个审计公司交叉审计。

<!--EndFragment-->

noneage服务产品介绍.jpg

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
零时科技
零时科技
0xbD0b...A354
专注区块链生态安全