Взлом Nomad
Сегодня мы на примере данного треда разберемся во взломе Nomad с технической стороны
Начнем
Вчера вечером Nomad взломали на 150 миллионов долларов, при том об ошибке было известно давно! Получается, что каждый мог? Давайте разбираться!
Сразу к делу
Ошибка была допущена командой Nomad, а именно в контракте под названием Replica.sol
Пробежавшись взглядом по коду мы можем понять, что в строке 185 у нас идет проверка message на принадлежность acceptableRoot, в ином случае проверка не будет выполнена
К счастью, есть простой способ проверить это. Было известно, что root сообщения, которое не было проверено, будет 0x00, потому что messages[_messageHash] не будет инициализирован. Все, что мне нужно было сделать, это проверить, примет ли контракт это в качестве root
Оказывается, во время обновления команда Nomad инициализировала acceptableRoot как 0x00. Если что, использование нулевых значений в качестве значений инициализации является обычной практикой, но в этом случае у этого действия был крошечный побочный эффект автоматического подтверждения каждого сообщения
Вот почему каждый мог — вам не нужно было знать ни о Solidity, ни о Merkle Trees, ни о чем-то подобном. Все, что вам нужно было сделать, это найти транзакцию, которая сработала, заменить адрес другого человека своим, а затем ретранслировать её
В итоге получается, что обновление пометило нулевой хэш как действительный корень, что позволило подделать сообщения на Nomad. Злоумышленники воспользовались этим для копирования/вставки транзакций и быстро опустошили мост
Так же о данной уязвимости было известно еще около 2 месяцев назад, ведь аудиторская компания, которая проверяла данный контракт, нашла эту уязвимость и указала на нее, но команда Nomad решила ее не исправлять