Bienvenue de nouveau dans le Spotlight sur les vulnérabilités de Sherlock, où nous mettons en lumière une vulnérabilité impactante découverte lors d'un audit de Sherlock. Cette semaine, nous avons une Déni de Service en Chaîne (CDoS). Elle a été découverte par @0xPapaPitufo lors du concours L2 de @MorphLayer. 🧵👇
Dans Rollup.sol, si un lot malveillant est proposé, l'hypothèse est que le séquenceur qui l'a proposé perdra le défi, sera sanctionné et la chaîne sera réinitialisée. Ces incitations économiques empêchent la chaîne d'être régulièrement arrêtée. Cela repose sur l'hypothèse qu'un séquenceur ne peut gagner des défis que si le lot qu'il a proposé est valide.
Cependant, la vérification que prevStateRoot est le postStateRoot du lot précédent n'a lieu que dans finalizeBatch(). Cette vérification est suffisante pour empêcher que des lots avec de faux prevStateRoots soient finalisés, mais elle ne stoppe pas ces lots d'être engagés. Cela permet à un séquenceur malveillant de proposer n'importe quel lot qui effectue une transaction d'état valide sur un faux prevStateRoot.
Dans la plupart des cas, un challenger attaquera ce lot invalide. Cependant, le séquenceur peut fournir une preuve valide de cette transition d'état pour voler le dépôt de l'honnête challenger et gagner le défi. Dans le cas où cela se produit, ou qu'aucun défi n'est effectué, le lot engagé ne pourra pas être finalisé en raison de la vérification suivante : Cela gèlera la chaîne et n'autorisera aucun nouveau lot à être finalisé, puisque les lots sont engagés séquentiellement et doivent être finalisés séquentiellement.
Le chemin d'attaque : 1) L'attaquant propose un lot qui contient une transition d'état valide à partir d'un faux prevStateRoot. 2) Si un challenger honnête conteste le lot, l'attaquant fournit une preuve valide de la transition d'état pour gagner le défi et voler le dépôt du challenger. 3) Quoi qu'il en soit, la chaîne est maintenant arrêtée, car le lot de l'attaquant ne peut pas être finalisé, et aucun autre lot ne peut être finalisé sans que celui-ci soit d'abord finalisé. 4) L'attaquant ne sera pas sanctionné, car il a gagné le défi.
Quel est l'impact ? Un défi honnête qui perdra son dépôt lorsqu'un séquenceur malhonnête le battra dans un défi, et aucun nouveau lot ne pourra être finalisé, provoquant un déni de service de la chaîne, et devra être annulé manuellement par les administrateurs.
L'atténuation : Vérifiez dans commitBatch() que prevStateRoot est égal à parentBatchHeader.postStateRoot.
Nous sommes fiers d'avoir aidé à sécuriser @morphlayer grâce à cette découverte. Quand il faut absolument que ce soit sécurisé, Sherlock est le bon choix.
2,78K