Witaj z powrotem w Sherlock's Vulnerability Spotlight, gdzie podkreślamy istotną lukę wykrytą podczas audytu Sherlocka. W tym tygodniu mamy do czynienia z Chain Denial of Service (CDoS). Została ona odkryta przez @0xPapaPitufo podczas konkursu @MorphLayer L2. 🧵👇
W Rollup.sol, jeśli zostanie zaproponowana złośliwa partia, zakłada się, że sekwencer, który ją zaproponował, przegra wyzwanie, zostanie ukarany i łańcuch zostanie zresetowany. Te zachęty ekonomiczne zapobiegają regularnemu zatrzymywaniu łańcucha. Opiera się to na założeniu, że sekwencer może wygrać wyzwania tylko wtedy, gdy zaproponowana przez niego partia jest ważna.
Jednakże sprawdzenie, że prevStateRoot jest postStateRoot poprzedniej partii, odbywa się tylko w finalizeBatch(). To sprawdzenie jest wystarczające, aby zapobiec finalizacji partii z fałszywymi prevStateRoots, ale nie powstrzymuje tych partii przed byciem zatwierdzonymi. Pozwala to złośliwemu sekwencerowi na zaproponowanie dowolnej partii, która wykonuje ważną transakcję stanu na fałszywym prevStateRoot.
W większości przypadków, wyzywający zaatakuje tę nieprawidłową partię. Jednak sekwencer może dostarczyć ważny dowód na tę zmianę stanu, aby ukraść depozyt uczciwego wyzywającego i wygrać wyzwanie. W przypadku, gdy to się zdarzy, lub gdy nie zostanie przeprowadzone żadne wyzwanie, zatwierdzona partia nie będzie mogła zostać sfinalizowana z powodu następującej kontroli: To zablokuje łańcuch i nie pozwoli na sfinalizowanie żadnych nowych partii, ponieważ partie są zatwierdzane sekwencyjnie i muszą być sfinalizowane sekwencyjnie.
Ścieżka ataku: 1) Atakujący proponuje partię, która zawiera ważną zmianę stanu z fałszywego prevStateRoot. 2) Jeśli uczciwy wyzywający zakwestionuje partię, atakujący dostarcza ważny dowód zmiany stanu, aby wygrać wyzwanie i ukraść depozyt wyzywającego. 3) Niezależnie od tego, co się wydarzy, łańcuch jest teraz wstrzymany, ponieważ partia atakującego nie może zostać sfinalizowana, a żadne inne partie nie mogą zostać sfinalizowane bez jej wcześniejszej finalizacji. 4) Atakujący nie zostanie ukarany, ponieważ wygrał wyzwanie.
Jaki jest wpływ? Uczciwe wyzwanie, które straci swój depozyt, gdy nieuczciwy sekwencer pokona je w wyzwaniu, a żadne nowe partie nie będą mogły zostać sfinalizowane, co spowoduje odmowę usługi łańcucha i będzie musiało zostać ręcznie cofnięte przez administratorów.
Łagodzenie: Sprawdź w commitBatch(), czy prevStateRoot jest równy parentBatchHeader.postStateRoot.
Jesteśmy dumni, że mogliśmy pomóc zabezpieczyć @morphlayer dzięki temu odkryciu. Kiedy bezpieczeństwo jest absolutnie konieczne, Sherlock to właściwy wybór.
3,08K