Согласно отчету компании Verichains, занимающейся безопасностью блокчейнов, эксплойт моста Ronin стоимостью 10 миллионов долларов, произошедший 6 августа, был вызван ошибочным сценарием развертывания обновления.
Обновление снизило порог голосования для валидаторов до нуля, по сути позволяя любому пользователю выйти из моста «без подписи», заявили в Verichains.
Позже владелец бота вернул большую часть средств команде Ronin.
Анализ Verichains обнажает риски, которым подвергаются пользователи, взаимодействуя с обновляемыми смарт-контрактами. Протокол мог бы потерять всю сумму, если бы злоумышленник заплатил больше за газ и, следовательно, избежал лидера.
Ronin — это блокчейн-сеть, предназначенная для размещения игр Web3. Она наиболее известна тем, что является домом для Axie Infinity, игры по разведению монстров, в которой, по утверждениям, на пике популярности в 2022 году было более 2 миллионов игроков. Игроки в Ronin используют мост для перевода средств между Ethereum и Ronin.
Согласно отчету Verichains, мост использует переменную mimimumVoteWeight, чтобы пользователи не могли выводить средства, которые им не принадлежат. Каждая транзакция должна быть авторизована минимальным количеством валидаторов, заданным этой переменной. При вычислении minVoteWeight в качестве входных данных используется другая переменная totalWeight.
TotalWeight в предыдущей версии Ronin. Источник: Verichains.
В более ранних версиях моста totalWeight существовал в отдельном контракте под названием MainchainBridgeManager. Когда разработчики создавали новое обновление, они хотели переместить эту переменную в собственную внутреннюю память моста, а не оставлять ее в другом контракте. Это означало, что им нужно было инициализировать переменную в момент развертывания, установив для TotalWeight значение, которое было в предыдущей версии.
К сожалению, именно здесь обновление пошло не так. По словам Verichains, разработчики Ronin написали несколько разных функций «инициализации», которые должны были вызываться в момент развертывания. Каждая из этих функций имела свой номер версии. Третья версия содержала важнейшую инициализацию totalWeight. Но когда разработчики написали сценарий развертывания, они вызвали только версию 4, оставив totalWeight с нулевым значением по умолчанию.
Источник: Verichains.
После этого обновления пользователям больше не нужно было отправлять подписи валидаторам, чтобы доказать свое право на отзыв. Они могли отказаться «без подписи», поскольку «она соответствовала условию минимального веса голоса (которое было равно 0 из-за неинициализации)».
В сообщении X от 7 августа аудитор смарт-контрактов Composable Security Дамиан Русинек подробно рассказал о том, что позволило произойти атаке. По словам Русинека, злоумышленник предоставил подпись с адреса, заканчивающегося на B849f. Однако этого адреса «не было в списке операторов моста». Ему не обязательно было быть в списке операторов моста, потому что «минимальное количество голосов операторов было 0». Следовательно, «требовалась только ОДНА подпись, и это могла быть ЛЮБАЯ действительная подпись».
Команда Ronin не вдавался в такие подробности, как Verichains или Русинек, но тоже подтвердила в сообщении X от 6 августа, что эксплойт был вызван тем, что обновление «ввело проблему, приводящую к тому, что мост неверно истолковал требуемый порог голосования операторов моста для вывода средств».
Данные блокчейна показывают , что эту атакующую транзакцию возглавлял бот MEV под названием «Frontrunner Yoink», который успешно слил с моста криптовалюту на сумму более 10 миллионов долларов. По словам Русинека, бот, скорее всего, «имитировал смену адреса и суммы и использовал собственную подпись». Затем он отправил транзакцию, как только моделирование доказало, что эксплойт сработает.
Владелец Frontrunner Yoink вернул большую часть средств в тот же день, а команда Ronin объявила, что разрешит ему оставить себе сумму в 500 000 долларов в качестве награды за обнаружение ошибок.
Пользователи Ronin пострадали от эксплойта 6 августа. К счастью, атаку возглавил бот MEV, владельцем которого был честный оператор - белый хакер. Однако тот факт, что атака была так близка к успеху, обнажает рискованную природу модернизируемых кроссчейн-мостов.
Некоторые сети утверждают, что эта проблема будет устранена, когда уровень 2 Ethereum достигнет «этапа 2», а все обновления будут отложены как минимум на семь дней после запуска. Однако критики утверждают, что процесс достижения этой стадии занимает слишком много времени и может никогда не завершиться.