Ласкаво просимо назад до Sherlock's Vulnerability Spotlight, де ми висвітлюємо вражаючу вразливість, виявлену під час аудиту Шерлока. Цього тижня ми маємо ланцюгову відмову в обслуговуванні (CDoS). Він був виявлений @0xPapaPitufo під час конкурсу L2 @MorphLayer року. 🧵👇
У Rollup.sol, якщо пропонується шкідливий пакет, передбачається, що секвенсор, який його запропонував, програє завдання, отримує скорочення, а ланцюжок буде скинуто. Ці економічні стимули запобігають регулярній зупинці ланцюга. Це ґрунтується на припущенні, що секвенсер може вигравати челенджі лише в тому випадку, якщо запропонована ними партія дійсна.
Однак перевірка того, що prevStateRoot є postStateRoot попередньої партії, відбувається лише в finalizeBatch(). Ця перевірка достатня для запобігання завершенню пакетів із підробленими prevStateRoots, але вона не зупиняє ці пакети від надсилання. Це дозволяє шкідливому секвенсеру пропонувати будь-який пакет, який виконує дійсну транзакцію стану на підробленому prevStateRoot.
У більшості випадків претендент атакує цю недійсну партію. Тим не менш, секвенсор може надати дійсний доказ цього переходу стану, щоб вкрасти депозит чесного претендента і виграти виклик. У випадку, якщо це станеться, або не буде виконано жодного виклику, зобов'язана партія не зможе бути доопрацьована через наступну перевірку: Це заморозить ланцюжок і не дозволить доопрацювати нові партії, оскільки партії здійснюються послідовно і повинні допрацьовуватися послідовно.
Шлях атаки: 1) Зловмисник пропонує пакет, який містить дійсний перехід стану від фальшивого prevStateRoot. 2) Якщо чесний претендент кидає виклик партії, зловмисник надає дійсний доказ переходу стану, щоб виграти челендж і вкрасти депозит претендента. 3) Незалежно від того, чи станеться вищезазначене, ланцюг тепер зупиняється, оскільки партія зловмисника не може бути завершена, і жодні інші партії не можуть бути завершені без її попереднього завершення. 4) Нападник не буде порізаний, тому що він виграв челендж.
Які наслідки? Чесний челендж, який втратить свій депозит, коли нечесний секвенсер переможе його в челенджі, і жодні нові партії не зможуть бути доопрацьовані, викликаючи відмову в обслуговуванні ланцюга, і їх доведеться вручну відкочувати адміністраторам.
Пом'якшення наслідків: Перевірте в commitBatch(), що prevStateRoot дорівнює parentBatchHeader.postStateRoot.
Ми пишаємося тим, що допомогли убезпечити @morphlayer завдяки цьому відкриттю. Коли це конче потрібно убезпечити, Шерлок – правильний вибір.
2,96K