Bentornati al Vulnerability Spotlight di Sherlock, dove mettiamo in evidenza una vulnerabilità significativa scoperta durante un audit di Sherlock. Questa settimana, abbiamo un Denial of Service a Catena (CDoS). È stata scoperta da @0xPapaPitufo durante il contest L2 di @MorphLayer. 🧵👇
In Rollup.sol, se viene proposta una batch malevola, l'assunzione è che il sequencer che l'ha proposta perderà la sfida, verrà penalizzato e la catena verrà ripristinata. Questi incentivi economici impediscono che la catena venga regolarmente interrotta. Questo si basa sull'assunzione che un sequencer possa vincere le sfide solo se la batch che ha proposto è valida.
Tuttavia, il controllo che prevStateRoot sia il postStateRoot del batch precedente avviene solo in finalizeBatch(). Questo controllo è sufficiente per impedire che batch con prevStateRoots falsi vengano finalizzati, ma non ferma questi batch dall'essere impegnati. Questo consente a un sequencer malevolo di proporre qualsiasi batch che esegua una transazione di stato valida su un prevStateRoot falso.
Nella maggior parte dei casi, un sfidante attaccherà questo lotto non valido. Tuttavia, il sequencer può fornire una prova valida di questa transizione di stato per rubare il deposito dell'onesto sfidante e vincere la sfida. Nel caso in cui ciò accada, o che non venga effettuata alcuna sfida, il lotto impegnato non potrà essere finalizzato a causa del seguente controllo: Questo congelerà la catena e non permetterà a nuovi lotti di essere finalizzati, poiché i lotti sono impegnati in modo sequenziale e devono essere finalizzati in modo sequenziale.
Il percorso dell'attacco: 1) L'attaccante propone un lotto che contiene una transizione di stato valida da un fake prevStateRoot. 2) Se un onesto sfidante contesta il lotto, l'attaccante fornisce una prova valida della transizione di stato per vincere la sfida e rubare il deposito dello sfidante. 3) Indipendentemente dal fatto che quanto sopra accada o meno, la catena è ora bloccata, poiché il lotto dell'attaccante non può essere finalizzato e nessun altro lotto può essere finalizzato senza che questo venga prima finalizzato. 4) L'attaccante non sarà penalizzato, perché ha vinto la sfida.
Qual è l'impatto? Una sfida onesta che perderà il suo deposito quando un sequencer disonesto la batterà in una sfida, e nessun nuovo lotto potrà essere finalizzato, causando un Denial of Service della Chain, e dovrà essere ripristinato manualmente dagli amministratori.
La Mitigazione: Controlla in commitBatch() che prevStateRoot sia uguale a parentBatchHeader.postStateRoot.
Siamo orgogliosi di aver contribuito a garantire @morphlayer attraverso questa scoperta. Quando è assolutamente necessario essere sicuri, Sherlock è la scelta giusta.
1,92K