欢迎回到Sherlock的漏洞聚焦,我们在这里突出在Sherlock审计中发现的一个重要漏洞。 本周,我们发现了一个链式拒绝服务(CDoS)。 这是由@0xPapaPitufo在@MorphLayer L2比赛中发现的。 🧵👇
在 Rollup.sol 中,如果提出了一个恶意批次,假设提出该批次的排序者将会输掉挑战,受到惩罚,并且链将被重置。这些经济激励措施防止链被定期暂停。 这基于一个假设,即排序者只有在他们提出的批次有效时才能赢得挑战。
然而,prevStateRoot 是前一个批次的 postStateRoot 的检查仅在 finalizeBatch() 中进行。这个检查足以防止带有虚假 prevStateRoots 的批次被最终确定,但并不能阻止这些批次被提交。 这使得恶意的排序者可以提议任何在虚假 prevStateRoot 上执行有效状态交易的批次。
在大多数情况下,挑战者会攻击这个无效的批次。然而,排序者可以提供这个状态转移的有效证明,以窃取诚实挑战者的押金并赢得挑战。 如果发生这种情况,或者没有进行挑战,已提交的批次将无法最终确定,原因如下检查: 这将冻结链,不允许任何新的批次被最终确定,因为批次是按顺序提交的,必须按顺序最终确定。
攻击路径: 1)攻击者提出一个包含来自假 prevStateRoot 的有效状态转换的批次。 2)如果一个诚实的挑战者对该批次提出挑战,攻击者提供有效的状态转换证明以赢得挑战并窃取挑战者的押金。 3)无论上述情况是否发生,链条现在已被暂停,因为攻击者的批次无法被最终确定,且在其被最终确定之前,其他批次也无法被最终确定。 4)攻击者不会被削减,因为他们赢得了挑战。
这有什么影响? 一个诚实的挑战将在不诚实的排序者在挑战中击败它时失去其押金,并且将无法完成新的批次,导致链的拒绝服务,并且必须由管理员手动回滚。
缓解措施: 在 commitBatch() 中检查 prevStateRoot 是否等于 parentBatchHeader.postStateRoot。
我们很自豪能够通过这次发现帮助 @morphlayer 确保安全。 当绝对需要安全时,Sherlock 是正确的选择。
2.78K