Bem-vindo de volta ao Destaque de Vulnerabilidade do Sherlock, onde destacamos uma vulnerabilidade impactante descoberta durante uma auditoria do Sherlock. Esta semana, temos uma Negação de Serviço em Cadeia (CDoS). Foi descoberto por @0xPapaPitufo durante o concurso @MorphLayer L2. 🧵👇
No Rollup.sol, se um lote malicioso for proposto, a suposição é que o sequenciador que o propôs perderá o desafio, será cortado e a cadeia será redefinida. Esses incentivos econômicos impedem que a cadeia seja interrompida regularmente. Isso se baseia na suposição de que um sequenciador só pode vencer desafios se o lote que ele propôs for válido.
No entanto, a verificação de que prevStateRoot é o postStateRoot do lote anterior só acontece em finalizeBatch(). Essa verificação é suficiente para impedir que lotes com prevStateRoots falsos sejam finalizados, mas não impede que esses lotes sejam confirmados. Isso permite que um sequenciador mal-intencionado proponha qualquer lote que execute uma transação de estado válida em um prevStateRoot falso.
Na maioria dos casos, um desafiante atacará esse lote inválido. No entanto, o sequenciador pode fornecer uma prova válida dessa transição de estado para roubar o depósito do desafiante honesto e vencer o desafio. Caso isso aconteça, ou que nenhum desafio seja executado, o lote confirmado não poderá ser finalizado devido à seguinte verificação: Isso congelará a cadeia e não permitirá que novos lotes sejam finalizados, pois os lotes são confirmados sequencialmente e devem ser finalizados sequencialmente.
O caminho do ataque: 1) O invasor propõe um lote que contém uma transição de estado válida de um prevStateRoot falso. 2) Se um desafiante honesto contestar o lote, o atacante fornece uma prova válida da transição de estado para vencer o desafio e roubar o depósito do desafiante. 3) Quer o acima aconteça ou não, a cadeia agora está interrompida, pois o lote do invasor não pode ser finalizado e nenhum outro lote pode ser finalizado sem que seja finalizado primeiro. 4) O atacante não será cortado, porque venceu o desafio.
Qual é o impacto? Um desafio honesto que perderá seu depósito quando um sequenciador desonesto o vencer em um desafio, e nenhum novo lote poderá ser finalizado, causando Negação de Serviço da Cadeia, e terá que ser revertido manualmente pelos administradores.
A mitigação: Verifique em commitBatch() se prevStateRoot é igual a parentBatchHeader.postStateRoot.
Estamos orgulhosos de ter ajudado a garantir @morphlayer por meio dessa descoberta. Quando absolutamente precisa ser seguro, Sherlock é a escolha certa.
2,96K