August 2, 2022

Взлом Nomad

Всем привет! С вами Тёма!

Сегодня мы на примере данного треда разберемся во взломе Nomad с технической стороны

Начнем

Вчера вечером Nomad взломали на 150 миллионов долларов, при том об ошибке было известно давно! Получается, что каждый мог? Давайте разбираться!

Сразу к делу

Ошибка была допущена командой Nomad, а именно в контракте под названием Replica.sol

Пробежавшись взглядом по коду мы можем понять, что в строке 185 у нас идет проверка message на принадлежность acceptableRoot, в ином случае проверка не будет выполнена

К счастью, есть простой способ проверить это. Было известно, что root сообщения, которое не было проверено, будет 0x00, потому что messages[_messageHash] не будет инициализирован. Все, что мне нужно было сделать, это проверить, примет ли контракт это в качестве root

Оп, интересненько

Оказывается, во время обновления команда Nomad инициализировала acceptableRoot как 0x00. Если что, использование нулевых значений в качестве значений инициализации является обычной практикой, но в этом случае у этого действия был крошечный побочный эффект автоматического подтверждения каждого сообщения

Вот почему каждый мог — вам не нужно было знать ни о Solidity, ни о Merkle Trees, ни о чем-то подобном. Все, что вам нужно было сделать, это найти транзакцию, которая сработала, заменить адрес другого человека своим, а затем ретранслировать её

В итоге получается, что обновление пометило нулевой хэш как действительный корень, что позволило подделать сообщения на Nomad. Злоумышленники воспользовались этим для копирования/вставки транзакций и быстро опустошили мост

Так же о данной уязвимости было известно еще около 2 месяцев назад, ведь аудиторская компания, которая проверяла данный контракт, нашла эту уязвимость и указала на нее, но команда Nomad решила ее не исправлять

Надеюсь статья была интересной и понятной!

Все мои ресурсы - https://t.me/ortomich_links