Selamat datang kembali di Sorotan Kerentanan Sherlock, di mana kami menyoroti kerentanan berdampak yang terungkap selama audit Sherlock. Minggu ini, kami memiliki Chain Denial of Service (CDoS). Itu ditemukan oleh @0xPapaPitufo selama kontes @MorphLayer L2. 🧵👇
Di Rollup.sol, jika batch berbahaya diusulkan, asumsinya adalah bahwa sequencer yang mengusulkannya akan kalah dalam tantangan, dipotong, dan rantai akan diatur ulang. Insentif ekonomi ini mencegah rantai dihentikan secara teratur. Ini didasarkan pada asumsi bahwa sequencer hanya dapat memenangkan tantangan jika batch yang mereka usulkan valid.
Namun, pemeriksaan bahwa prevStateRoot adalah postStateRoot dari batch sebelumnya hanya terjadi di finalizeBatch(). Pemeriksaan ini cukup untuk mencegah batch dengan prevStateRoots palsu diselesaikan, tetapi tidak menghentikan batch ini untuk dilakukan. Hal ini memungkinkan sequencer berbahaya untuk mengusulkan batch apa pun yang melakukan transaksi status yang valid pada prevStateRoot palsu.
Dalam kebanyakan kasus, penantang akan menyerang batch yang tidak valid ini. Namun, sequencer dapat memberikan bukti yang valid dari transisi keadaan ini untuk mencuri deposit penantang yang jujur dan memenangkan tantangan. Jika ini terjadi, atau tidak ada tantangan yang dilakukan, batch yang dikomitkan tidak akan dapat diselesaikan karena pemeriksaan berikut: Ini akan membekukan rantai dan tidak mengizinkan batch baru untuk diselesaikan, karena batch dilakukan secara berurutan dan harus diselesaikan secara berurutan.
Jalur Serangan: 1) Penyerang mengusulkan batch yang berisi transisi status yang valid dari prevStateRoot palsu. 2) Jika penantang yang jujur menantang batch, penyerang memberikan bukti yang valid tentang transisi negara untuk memenangkan tantangan dan mencuri deposit penantang. 3) Apakah hal di atas terjadi atau tidak, rantai sekarang dihentikan, karena batch penyerang tidak dapat diselesaikan, dan tidak ada batch lain yang dapat diselesaikan tanpa diselesaikan terlebih dahulu. 4) Penyerang tidak akan ditebas, karena mereka memenangkan tantangan.
Apa dampaknya? Tantangan jujur yang akan kehilangan depositnya ketika sequencer yang tidak jujur mengalahkannya dalam tantangan, dan tidak ada batch baru yang dapat diselesaikan, menyebabkan Penolakan Layanan Rantai, dan harus digulirkan kembali secara manual oleh admin.
Mitigasi: Periksa commitBatch() bahwa prevStateRoot sama dengan parentBatchHeader.postStateRoot.
Kami bangga telah membantu mengamankan @morphlayer melalui penemuan ini. Ketika benar-benar perlu aman, Sherlock adalah pilihan yang tepat.
2,78K